Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanek Bevendorff <janek@jbev.net>2019-10-26 22:34:32 +0300
committerJanek Bevendorff <janek@jbev.net>2019-10-26 22:34:32 +0300
commit1ab8a9f42c065bd575490ad7f3fa43ce72a59d8a (patch)
tree06a5119be3a7e3904d26f464a9b3d25e44c818fd
parent5d6ef0c47191f1bd9e8ae296920357aeb74e8fd5 (diff)
parentb3d834acb0b90394747bd5e1fb3ba4feeca57a94 (diff)
Release 2.5.02.5.0
Added - Add 'Paper Backup' aka 'Export to HTML file' to the 'Database' menu [[#3277](https://github.com/keepassxreboot/keepassxc/pull/3277)] - Add statistics panel with information about the database (number of entries, number of unique passwords, etc.) to the Database Settings dialog [[#2034](https://github.com/keepassxreboot/keepassxc/issues/2034)] - Add offline user manual accessible via the 'Help' menu [[#3274](https://github.com/keepassxreboot/keepassxc/issues/3274)] - Add support for importing 1Password OpVault files [[#2292](https://github.com/keepassxreboot/keepassxc/issues/2292)] - Implement Freedesktop.org secret storage DBus protocol so that KeePassXC can be used as a vault service by libsecret [[#2726](https://github.com/keepassxreboot/keepassxc/issues/2726)] - Add support for OnlyKey as an alternative to YubiKeys (requires yubikey-personalization >= 1.20.0) [[#3352](https://github.com/keepassxreboot/keepassxc/issues/3352)] - Add group sorting feature [[#3282](https://github.com/keepassxreboot/keepassxc/issues/3282)] - Add feature to download favicons for all entries at once [[#3169](https://github.com/keepassxreboot/keepassxc/issues/3169)] - Add word case option to passphrase generator [[#3172](https://github.com/keepassxreboot/keepassxc/issues/3172)] - Add support for RFC6238-compliant TOTP hashes [[#2972](https://github.com/keepassxreboot/keepassxc/issues/2972)] - Add UNIX man page for main program [[#3665](https://github.com/keepassxreboot/keepassxc/issues/3665)] - Add 'Monospaced font' option to the notes field [[#3321](https://github.com/keepassxreboot/keepassxc/issues/3321)] - Add support for key files in auto open [[#3504](https://github.com/keepassxreboot/keepassxc/issues/3504)] - Add search field for filtering entries in Auto-Type dialog [[#2955](https://github.com/keepassxreboot/keepassxc/issues/2955)] - Complete usernames based on known usernames from other entries [[#3300](https://github.com/keepassxreboot/keepassxc/issues/3300)] - Parse hyperlinks in the notes field of the entry preview pane [[#3596](https://github.com/keepassxreboot/keepassxc/issues/3596)] - Allow abbreviation of field names in entry search [[#3440](https://github.com/keepassxreboot/keepassxc/issues/3440)] - Allow setting group icons recursively [[#3273](https://github.com/keepassxreboot/keepassxc/issues/3273)] - Add copy context menu for username and password in Auto-Type dialog [[#3038](https://github.com/keepassxreboot/keepassxc/issues/3038)] - Drop to background after copying a password to the clipboard [[#3253](https://github.com/keepassxreboot/keepassxc/issues/3253)] - Add 'Lock databases' entry to tray icon menu [[#2896](https://github.com/keepassxreboot/keepassxc/issues/2896)] - Add option to minimize window after unlocking [[#3439](https://github.com/keepassxreboot/keepassxc/issues/3439)] - Add option to minimize window after opening a URL [[#3302](https://github.com/keepassxreboot/keepassxc/issues/3302)] - Request accessibility permissions for Auto-Type on macOS [[#3624](https://github.com/keepassxreboot/keepassxc/issues/3624)] - Browser: Add initial support for multiple URLs [[#3558](https://github.com/keepassxreboot/keepassxc/issues/3558)] - Browser: Add entry-specific browser integration settings [[#3444](https://github.com/keepassxreboot/keepassxc/issues/3444)] - CLI: Add offline HIBP checker (requires a downloaded HIBP dump) [[#2707](https://github.com/keepassxreboot/keepassxc/issues/2707)] - CLI: Add 'flatten' option to the 'ls' command [[#3276](https://github.com/keepassxreboot/keepassxc/issues/3276)] - CLI: Add password generation options to `Add` and `Edit` commands [[#3275](https://github.com/keepassxreboot/keepassxc/issues/3275)] - CLI: Add XML import [[#3572](https://github.com/keepassxreboot/keepassxc/issues/3572)] - CLI: Add CSV export to the 'export' command [[#3278](https://github.com/keepassxreboot/keepassxc/issues/3278)] - CLI: Add `-y --yubikey` option for YubiKey [[#3416](https://github.com/keepassxreboot/keepassxc/issues/3416)] - CLI: Add `--dry-run` option for merging databases [[#3254](https://github.com/keepassxreboot/keepassxc/issues/3254)] - CLI: Add group commands (mv, mkdir and rmdir) [[#3313](https://github.com/keepassxreboot/keepassxc/issues/3313)]. - CLI: Add interactive shell mode command `open` [[#3224](https://github.com/keepassxreboot/keepassxc/issues/3224)] Changed - Redesign database unlock dialog [ [#3287](https://github.com/keepassxreboot/keepassxc/issues/3287)] - Rework the entry preview panel [ [#3306](https://github.com/keepassxreboot/keepassxc/issues/3306)] - Move notes to General tab on Group Preview Panel [[#3336](https://github.com/keepassxreboot/keepassxc/issues/3336)] - Enable entry actions when editing an entry and cleanup entry context menu [[#3641](https://github.com/keepassxreboot/keepassxc/issues/3641)] - Improve detection of external database changes [[#2389](https://github.com/keepassxreboot/keepassxc/issues/2389)] - Warn if user is trying to use a KDBX file as a key file [[#3625](https://github.com/keepassxreboot/keepassxc/issues/3625)] - Add option to disable KeePassHTTP settings migrations prompt [[#3349](https://github.com/keepassxreboot/keepassxc/issues/3349), [#3344](https://github.com/keepassxreboot/keepassxc/issues/3344)] - Re-enabled Wayland support (no Auto-Type yet) [[#3520](https://github.com/keepassxreboot/keepassxc/issues/3520), [#3341](https://github.com/keepassxreboot/keepassxc/issues/3341)] - Add icon to 'Toggle Window' action in tray icon menu [[3244](https://github.com/keepassxreboot/keepassxc/issues/3244)] - Merge custom data between databases only when necessary [[#3475](https://github.com/keepassxreboot/keepassxc/issues/3475)] - Improve various file-handling related issues when picking files using the system's file dialog [[#3473](https://github.com/keepassxreboot/keepassxc/issues/3473)] - Add 'New Entry' context menu when no entries are selected [[#3671](https://github.com/keepassxreboot/keepassxc/issues/3671)] - Reduce default Argon2 settings from 128 MiB and one thread per CPU core to 64 MiB and two threads to account for lower-spec mobile hardware [ [#3672](https://github.com/keepassxreboot/keepassxc/issues/3672)] - Browser: Remove unused 'Remember' checkbox for HTTP Basic Auth [[#3371](https://github.com/keepassxreboot/keepassxc/issues/3371)] - Browser: Show database name when pairing with a new browser [[#3638](https://github.com/keepassxreboot/keepassxc/issues/3638)] - Browser: Show URL in allow access dialog [[#3639](https://github.com/keepassxreboot/keepassxc/issues/3639)] - CLI: The password length option `-l` for the CLI commands `Add` and `Edit` is now `-L` [[#3275](https://github.com/keepassxreboot/keepassxc/issues/3275)] - CLI: The `-u` shorthand for the `--upper` password generation option has been renamed to `-U` [[#3275](https://github.com/keepassxreboot/keepassxc/issues/3275)] - CLI: Rename command `extract` to `export`. [[#3277](https://github.com/keepassxreboot/keepassxc/issues/3277)] Fixed - Improve accessibility for assistive technologies [[#3409](https://github.com/keepassxreboot/keepassxc/issues/3409)] - Correctly unlock all databases if `--pw-stdin` is provided [[#2916](https://github.com/keepassxreboot/keepassxc/issues/2916)] - Fix password generator issues with special characters [[#3303](https://github.com/keepassxreboot/keepassxc/issues/3303)] - Fix KeePassXC interrupting shutdown procedure [[#3666](https://github.com/keepassxreboot/keepassxc/issues/3666)] - Fix password visibility toggle button state on unlock dialog [[#3312](https://github.com/keepassxreboot/keepassxc/issues/3312)] - Fix potential data loss if database is reloaded while user is editing an entry [[#3656](https://github.com/keepassxreboot/keepassxc/issues/3656)] - Fix hard-coded background color in search help popup [[#3001](https://github.com/keepassxreboot/keepassxc/issues/3001)] - Fix font choice for password preview [[#3425](https://github.com/keepassxreboot/keepassxc/issues/3425)] - Fix handling of read-only files when autosave is enabled [[#3408](https://github.com/keepassxreboot/keepassxc/issues/3408)] - Handle symlinks correctly when atomic saves are disabled [[#3463](https://github.com/keepassxreboot/keepassxc/issues/3463)] - Enable HighDPI icon scaling on Linux [[#3332](https://github.com/keepassxreboot/keepassxc/issues/3332)] - Make Auto-Type on macOS more robust and remove old Carbon API calls [[#3634](https://github.com/keepassxreboot/keepassxc/issues/3634), [[#3347](https://github.com/keepassxreboot/keepassxc/issues/3347))] - Hide Share tab if KeePassXC is compiled without KeeShare support and other minor KeeShare improvements [[#3654](https://github.com/keepassxreboot/keepassxc/issues/3654), [[#3291](https://github.com/keepassxreboot/keepassxc/issues/3291), [#3029](https://github.com/keepassxreboot/keepassxc/issues/3029), [#3031](https://github.com/keepassxreboot/keepassxc/issues/3031), [#3236](https://github.com/keepassxreboot/keepassxc/issues/3236)] - Correctly bring window to the front when clicking tray icon on macOS [[#3576](https://github.com/keepassxreboot/keepassxc/issues/3576)] - Correct application shortcut created by MSI Installer on Windows [[#3296](https://github.com/keepassxreboot/keepassxc/issues/3296)] - Fix crash when removing custom data [[#3508](https://github.com/keepassxreboot/keepassxc/issues/3508)] - Fix placeholder resolution in URLs [[#3281](https://github.com/keepassxreboot/keepassxc/issues/3281)] - Fix various inconsistencies and platform-dependent compilation bugs [[#3664](https://github.com/keepassxreboot/keepassxc/issues/3664), [#3662](https://github.com/keepassxreboot/keepassxc/issues/3662), [#3660](https://github.com/keepassxreboot/keepassxc/issues/3660), [#3655](https://github.com/keepassxreboot/keepassxc/issues/3655), [#3649](https://github.com/keepassxreboot/keepassxc/issues/3649), [#3417](https://github.com/keepassxreboot/keepassxc/issues/3417), [#3357](https://github.com/keepassxreboot/keepassxc/issues/3357), [#3319](https://github.com/keepassxreboot/keepassxc/issues/3319), [#3318](https://github.com/keepassxreboot/keepassxc/issues/3318), [#3304](https://github.com/keepassxreboot/keepassxc/issues/3304)] - Browser: Fix potential leaking of entries through the browser integration API if multiple databases are opened [[#3480](https://github.com/keepassxreboot/keepassxc/issues/3480)] - Browser: Fix password entropy calculation [[#3107](https://github.com/keepassxreboot/keepassxc/issues/3107)] - Browser: Fix Windows registry settings for portable installation [[#3603](https://github.com/keepassxreboot/keepassxc/issues/3603)]
-rw-r--r--.github/CONTRIBUTING.md14
-rw-r--r--CHANGELOG482
-rw-r--r--CHANGELOG.md546
-rw-r--r--CMakeLists.txt33
-rw-r--r--COPYING13
-rw-r--r--INSTALL.md3
-rw-r--r--README.md4
-rw-r--r--cmake/FindReadline.cmake50
-rw-r--r--cmake/GNUInstallDirs.cmake188
-rw-r--r--docs/KEYBINDS.md1
-rw-r--r--docs/QUICKSTART.md124
-rwxr-xr-xrelease-tool16
-rw-r--r--share/CMakeLists.txt2
-rw-r--r--share/demo.kdbxbin0 -> 25109 bytes
-rw-r--r--share/demo.key1
-rw-r--r--share/docs/KeePassXC_GettingStarted.pdfbin0 -> 1409007 bytes
-rw-r--r--share/docs/KeePassXC_UserGuide.pdfbin0 -> 2921944 bytes
-rw-r--r--share/docs/man/keepassxc-cli.1251
-rw-r--r--share/docs/man/keepassxc.139
-rw-r--r--share/icons/application/16x16/actions/database-lock.png (renamed from share/icons/application/16x16/actions/document-encrypt.png)bin454 -> 454 bytes
-rw-r--r--share/icons/application/22x22/actions/database-lock.png (renamed from share/icons/application/22x22/actions/document-encrypt.png)bin583 -> 583 bytes
-rw-r--r--share/icons/application/32x32/actions/database-lock.png (renamed from share/icons/application/32x32/actions/document-encrypt.png)bin1090 -> 1090 bytes
-rw-r--r--share/icons/application/32x32/actions/statistics.pngbin0 -> 1323 bytes
-rw-r--r--share/icons/application/scalable/apps/freedesktop.svg92
-rw-r--r--share/keepassxc.ini6
-rw-r--r--share/linux/org.keepassxc.KeePassXC.appdata.xml81
-rw-r--r--share/linux/org.keepassxc.KeePassXC.desktop2
-rw-r--r--share/macosx/keepassxc.entitlements2
-rw-r--r--share/translations/keepassx_ar.ts2197
-rw-r--r--share/translations/keepassx_cs.ts2342
-rw-r--r--share/translations/keepassx_da.ts3673
-rw-r--r--share/translations/keepassx_de.ts2451
-rw-r--r--share/translations/keepassx_en.ts1990
-rw-r--r--share/translations/keepassx_en_GB.ts2293
-rw-r--r--share/translations/keepassx_en_US.ts2304
-rw-r--r--share/translations/keepassx_es.ts2696
-rw-r--r--share/translations/keepassx_fi.ts2361
-rw-r--r--share/translations/keepassx_fr.ts3143
-rw-r--r--share/translations/keepassx_hu.ts2315
-rw-r--r--share/translations/keepassx_id.ts2589
-rw-r--r--share/translations/keepassx_it.ts2677
-rw-r--r--share/translations/keepassx_ja.ts2423
-rw-r--r--share/translations/keepassx_ko.ts2282
-rw-r--r--share/translations/keepassx_lt.ts2267
-rw-r--r--share/translations/keepassx_nb.ts2420
-rw-r--r--share/translations/keepassx_nl_NL.ts2531
-rw-r--r--share/translations/keepassx_pl.ts2364
-rw-r--r--share/translations/keepassx_pt.ts2419
-rw-r--r--share/translations/keepassx_pt_BR.ts2396
-rw-r--r--share/translations/keepassx_pt_PT.ts2364
-rw-r--r--share/translations/keepassx_ro.ts3873
-rw-r--r--share/translations/keepassx_ru.ts2781
-rw-r--r--share/translations/keepassx_sk.ts2560
-rw-r--r--share/translations/keepassx_sv.ts3524
-rw-r--r--share/translations/keepassx_th.ts2938
-rw-r--r--share/translations/keepassx_tr.ts2557
-rw-r--r--share/translations/keepassx_uk.ts2328
-rw-r--r--share/translations/keepassx_zh_CN.ts2492
-rw-r--r--share/translations/keepassx_zh_TW.ts3327
-rw-r--r--share/windows/wix-patch.xml5
-rw-r--r--share/windows/wix-template.xml53
-rw-r--r--snap/snapcraft.yaml2
-rw-r--r--src/CMakeLists.txt39
-rw-r--r--src/autotype/AutoType.cpp8
-rw-r--r--src/autotype/AutoTypeFilterLineEdit.cpp39
-rw-r--r--src/autotype/AutoTypeFilterLineEdit.h42
-rw-r--r--src/autotype/AutoTypeSelectDialog.cpp59
-rw-r--r--src/autotype/AutoTypeSelectDialog.h6
-rw-r--r--src/autotype/mac/AutoTypeMac.cpp605
-rw-r--r--src/autotype/mac/AutoTypeMac.h19
-rw-r--r--src/autotype/mac/AutoTypeMacKeyCodes.h160
-rw-r--r--src/autotype/mac/CMakeLists.txt2
-rw-r--r--src/browser/BrowserAccessControlDialog.cpp5
-rw-r--r--src/browser/BrowserAccessControlDialog.h1
-rwxr-xr-xsrc/browser/BrowserAccessControlDialog.ui6
-rw-r--r--src/browser/BrowserAction.cpp48
-rw-r--r--src/browser/BrowserAction.h2
-rw-r--r--src/browser/BrowserOptionDialog.cpp20
-rwxr-xr-xsrc/browser/BrowserOptionDialog.ui27
-rw-r--r--src/browser/BrowserService.cpp210
-rw-r--r--src/browser/BrowserService.h36
-rw-r--r--src/browser/BrowserSettings.cpp28
-rw-r--r--src/browser/BrowserSettings.h4
-rw-r--r--src/browser/HostInstaller.cpp32
-rw-r--r--src/browser/NativeMessagingBase.cpp2
-rw-r--r--src/browser/NativeMessagingBase.h4
-rw-r--r--src/browser/NativeMessagingHost.cpp14
-rw-r--r--src/cli/Add.cpp146
-rw-r--r--src/cli/Add.h16
-rw-r--r--src/cli/AddGroup.cpp79
-rw-r--r--src/cli/AddGroup.h32
-rw-r--r--src/cli/Analyze.cpp82
-rw-r--r--src/cli/Analyze.h35
-rw-r--r--src/cli/CMakeLists.txt31
-rw-r--r--src/cli/Clip.cpp72
-rw-r--r--src/cli/Clip.h17
-rw-r--r--src/cli/Close.cpp38
-rw-r--r--src/cli/Close.h (renamed from src/cli/Extract.h)15
-rw-r--r--src/cli/Command.cpp300
-rw-r--r--src/cli/Command.h32
-rw-r--r--src/cli/Create.cpp60
-rw-r--r--src/cli/Create.h6
-rw-r--r--src/cli/DatabaseCommand.cpp68
-rw-r--r--src/cli/DatabaseCommand.h35
-rw-r--r--src/cli/Diceware.cpp68
-rw-r--r--src/cli/Diceware.h7
-rw-r--r--src/cli/Edit.cpp159
-rw-r--r--src/cli/Edit.h11
-rw-r--r--src/cli/Estimate.cpp39
-rw-r--r--src/cli/Estimate.h5
-rw-r--r--src/cli/Exit.cpp35
-rw-r--r--src/cli/Exit.h33
-rw-r--r--src/cli/Export.cpp64
-rw-r--r--src/cli/Export.h33
-rw-r--r--src/cli/Extract.cpp128
-rw-r--r--src/cli/Generate.cpp166
-rw-r--r--src/cli/Generate.h17
-rw-r--r--src/cli/Help.cpp43
-rw-r--r--src/cli/Help.h31
-rw-r--r--src/cli/Import.cpp100
-rw-r--r--src/cli/Import.h30
-rw-r--r--src/cli/List.cpp77
-rw-r--r--src/cli/List.h14
-rw-r--r--src/cli/Locate.cpp43
-rw-r--r--src/cli/Locate.h11
-rw-r--r--src/cli/Merge.cpp121
-rw-r--r--src/cli/Merge.h16
-rw-r--r--src/cli/Move.cpp80
-rw-r--r--src/cli/Move.h32
-rw-r--r--src/cli/Open.cpp43
-rw-r--r--src/cli/Open.h31
-rw-r--r--src/cli/Remove.cpp48
-rw-r--r--src/cli/Remove.h11
-rw-r--r--src/cli/RemoveGroup.cpp84
-rw-r--r--src/cli/RemoveGroup.h32
-rw-r--r--src/cli/Show.cpp77
-rw-r--r--src/cli/Show.h14
-rw-r--r--src/cli/Utils.cpp112
-rw-r--r--src/cli/Utils.h10
-rw-r--r--src/cli/keepassxc-cli.1183
-rw-r--r--src/cli/keepassxc-cli.cpp152
-rw-r--r--src/config-keepassx.h.cmake1
-rw-r--r--src/core/Alloc.cpp7
-rw-r--r--src/core/Bootstrap.cpp2
-rw-r--r--src/core/Config.cpp23
-rw-r--r--src/core/Config.h1
-rw-r--r--src/core/Database.cpp174
-rw-r--r--src/core/Database.h16
-rw-r--r--src/core/Entry.cpp31
-rw-r--r--src/core/Entry.h2
-rw-r--r--src/core/EntrySearcher.cpp51
-rw-r--r--src/core/EntrySearcher.h5
-rw-r--r--src/core/FileWatcher.cpp107
-rw-r--r--src/core/FileWatcher.h23
-rw-r--r--src/core/Group.cpp174
-rw-r--r--src/core/Group.h21
-rw-r--r--src/core/HibpOffline.cpp109
-rw-r--r--src/core/HibpOffline.h36
-rw-r--r--src/core/IconDownloader.cpp204
-rw-r--r--src/core/IconDownloader.h63
-rw-r--r--src/core/Merger.cpp30
-rw-r--r--src/core/Merger.h2
-rw-r--r--src/core/NetworkManager.cpp33
-rw-r--r--src/core/NetworkManager.h34
-rw-r--r--src/core/OSEventFilter.cpp12
-rw-r--r--src/core/PassphraseGenerator.cpp45
-rw-r--r--src/core/PassphraseGenerator.h11
-rw-r--r--src/core/PasswordGenerator.cpp2
-rw-r--r--src/core/PasswordGenerator.h2
-rw-r--r--src/core/Tools.cpp5
-rw-r--r--src/core/Translator.cpp105
-rw-r--r--src/core/Translator.h6
-rw-r--r--src/crypto/SymmetricCipher.cpp2
-rw-r--r--src/fdosecrets/CMakeLists.txt36
-rw-r--r--src/fdosecrets/DatabaseSettingsPageFdoSecrets.cpp49
-rw-r--r--src/fdosecrets/DatabaseSettingsPageFdoSecrets.h36
-rw-r--r--src/fdosecrets/FdoSecretsPlugin.cpp88
-rw-r--r--src/fdosecrets/FdoSecretsPlugin.h76
-rw-r--r--src/fdosecrets/FdoSecretsSettings.cpp103
-rw-r--r--src/fdosecrets/FdoSecretsSettings.h62
-rw-r--r--src/fdosecrets/GcryptMPI.cpp63
-rw-r--r--src/fdosecrets/GcryptMPI.h64
-rw-r--r--src/fdosecrets/README.md42
-rw-r--r--src/fdosecrets/objects/Collection.cpp654
-rw-r--r--src/fdosecrets/objects/Collection.h152
-rw-r--r--src/fdosecrets/objects/DBusObject.cpp64
-rw-r--r--src/fdosecrets/objects/DBusObject.h178
-rw-r--r--src/fdosecrets/objects/DBusReturn.cpp18
-rw-r--r--src/fdosecrets/objects/DBusReturn.h246
-rw-r--r--src/fdosecrets/objects/DBusTypes.cpp43
-rw-r--r--src/fdosecrets/objects/DBusTypes.h91
-rw-r--r--src/fdosecrets/objects/Item.cpp420
-rw-r--r--src/fdosecrets/objects/Item.h113
-rw-r--r--src/fdosecrets/objects/Prompt.cpp238
-rw-r--r--src/fdosecrets/objects/Prompt.h121
-rw-r--r--src/fdosecrets/objects/Service.cpp479
-rw-r--r--src/fdosecrets/objects/Service.h154
-rw-r--r--src/fdosecrets/objects/Session.cpp105
-rw-r--r--src/fdosecrets/objects/Session.h91
-rw-r--r--src/fdosecrets/objects/SessionCipher.cpp224
-rw-r--r--src/fdosecrets/objects/SessionCipher.h128
-rw-r--r--src/fdosecrets/objects/adaptors/CollectionAdaptor.cpp89
-rw-r--r--src/fdosecrets/objects/adaptors/CollectionAdaptor.h71
-rw-r--r--src/fdosecrets/objects/adaptors/DBusAdaptor.h51
-rw-r--r--src/fdosecrets/objects/adaptors/ItemAdaptor.cpp83
-rw-r--r--src/fdosecrets/objects/adaptors/ItemAdaptor.h62
-rw-r--r--src/fdosecrets/objects/adaptors/PromptAdaptor.cpp47
-rw-r--r--src/fdosecrets/objects/adaptors/PromptAdaptor.h46
-rw-r--r--src/fdosecrets/objects/adaptors/ServiceAdaptor.cpp137
-rw-r--r--src/fdosecrets/objects/adaptors/ServiceAdaptor.h71
-rw-r--r--src/fdosecrets/objects/adaptors/SessionAdaptor.cpp35
-rw-r--r--src/fdosecrets/objects/adaptors/SessionAdaptor.h42
-rw-r--r--src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.cpp173
-rw-r--r--src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.h53
-rw-r--r--src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.ui110
-rw-r--r--src/fdosecrets/widgets/SettingsWidgetFdoSecrets.cpp320
-rw-r--r--src/fdosecrets/widgets/SettingsWidgetFdoSecrets.h76
-rw-r--r--src/fdosecrets/widgets/SettingsWidgetFdoSecrets.ui162
-rw-r--r--src/format/CsvExporter.cpp48
-rw-r--r--src/format/CsvExporter.h4
-rw-r--r--src/format/HtmlExporter.cpp253
-rw-r--r--src/format/HtmlExporter.h41
-rw-r--r--src/format/Kdbx3Writer.cpp9
-rw-r--r--src/format/Kdbx3Writer.h1
-rw-r--r--src/format/Kdbx4Writer.cpp9
-rw-r--r--src/format/Kdbx4Writer.h1
-rw-r--r--src/format/KdbxReader.cpp43
-rw-r--r--src/format/KdbxReader.h8
-rw-r--r--src/format/KdbxWriter.cpp14
-rw-r--r--src/format/KdbxWriter.h7
-rw-r--r--src/format/KeePass2Reader.cpp11
-rw-r--r--src/format/KeePass2Reader.h4
-rw-r--r--src/format/KeePass2Writer.cpp17
-rw-r--r--src/format/KeePass2Writer.h1
-rw-r--r--src/format/OpData01.cpp137
-rw-r--r--src/format/OpData01.h59
-rw-r--r--src/format/OpVaultReader.cpp478
-rw-r--r--src/format/OpVaultReader.h119
-rw-r--r--src/format/OpVaultReaderAttachments.cpp250
-rw-r--r--src/format/OpVaultReaderBandEntry.cpp266
-rw-r--r--src/format/OpVaultReaderSections.cpp136
-rw-r--r--src/gui/AboutDialog.cpp162
-rw-r--r--src/gui/ApplicationSettingsWidget.cpp114
-rw-r--r--src/gui/ApplicationSettingsWidget.h5
-rw-r--r--src/gui/ApplicationSettingsWidgetGeneral.ui251
-rw-r--r--src/gui/ApplicationSettingsWidgetSecurity.ui108
-rw-r--r--src/gui/DatabaseOpenWidget.cpp146
-rw-r--r--src/gui/DatabaseOpenWidget.h9
-rw-r--r--src/gui/DatabaseOpenWidget.ui680
-rw-r--r--src/gui/DatabaseTabWidget.cpp80
-rw-r--r--src/gui/DatabaseTabWidget.h6
-rw-r--r--src/gui/DatabaseWidget.cpp289
-rw-r--r--src/gui/DatabaseWidget.h28
-rw-r--r--src/gui/EditWidgetIcons.cpp299
-rw-r--r--src/gui/EditWidgetIcons.h38
-rw-r--r--src/gui/EditWidgetIcons.ui48
-rw-r--r--src/gui/EditWidgetProperties.cpp23
-rw-r--r--src/gui/EditWidgetProperties.ui18
-rw-r--r--src/gui/EntryPreviewWidget.cpp128
-rw-r--r--src/gui/EntryPreviewWidget.h9
-rw-r--r--src/gui/EntryPreviewWidget.ui2086
-rw-r--r--src/gui/FileDialog.cpp151
-rw-r--r--src/gui/FileDialog.h24
-rw-r--r--src/gui/Font.cpp5
-rw-r--r--src/gui/Font.h1
-rw-r--r--src/gui/IconDownloaderDialog.cpp198
-rw-r--r--src/gui/IconDownloaderDialog.h69
-rw-r--r--src/gui/IconDownloaderDialog.ui154
-rw-r--r--src/gui/KMessageWidget.cpp68
-rw-r--r--src/gui/KeePass1OpenWidget.cpp6
-rw-r--r--src/gui/MainWindow.cpp222
-rw-r--r--src/gui/MainWindow.h33
-rw-r--r--src/gui/MainWindow.ui134
-rw-r--r--src/gui/MessageBox.cpp67
-rw-r--r--src/gui/MessageBox.h47
-rw-r--r--src/gui/OpVaultOpenWidget.cpp54
-rw-r--r--src/gui/OpVaultOpenWidget.h34
-rw-r--r--src/gui/PasswordEdit.cpp30
-rw-r--r--src/gui/PasswordEdit.h3
-rw-r--r--src/gui/PasswordGeneratorWidget.cpp30
-rw-r--r--src/gui/PasswordGeneratorWidget.h3
-rw-r--r--src/gui/PasswordGeneratorWidget.ui187
-rw-r--r--src/gui/SearchHelpWidget.ui12
-rw-r--r--src/gui/SearchWidget.cpp26
-rw-r--r--src/gui/SearchWidget.h2
-rw-r--r--src/gui/TotpDialog.cpp15
-rw-r--r--src/gui/TotpExportSettingsDialog.cpp21
-rw-r--r--src/gui/TotpSetupDialog.cpp64
-rw-r--r--src/gui/TotpSetupDialog.ui95
-rw-r--r--src/gui/WelcomeWidget.cpp1
-rw-r--r--src/gui/WelcomeWidget.h1
-rw-r--r--src/gui/WelcomeWidget.ui18
-rw-r--r--src/gui/csvImport/CsvImportWidget.ui20
-rw-r--r--src/gui/dbsettings/DatabaseSettingsDialog.cpp12
-rw-r--r--src/gui/dbsettings/DatabaseSettingsPageStatistics.cpp52
-rw-r--r--src/gui/dbsettings/DatabaseSettingsPageStatistics.h35
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidget.cpp6
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidget.h2
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp12
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetBrowser.ui6
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp6
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetEncryption.ui24
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp25
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetGeneral.ui33
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetMasterKey.cpp29
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.ui12
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetStatistics.cpp215
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetStatistics.h51
-rw-r--r--src/gui/dbsettings/DatabaseSettingsWidgetStatistics.ui79
-rw-r--r--src/gui/entry/AutoTypeMatchView.cpp29
-rw-r--r--src/gui/entry/AutoTypeMatchView.h3
-rw-r--r--src/gui/entry/EditEntryWidget.cpp209
-rw-r--r--src/gui/entry/EditEntryWidget.h27
-rw-r--r--src/gui/entry/EditEntryWidgetAdvanced.ui35
-rw-r--r--src/gui/entry/EditEntryWidgetAutoType.ui37
-rw-r--r--src/gui/entry/EditEntryWidgetBrowser.ui140
-rw-r--r--src/gui/entry/EditEntryWidgetHistory.ui27
-rw-r--r--src/gui/entry/EditEntryWidgetMain.ui81
-rw-r--r--src/gui/entry/EditEntryWidgetSSHAgent.ui34
-rw-r--r--src/gui/entry/EntryAttachmentsWidget.ui26
-rw-r--r--src/gui/entry/EntryURLModel.cpp120
-rw-r--r--src/gui/entry/EntryURLModel.h46
-rw-r--r--src/gui/entry/EntryView.cpp15
-rw-r--r--src/gui/entry/EntryView.h1
-rw-r--r--src/gui/group/EditGroupWidget.cpp19
-rw-r--r--src/gui/group/EditGroupWidgetMain.ui33
-rw-r--r--src/gui/group/GroupModel.cpp27
-rw-r--r--src/gui/group/GroupModel.h2
-rw-r--r--src/gui/group/GroupView.cpp19
-rw-r--r--src/gui/group/GroupView.h2
-rw-r--r--src/gui/macutils/AppKit.h7
-rw-r--r--src/gui/macutils/AppKitImpl.h8
-rw-r--r--src/gui/macutils/AppKitImpl.mm76
-rw-r--r--src/gui/macutils/MacUtils.cpp15
-rw-r--r--src/gui/macutils/MacUtils.h3
-rw-r--r--src/gui/masterkey/KeyComponentWidget.h4
-rw-r--r--src/gui/masterkey/KeyFileEditWidget.cpp24
-rw-r--r--src/gui/masterkey/KeyFileEditWidget.h6
-rw-r--r--src/gui/masterkey/KeyFileEditWidget.ui28
-rw-r--r--src/gui/masterkey/PasswordEditWidget.cpp3
-rw-r--r--src/gui/masterkey/PasswordEditWidget.ui15
-rw-r--r--src/gui/masterkey/YubiKeyEditWidget.ui6
-rw-r--r--src/keeshare/CMakeLists.txt2
-rw-r--r--src/keeshare/KeeShare.cpp21
-rw-r--r--src/keeshare/KeeShare.h7
-rw-r--r--src/keeshare/SettingsWidgetKeeShare.cpp4
-rw-r--r--src/keeshare/SettingsWidgetKeeShare.ui67
-rw-r--r--src/keeshare/ShareExport.cpp232
-rw-r--r--src/keeshare/ShareExport.h36
-rw-r--r--src/keeshare/ShareImport.cpp351
-rw-r--r--src/keeshare/ShareImport.h33
-rw-r--r--src/keeshare/ShareObserver.cpp599
-rw-r--r--src/keeshare/ShareObserver.h37
-rw-r--r--src/keeshare/group/EditGroupWidgetKeeShare.cpp30
-rw-r--r--src/keeshare/group/EditGroupWidgetKeeShare.ui27
-rw-r--r--src/keys/FileKey.cpp4
-rw-r--r--src/keys/PasswordKey.cpp2
-rw-r--r--src/keys/YkChallengeResponseKey.cpp14
-rw-r--r--src/keys/YkChallengeResponseKeyCLI.cpp71
-rw-r--r--src/keys/YkChallengeResponseKeyCLI.h49
-rw-r--r--src/keys/drivers/YubiKey.cpp83
-rw-r--r--src/keys/drivers/YubiKey.h14
-rw-r--r--src/keys/drivers/YubiKeyStub.cpp5
-rw-r--r--src/main.cpp14
-rw-r--r--src/proxy/NativeMessagingHost.cpp6
-rw-r--r--src/totp/totp.cpp127
-rw-r--r--src/totp/totp.h27
-rw-r--r--src/updatecheck/UpdateChecker.cpp11
-rw-r--r--src/updatecheck/UpdateChecker.h2
-rw-r--r--tests/CMakeLists.txt20
-rw-r--r--tests/TestBrowser.cpp54
-rw-r--r--tests/TestBrowser.h1
-rw-r--r--tests/TestCli.cpp968
-rw-r--r--tests/TestCli.h30
-rw-r--r--tests/TestDatabase.cpp98
-rw-r--r--tests/TestDatabase.h3
-rw-r--r--tests/TestEntry.cpp57
-rw-r--r--tests/TestEntry.h1
-rw-r--r--tests/TestEntrySearcher.cpp53
-rw-r--r--tests/TestEntrySearcher.h1
-rw-r--r--tests/TestFdoSecrets.cpp92
-rw-r--r--tests/TestFdoSecrets.h35
-rw-r--r--tests/TestGroup.cpp373
-rw-r--r--tests/TestGroup.h4
-rw-r--r--tests/TestHibp.cpp125
-rw-r--r--tests/TestHibp.h42
-rw-r--r--tests/TestMerge.cpp28
-rw-r--r--tests/TestMerge.h2
-rw-r--r--tests/TestOpVaultReader.cpp250
-rw-r--r--tests/TestOpVaultReader.h48
-rw-r--r--tests/TestPassphraseGenerator.cpp54
-rw-r--r--tests/TestPassphraseGenerator.h32
-rw-r--r--tests/TestTotp.cpp24
-rw-r--r--tests/TestYkChallengeResponseKey.cpp2
-rw-r--r--tests/data/NewDatabase.kdbxbin11486 -> 15006 bytes
-rw-r--r--tests/data/NewDatabaseBrowser.kdbxbin0 -> 16743 bytes
-rw-r--r--tests/data/YubiKeyProtectedPasswords.kdbxbin0 -> 1653 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault.txt427
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/1C7D72EFA19A4EE98DB7A9661D2F5732_3B94A1F475014E27BFB00C99A42214DF.attachmentbin0 -> 118411 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/2A632FDD32F5445E91EB5636C7580447_8FA293F2B001459D8F8F78C21E6BF9F6.attachmentbin0 -> 66299 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/E0D293D29B10483F8DFDAC72ED0BE5C0_898CD4CD00164930A2E15B159CE65E8F.attachmentbin0 -> 79695 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_23F6167DC1FB457A8DE7033ACDCD06DB.attachmentbin0 -> 98979 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_AFBDA49A5F684179A78161E40CA2AAD3.attachmentbin0 -> 75899 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/FF445AB1497241A28812363154E1A738_16684B74F26145169EC03B950DC68E95.attachmentbin0 -> 283500 bytes
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_0.js1
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_1.js24
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_2.js24
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_3.js25
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_4.js26
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_5.js14
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_6.js13
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_7.js13
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_8.js13
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_A.js1
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_D.js37
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_E.js37
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/band_F.js1
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/folders.js24
-rw-r--r--tests/data/freddy-2013-12-04.opvault/default/profile.js1
-rw-r--r--tests/data/hibp.txt5
-rw-r--r--tests/gui/CMakeLists.txt2
-rw-r--r--tests/gui/TestGui.cpp161
-rw-r--r--tests/gui/TestGui.h4
-rw-r--r--tests/gui/TestGuiBrowser.cpp244
-rw-r--r--tests/gui/TestGuiBrowser.h66
-rw-r--r--tests/util/TemporaryFile.cpp30
-rw-r--r--tests/util/TemporaryFile.h15
-rwxr-xr-xutils/keepassxc-kdewallet (renamed from utils/keepassx-kwallet)16
-rwxr-xr-xutils/keepassxc-keychain29
-rw-r--r--utils/transifex_translators.py79
430 files changed, 88784 insertions, 21418 deletions
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 89c3bb2eb..454b5f500 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -121,11 +121,11 @@ For names made of only one word, the first letter should be lowercase.
For names made of multiple concatenated words, the first letter of the whole is lowercase, and the first letter of each subsequent word is capitalized.
#### Indention
-For **C++ files** (*.cpp .h*): 4 spaces
+For **C++ files** (*.cpp .h*): 4 spaces
For **Qt-UI files** (*.ui*): 2 spaces
#### Includes
-```c
+```cpp
// Class includes
#include "MyWidget.h"
#include "ui_MyWidget.h"
@@ -140,7 +140,7 @@ For **Qt-UI files** (*.ui*): 2 spaces
```
#### Classes
-```c
+```cpp
// Note: order is important, stay organized!
class MyWidget : public QWidget
{
@@ -174,13 +174,13 @@ MyWidget::MyWidget(QWidget* parent)
```
#### Pointers / References
-```c
+```cpp
int* count;
const QString& string;
```
#### Braces
-```c
+```cpp
if (condition) {
doSomething();
} else {
@@ -194,7 +194,7 @@ void ExampleClass::exampleFunction()
```
#### Switch statement
-```c
+```cpp
// Note: avoid declaring variables in a switch statement
switch (a) {
case 1:
@@ -221,6 +221,6 @@ Example: `<widget class="QCheckBox" name="rememberCheckBox">`
-[beginner]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3A%22help+wanted%22+sort%3Acomments-desc
+[beginner]:https://github.com/keepassxreboot/keepassxc/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+sort%3Acomments-desc+
[help-wanted]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+sort%3Acomments-desc
[issues-section]:https://github.com/keepassxreboot/keepassxc/issues
diff --git a/CHANGELOG b/CHANGELOG
deleted file mode 100644
index 4a4c921a2..000000000
--- a/CHANGELOG
+++ /dev/null
@@ -1,482 +0,0 @@
-2.4.3 (2019-06-12)
-=========================
-
-- Fix library loading issues in the Snap and macOS releases [#3247]
-- Fix various keyboard navigation issues [#3248]
-- Fix main window toggling regression when clicking the tray icon on KDE [#3258]
-- Add documentation for keyboard shortcuts to source code distribution [#3215]
-
-2.4.2 (2019-05-31)
-=========================
-
-- Improve resilience against memory attacks - overwrite memory before free [#3020]
-- Prevent infinite save loop when location is unavailable [#3026]
-- Attempt to fix quitting application when shutdown or logout issued [#3199]
-- Support merging database custom data [#3002]
-- Fix opening URL's with non-http schemes [#3153]
-- Fix data loss due to not reading all database attachments if duplicates exist [#3180]
-- Fix entry context menu disabling when using keyboard navigation [#3199]
-- Fix behaviors when canceling an entry edit [#3199]
-- Fix processing of tray icon click and doubleclick [#3112]
-- Update group in preview widget when focused [#3199]
-- Prefer DuckDuckGo service over direct icon download (increases resolution) [#2996]
-- Remove apply button in application settings [#3019]
-- Use winqtdeploy on Windows to correct deployment issues [#3025]
-- Don't mark entry edit as modified when attribute selection changes [#3041]
-- Use console code page CP_UTF8 on Windows if supported [#3050]
-- Snap: Fix locking database with session lock [#3046]
-- Snap: Fix theming across Linux distributions [#3057]
-- Snap: Use SNAP_USER_COMMON and SNAP_USER_DATA directories [#3131]
-- KeeShare: Automatically enable WITH_XC_KEESHARE_SECURE if quazip is found [#3088]
-- macOS: Fix toolbar text when in dark mode [#2998]
-- macOS: Lock database on switching user [#3097]
-- macOS: Fix global Auto-Type when the database is locked [#3138]
-- Browser: Close popups when database is locked [#3093]
-- Browser: Add tests [#3016]
-- Browser: Don't create default group if custom group is enabled [#3127]
-
-2.4.1 (2019-04-12)
-=========================
-
-- Fix database deletion when using unsafe saves to a different file system [#2889]
-- Fix opening databases with legacy key files that contain '/' [#2872]
-- Fix opening database files from the command line [#2919]
-- Fix crash when editing master key [#2836]
-- Fix multiple issues with apply button behavior [#2947]
-- Fix issues on application startup (tab order, --pw-stdin, etc.) [#2830]
-- Fix building without WITH_XC_KEESHARE
-- Fix reference entry coloring on macOS dark mode [#2984]
-- Hide window when performing entry auto-type on macOS [#2969]
-- Improve UX of update checker; reduce checks to every 7 days [#2968]
-- KeeShare improvements [#2946, #2978, #2824]
-- Re-enable Ctrl+C to copy password from search box [#2947]
-- Add KeePassXC-Browser integration for Brave browser [#2933]
-- SSH Agent: Re-Add keys on database unlock [#2982]
-- SSH Agent: Only remove keys on app exit if they are removed on lock [#2985]
-- CLI: Add --no-password option [#2708]
-- CLI: Improve database extraction to XML [#2698]
-- CLI: Don't call mandb on build [#2774]
-- CLI: Add debug info [#2714]
-- Improve support for Snap theming [#2832]
-- Add support for building on Haiku OS [#2859]
-- Ctrl+PgDn now goes to the next tab and Ctrl+PgUp to the previous
-- Fix compiling on GCC 5 / Xenial [#2990]
-- Add .gitrev output to tarball for third-party builds [#2970]
-- Add WITH_XC_UPDATECHECK compile flag to toggle the update checker [#2968]
-
-2.4.0 (2019-03-19)
-=========================
-
-- New Database Wizard [#1952]
-- Advanced Search [#1797]
-- Automatic update checker [#2648]
-- KeeShare database synchronization [#2109, #1992, #2738, #2742, #2746, #2739]
-- Improve favicon fetching; transition to Duck-Duck-Go [#2795, #2011, #2439]
-- Remove KeePassHttp support [#1752]
-- CLI: output info to stderr for easier scripting [#2558]
-- CLI: Add --quiet option [#2507]
-- CLI: Add create command [#2540]
-- CLI: Add recursive listing of entries [#2345]
-- CLI: Fix stdin/stdout encoding on Windows [#2425]
-- SSH Agent: Support OpenSSH for Windows [#1994]
-- macOS: TouchID Quick Unlock [#1851]
-- macOS: Multiple improvements; include CLI in DMG [#2165, #2331, #2583]
-- Linux: Prevent Klipper from storing secrets in clipboard [#1969]
-- Linux: Use polling based file watching for NFS [#2171]
-- Linux: Enable use of browser plugin in Snap build [#2802]
-- TOTP QR Code Generator [#1167]
-- High-DPI Scaling for 4k screens [#2404]
-- Make keyboard shortcuts more consistent [#2431]
-- Warn user if deleting referenced entries [#1744]
-- Allow toolbar to be hidden and repositioned [#1819, #2357]
-- Increase max allowed database timeout to 12 hours [#2173]
-- Password generator uses existing password length by default [#2318]
-- Improve alert message box button labels [#2376]
-- Show message when a database merge makes no changes [#2551]
-- Browser Integration Enhancements [#1497, #2253, #1904, #2232, #1850, #2218, #2391, #2396, #2542, #2622, #2637, #2790]
-- Overall Code Improvements [#2316, #2284, #2351, #2402, #2410, #2419, #2422, #2443, #2491, #2506, #2610, #2667, #2709, #2731]
-
-2.3.4 (2018-08-21)
-=========================
-
-- Show all URL schemes in entry view [#1768]
-- Disable merge when database is locked [#1975]
-- Fix intermittent crashes with favorite icon downloads [#1980]
-- Provide potential crash warning to Qt 5.5.x users [#2211]
-- Disable apply button when creating new entry/group to prevent data loss [#2204]
-- Allow for 12 hour timeout to lock idle database [#2173]
-- Multiple SSH Agent fixes [#1981, #2117]
-- Multiple Browser Integration enhancements [#1993, #2003, #2055, #2116, #2159, #2174, #2185]
-- Fix browser proxy application not closing properly [#2142]
-- Add real names and Patreon supporters to about dialog [#2214]
-- Add settings button to toolbar, Donate button, and Report a Bug button to help menu [#2214]
-- Enhancements to release-tool to appsign intermediate build products [#2101]
-
-
-2.3.3 (2018-05-09)
-=========================
-
-- Fix crash when browser integration is enabled [#1923]
-
-2.3.2 (2018-05-07)
-=========================
-
-- Enable high entropy ASLR on Windows [#1747]
-- Enhance favicon fetching [#1786]
-- Fix crash on Windows due to autotype [#1691]
-- Fix dark tray icon changing all icons [#1680]
-- Fix --pw-stdin not using getPassword function [#1686]
-- Fix placeholders being resolved in notes [#1907]
-- Enable auto-type start delay to be configurable [#1908]
-- Browser: Fix native messaging reply size [#1719]
-- Browser: Increase maximum buffer size [#1720]
-- Browser: Enhance usability and functionality [#1810, #1822, #1830, #1884, #1906]
-- SSH Agent: Parse aes-256-cbc/ctr keys [#1682]
-- SSH Agent: Enhance usability and functionality [#1677, #1679, #1681, #1787]
-
-2.3.1 (2018-03-06)
-=========================
-
-- Fix unnecessary automatic upgrade to KDBX 4.0 and prevent challenge-response key being stripped [#1568]
-- Abort saving and show an error message when challenge-response fails [#1659]
-- Support inner stream protection on all string attributes [#1646]
-- Fix favicon downloads not finishing on some websites [#1657]
-- Fix freeze due to invalid STDIN data [#1628]
-- Correct issue with encrypted RSA SSH keys [#1587]
-- Fix crash on macOS due to QTBUG-54832 [#1607]
-- Show error message if ssh-agent communication fails [#1614]
-- Fix --pw-stdin and filename parameters being ignored [#1608]
-- Fix Auto-Type syntax check not allowing spaces and special characters [#1626]
-- Fix reference placeholders in combination with Auto-Type [#1649]
-- Fix qtbase translations not being loaded [#1611]
-- Fix startup crash on Windows due to missing SVG libraries [#1662]
-- Correct database tab order regression [#1610]
-- Fix GCC 8 compilation error [#1612]
-- Fix copying of advanced attributes on KDE [#1640]
-- Fix member initialization of CategoryListWidgetDelegate [#1613]
-- Fix inconsistent toolbar icon sizes and provide higher-quality icons [#1616]
-- Improve preview panel geometry [#1609]
-
-2.3.0 (2018-02-27)
-=========================
-
-- Add support for KDBX 4.0, Argon2 and ChaCha20 [#148, #1179, #1230, #1494]
-- Add SSH Agent feature [#1098, #1450, #1463]
-- Add preview panel with details of the selected entry [#879, #1338]
-- Add more and configurable columns to entry table and allow copying of values by double click [#1305]
-- Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608]
-- Deprecate KeePassHTTP [#1392]
-- Add support for Steam one-time passwords [#1206]
-- Add support for multiple Auto-Type sequences for a single entry [#1390]
-- Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060]
-- Replace qHttp with cURL for website icon downloads [#1460]
-- Remove lock file [#1231]
-- Add option to create backup file before saving [#1385]
-- Ask to save a generated password before closing the entry password generator [#1499]
-- Resolve placeholders recursively [#1078]
-- Add Auto-Type button to the toolbar [#1056]
-- Improve window focus handling for Auto-Type dialogs [#1204, #1490]
-- Auto-Type dialog and password generator can now be exited with ESC [#1252, #1412]
-- Add optional dark tray icon [#1154]
-- Add new "Unsafe saving" option to work around saving problems with file sync services [#1385]
-- Add IBus support to AppImage and additional image formats to Windows builds [#1534, #1537]
-- Add diceware password generator to CLI [#1406]
-- Add --key-file option to CLI [#816, #824]
-- Add DBus interface for opening and closing KeePassXC databases [#283]
-- Add KDBX compression options to database settings [#1419]
-- Discourage use of old fixed-length key files in favor of arbitrary files [#1326, #1327]
-- Correct reference resolution in entry fields [#1486]
-- Fix window state and recent databases not being remembered on exit [#1453]
-- Correct history item generation when configuring TOTP for an entry [#1446]
-- Correct multiple TOTP bugs [#1414]
-- Automatic saving after every change is now a default [#279]
-- Allow creation of new entries during search [#1398]
-- Correct menu issues on macOS [#1335]
-- Allow compilation on OpenBSD [#1328]
-- Improve entry attachments view [#1139, #1298]
-- Fix auto lock for Gnome and Xfce [#910, #1249]
-- Don't remember key files in file dialogs when the setting is disabled [#1188]
-- Improve database merging and conflict resolution [#807, #1165]
-- Fix macOS pasteboard issues [#1202]
-- Improve startup times on some platforms [#1205]
-- Hide the notes field by default [#1124]
-- Toggle main window by clicking tray icon with the middle mouse button [#992]
-- Fix custom icons not copied over when databases are merged [#1008]
-- Allow use of DEL key to delete entries [#914]
-- Correct intermittent crash due to stale history items [#1527]
-- Sanitize newline characters in title, username and URL fields [#1502]
-- Reopen previously opened databases in correct order [#774]
-- Use system's zxcvbn library if available [#701]
-- Implement various i18n improvements [#690, #875, #1436]
-
-2.2.4 (2017-12-13)
-=========================
-
-- Prevent database corruption when locked [#1219]
-- Fixes apply button not saving new entries [#1141]
-- Switch to Consolas font on Windows for password edit [#1229]
-- Multiple fixes to AppImage deployment [#1115, #1228]
-- Fixes multiple memory leaks [#1213]
-- Resize message close to 16x16 pixels [#1253]
-
-2.2.2 (2017-10-22)
-=========================
-
-- Fixed entries with empty URLs being reported to KeePassHTTP clients [#1031]
-- Fixed YubiKey detection and enabled CLI tool for AppImage binary [#1100]
-- Added AppStream description [#1082]
-- Improved TOTP compatibility and added new Base32 implementation [#1069]
-- Fixed error handling when processing invalid cipher stream [#1099]
-- Fixed double warning display when opening a database [#1037]
-- Fixed unlocking databases with --pw-stdin [#1087]
-- Added ability to override QT_PLUGIN_PATH environment variable for AppImages [#1079]
-- Fixed transform seed not being regenerated when saving the database [#1068]
-- Fixed only one YubiKey slot being polled [#1048]
-- Corrected an issue with entry icons while merging [#1008]
-- Corrected desktop and tray icons in Snap package [#1030]
-- Fixed screen lock and Google fallback settings [#1029]
-
-2.2.1 (2017-10-01)
-=========================
-
-- Corrected multiple snap issues [#934, #1011]
-- Corrected multiple custom icon issues [#708, #719, #994]
-- Corrected multiple Yubikey issues [#880]
-- Fixed single instance preventing load on occasion [#997]
-- Keep entry history when merging databases [#970]
-- Prevent data loss if passwords were mismatched [#1007]
-- Fixed crash after merge [#941]
-- Added configurable auto-type default delay [#703]
-- Unlock database dialog window comes to front [#663]
-- Translation and compiling fixes
-
-2.2.0 (2017-06-23)
-=========================
-
-- Added YubiKey 2FA integration for unlocking databases [#127]
-- Added TOTP support [#519]
-- Added CSV import tool [#146, #490]
-- Added KeePassXC CLI tool [#254]
-- Added diceware password generator [#373]
-- Added support for entry references [#370, #378]
-- Added support for Twofish encryption [#167]
-- Enabled DEP and ASLR for in-memory protection [#371]
-- Enabled single instance mode [#510]
-- Enabled portable mode [#645]
-- Enabled database lock on screensaver and session lock [#545]
-- Redesigned welcome screen with common features and recent databases [#292]
-- Multiple updates to search behavior [#168, #213, #374, #471, #603, #654]
-- Added auto-type fields {CLEARFIELD}, {SPACE}, {{}, {}} [#267, #427, #480]
-- Fixed auto-type errors on Linux [#550]
-- Prompt user prior to executing a cmd:// URL [#235]
-- Entry attributes can be protected (hidden) [#220]
-- Added extended ascii to password generator [#538]
-- Added new database icon to toolbar [#289]
-- Added context menu entry to empty recycle bin in databases [#520]
-- Added "apply" button to entry and group edit windows [#624]
-- Added macOS tray icon and enabled minimize on close [#583]
-- Fixed issues with unclean shutdowns [#170, #580]
-- Changed keyboard shortcut to create new database to CTRL+SHIFT+N [#515]
-- Compare window title to entry URLs [#556]
-- Implemented inline error messages [#162]
-- Ignore group expansion and other minor changes when making database "dirty" [#464]
-- Updated license and copyright information on souce files [#632]
-- Added contributors list to about dialog [#629]
-
-2.1.4 (2017-04-09)
-=========================
-
-- Bumped KeePassHTTP version to 1.8.4.2
-- KeePassHTTP confirmation window comes to foreground [#466]
-
-2.1.3 (2017-03-03)
-=========================
-
-- Fix possible overflow in zxcvbn library [#363]
-- Revert HiDPI setting to avoid problems on laptop screens [#332]
-- Set file meta properties in Windows executable [#330]
-- Suppress error message when auto-reloading a locked database [#345]
-- Improve usability of question dialog when database is already locked by a different instance [#346]
-- Fix compiler warnings in QHttp library [#351]
-- Use unified toolbar on Mac OS X [#361]
-- Fix an issue on X11 where the main window would be raised instead of closed on Alt+F4 [#362]
-
-2.1.2 (2017-02-17)
-=========================
-
-- Ask for save location when creating a new database [#302]
-- Remove Libmicrohttpd dependency to clean up the code and ensure better OS X compatibility [#317, #265]
-- Prevent Qt from degrading Wifi network performance on certain platforms [#318]
-- Visually refine user interface on OS X and other platforms [#299]
-- Remove unusable tray icon setting on OS X [#293]
-- Fix compositing glitches on Ubuntu and prevent flashing when minimizing to the tray at startup [#307]
-- Fix AppImage tray icon on Ubuntu [#277, #273]
-- Fix global menu disappearing after restoring KeePassXC from the tray on Ubuntu [#276]
-- Fix result order in entry search [#320]
-- Enable HiDPI scaling on supported platforms [#315]
-- Remove empty directories from installation target [#282]
-
-2.1.1 (2017-02-06)
-=========================
-
-- Enabled HTTP plugin build; plugin is disabled by default and limited to localhost [#147]
-- Escape HTML in dialog boxes [#247]
-- Corrected crashes in favicon download and password generator [#233, #226]
-- Increase font size of password meter [#228]
-- Fixed compatibility with Qt 5.8 [#211]
-- Use consistent button heights in password generator [#229]
-
-2.1.0 (2017-01-22)
-=========================
-
-- Show unlock dialog when using autotype on a closed database [#10, #89]
-- Show different tray icon when database is locked [#37, #46]
-- Support autotype on Windows and OS X [#42, #60, #63]
-- Add delay feature to autotype [#76, #77]
-- Add password strength meter [#84, #92]
-- Add option for automatically locking the database when minimizing
- the window [#57]
-- Add feature to download favicons and use them as entry icons [#30]
-- Automatically reload and merge database when the file changed on
- disk [#22, #33, #93]
-- Add tool for merging two databases [#22, #47, #143]
-- Add --pw-stdin commandline option to unlock the database by providing
- a password on STDIN [#54]
-- Add utility script for reading the database password from KWallet [#55]
-- Fix some KeePassHTTP settings not being remembered [#34, #65]
-- Make search box persistent [#15, #67, #157]
-- Enhance search feature by scoping the search to selected group [#16, #118]
-- Improve interaction between search field and entry list [#131, #141]
-- Add stand-alone password-generator [#18, #92]
-- Don't require password repetition when password is visible [#27, #92]
-- Add support for entry attributes in autotype sequences [#107]
-- Always focus password field when opening the database unlock widget [#116, #117]
-- Fix compilation errors on various platforms [#53, #126, #130]
-- Restructure and improve kdbx-extract utility [#160]
-
-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)
-=========================
-
-- Fix crash when locking with search UI open [#309]
-- Fix file locking on Mac OS X [#327]
-- Set default extension when saving a database [#79, #308]
-
-2.0 Beta 1 (2015-07-18)
-=========================
-
-- Remember entry column sizes [#159]
-- Add translations
-- Support opening attachments directly
-- Support cmd:// URLs [#244]
-- Protect opened databases with a file lock [#18]
-- Export to csv files [#57]
-- Add optional tray icon [#153]
-- Allow setting the default auto-type sequence for groups [#175]
-- Make the kdbx parser more lenient
-- Remove --password command line option [#285]
-
-2.0 Alpha 6 (2014-04-12)
-=========================
-
-- Add option to lock databases after user inactivity [#62]
-- Add compatibility with libgcrypt 1.6 [#129]
-- Display passwords in monospace font [#51]
-- Use an icon for the button that shows/masks passwords [#38]
-- Add an option to show passwords by default [#93]
-- Improve password generator design [#122]
-- On Linux link .kdbx files with KeePassX
-- Remember window size [#154]
-- Disallow global auto-typing when the database is locked
-
-2.0 Alpha 5 (2013-12-20)
-=========================
-
-- Support copying entries and groups using drag'n'drop [#74]
-- Open last used databases on startup [#36]
-- Made the kdbx file parser more robust
-- Only edit entries on doubleclick (not single) or with enter key
-- Allow removing multiple entries
-- Added option to minimize window when copying data to clipboard
-- Save password generator settings
-- Fixed auto-type producing wrong chars in some keyboard configurations [#116]
-- Added some more actions to the toolbar
-
-2.0 Alpha 4 (2013-03-29)
-=========================
-
-- Add random password generator [#52]
-- Merge the 'Description' tab into the 'Entry' tab [#59]
-- Fix crash when deleting history items [#56]
-- Fix crash on Mac OS X Mountain Lion during startup [#50]
-- Improved KeePassX application icon [#58]
-
-2.0 Alpha 3 (2012-10-27)
-=========================
-
-- Auto-Type on Linux / X11
-- Database locking
-- Fix database corruption when changing key transformation rounds [#34]
-- Verify header data of kdbx files
-- Add menu entry to open URLs in the browser
-- Add menu entry to copy an entry attribute to clipboard
-
-2.0 Alpha 2 (2012-07-02)
-=========================
-
-- Import kdb (KeePass 1) files [#2]
-- Display history items [#23]
-- Implement history item limits [#16]
-- Group and entry icons can be set [#22]
-- Add keyboard shortcuts
-- Search in databases [#24]
-- Sortable entry view
-- Support building Mac OS X bundles
-
-2.0 Alpha 1 (2012-05-07)
-=========================
-
-- First release.
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..9a8ad96f0
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,546 @@
+# Changelog
+
+## 2.5.0 (2019-10-26)
+
+### Added
+
+- Add 'Paper Backup' aka 'Export to HTML file' to the 'Database' menu [[#3277](https://github.com/keepassxreboot/keepassxc/pull/3277)]
+- Add statistics panel with information about the database (number of entries, number of unique passwords, etc.) to the Database Settings dialog [[#2034](https://github.com/keepassxreboot/keepassxc/issues/2034)]
+- Add offline user manual accessible via the 'Help' menu [[#3274](https://github.com/keepassxreboot/keepassxc/issues/3274)]
+- Add support for importing 1Password OpVault files [[#2292](https://github.com/keepassxreboot/keepassxc/issues/2292)]
+- Implement Freedesktop.org secret storage DBus protocol so that KeePassXC can be used as a vault service by libsecret [[#2726](https://github.com/keepassxreboot/keepassxc/issues/2726)]
+- Add support for OnlyKey as an alternative to YubiKeys (requires yubikey-personalization >= 1.20.0) [[#3352](https://github.com/keepassxreboot/keepassxc/issues/3352)]
+- Add group sorting feature [[#3282](https://github.com/keepassxreboot/keepassxc/issues/3282)]
+- Add feature to download favicons for all entries at once [[#3169](https://github.com/keepassxreboot/keepassxc/issues/3169)]
+- Add word case option to passphrase generator [[#3172](https://github.com/keepassxreboot/keepassxc/issues/3172)]
+- Add support for RFC6238-compliant TOTP hashes [[#2972](https://github.com/keepassxreboot/keepassxc/issues/2972)]
+- Add UNIX man page for main program [[#3665](https://github.com/keepassxreboot/keepassxc/issues/3665)]
+- Add 'Monospaced font' option to the notes field [[#3321](https://github.com/keepassxreboot/keepassxc/issues/3321)]
+- Add support for key files in auto open [[#3504](https://github.com/keepassxreboot/keepassxc/issues/3504)]
+- Add search field for filtering entries in Auto-Type dialog [[#2955](https://github.com/keepassxreboot/keepassxc/issues/2955)]
+- Complete usernames based on known usernames from other entries [[#3300](https://github.com/keepassxreboot/keepassxc/issues/3300)]
+- Parse hyperlinks in the notes field of the entry preview pane [[#3596](https://github.com/keepassxreboot/keepassxc/issues/3596)]
+- Allow abbreviation of field names in entry search [[#3440](https://github.com/keepassxreboot/keepassxc/issues/3440)]
+- Allow setting group icons recursively [[#3273](https://github.com/keepassxreboot/keepassxc/issues/3273)]
+- Add copy context menu for username and password in Auto-Type dialog [[#3038](https://github.com/keepassxreboot/keepassxc/issues/3038)]
+- Drop to background after copying a password to the clipboard [[#3253](https://github.com/keepassxreboot/keepassxc/issues/3253)]
+- Add 'Lock databases' entry to tray icon menu [[#2896](https://github.com/keepassxreboot/keepassxc/issues/2896)]
+- Add option to minimize window after unlocking [[#3439](https://github.com/keepassxreboot/keepassxc/issues/3439)]
+- Add option to minimize window after opening a URL [[#3302](https://github.com/keepassxreboot/keepassxc/issues/3302)]
+- Request accessibility permissions for Auto-Type on macOS [[#3624](https://github.com/keepassxreboot/keepassxc/issues/3624)]
+- Browser: Add initial support for multiple URLs [[#3558](https://github.com/keepassxreboot/keepassxc/issues/3558)]
+- Browser: Add entry-specific browser integration settings [[#3444](https://github.com/keepassxreboot/keepassxc/issues/3444)]
+- CLI: Add offline HIBP checker (requires a downloaded HIBP dump) [[#2707](https://github.com/keepassxreboot/keepassxc/issues/2707)]
+- CLI: Add 'flatten' option to the 'ls' command [[#3276](https://github.com/keepassxreboot/keepassxc/issues/3276)]
+- CLI: Add password generation options to `Add` and `Edit` commands [[#3275](https://github.com/keepassxreboot/keepassxc/issues/3275)]
+- CLI: Add XML import [[#3572](https://github.com/keepassxreboot/keepassxc/issues/3572)]
+- CLI: Add CSV export to the 'export' command [[#3278](https://github.com/keepassxreboot/keepassxc/issues/3278)]
+- CLI: Add `-y --yubikey` option for YubiKey [[#3416](https://github.com/keepassxreboot/keepassxc/issues/3416)]
+- CLI: Add `--dry-run` option for merging databases [[#3254](https://github.com/keepassxreboot/keepassxc/issues/3254)]
+- CLI: Add group commands (mv, mkdir and rmdir) [[#3313](https://github.com/keepassxreboot/keepassxc/issues/3313)].
+- CLI: Add interactive shell mode command `open` [[#3224](https://github.com/keepassxreboot/keepassxc/issues/3224)]
+
+
+### Changed
+
+- Redesign database unlock dialog [ [#3287](https://github.com/keepassxreboot/keepassxc/issues/3287)]
+- Rework the entry preview panel [ [#3306](https://github.com/keepassxreboot/keepassxc/issues/3306)]
+- Move notes to General tab on Group Preview Panel [[#3336](https://github.com/keepassxreboot/keepassxc/issues/3336)]
+- Enable entry actions when editing an entry and cleanup entry context menu [[#3641](https://github.com/keepassxreboot/keepassxc/issues/3641)]
+- Improve detection of external database changes [[#2389](https://github.com/keepassxreboot/keepassxc/issues/2389)]
+- Warn if user is trying to use a KDBX file as a key file [[#3625](https://github.com/keepassxreboot/keepassxc/issues/3625)]
+- Add option to disable KeePassHTTP settings migrations prompt [[#3349](https://github.com/keepassxreboot/keepassxc/issues/3349), [#3344](https://github.com/keepassxreboot/keepassxc/issues/3344)]
+- Re-enabled Wayland support (no Auto-Type yet) [[#3520](https://github.com/keepassxreboot/keepassxc/issues/3520), [#3341](https://github.com/keepassxreboot/keepassxc/issues/3341)]
+- Add icon to 'Toggle Window' action in tray icon menu [[3244](https://github.com/keepassxreboot/keepassxc/issues/3244)]
+- Merge custom data between databases only when necessary [[#3475](https://github.com/keepassxreboot/keepassxc/issues/3475)]
+- Improve various file-handling related issues when picking files using the system's file dialog [[#3473](https://github.com/keepassxreboot/keepassxc/issues/3473)]
+- Add 'New Entry' context menu when no entries are selected [[#3671](https://github.com/keepassxreboot/keepassxc/issues/3671)]
+- Reduce default Argon2 settings from 128 MiB and one thread per CPU core to 64 MiB and two threads to account for lower-spec mobile hardware [ [#3672](https://github.com/keepassxreboot/keepassxc/issues/3672)]
+- Browser: Remove unused 'Remember' checkbox for HTTP Basic Auth [[#3371](https://github.com/keepassxreboot/keepassxc/issues/3371)]
+- Browser: Show database name when pairing with a new browser [[#3638](https://github.com/keepassxreboot/keepassxc/issues/3638)]
+- Browser: Show URL in allow access dialog [[#3639](https://github.com/keepassxreboot/keepassxc/issues/3639)]
+- CLI: The password length option `-l` for the CLI commands `Add` and `Edit` is now `-L` [[#3275](https://github.com/keepassxreboot/keepassxc/issues/3275)]
+- CLI: The `-u` shorthand for the `--upper` password generation option has been renamed to `-U` [[#3275](https://github.com/keepassxreboot/keepassxc/issues/3275)]
+- CLI: Rename command `extract` to `export`. [[#3277](https://github.com/keepassxreboot/keepassxc/issues/3277)]
+
+### Fixed
+
+- Improve accessibility for assistive technologies [[#3409](https://github.com/keepassxreboot/keepassxc/issues/3409)]
+- Correctly unlock all databases if `--pw-stdin` is provided [[#2916](https://github.com/keepassxreboot/keepassxc/issues/2916)]
+- Fix password generator issues with special characters [[#3303](https://github.com/keepassxreboot/keepassxc/issues/3303)]
+- Fix KeePassXC interrupting shutdown procedure [[#3666](https://github.com/keepassxreboot/keepassxc/issues/3666)]
+- Fix password visibility toggle button state on unlock dialog [[#3312](https://github.com/keepassxreboot/keepassxc/issues/3312)]
+- Fix potential data loss if database is reloaded while user is editing an entry [[#3656](https://github.com/keepassxreboot/keepassxc/issues/3656)]
+- Fix hard-coded background color in search help popup [[#3001](https://github.com/keepassxreboot/keepassxc/issues/3001)]
+- Fix font choice for password preview [[#3425](https://github.com/keepassxreboot/keepassxc/issues/3425)]
+- Fix handling of read-only files when autosave is enabled [[#3408](https://github.com/keepassxreboot/keepassxc/issues/3408)]
+- Handle symlinks correctly when atomic saves are disabled [[#3463](https://github.com/keepassxreboot/keepassxc/issues/3463)]
+- Enable HighDPI icon scaling on Linux [[#3332](https://github.com/keepassxreboot/keepassxc/issues/3332)]
+- Make Auto-Type on macOS more robust and remove old Carbon API calls [[#3634](https://github.com/keepassxreboot/keepassxc/issues/3634), [[#3347](https://github.com/keepassxreboot/keepassxc/issues/3347))]
+- Hide Share tab if KeePassXC is compiled without KeeShare support and other minor KeeShare improvements [[#3654](https://github.com/keepassxreboot/keepassxc/issues/3654), [[#3291](https://github.com/keepassxreboot/keepassxc/issues/3291), [#3029](https://github.com/keepassxreboot/keepassxc/issues/3029), [#3031](https://github.com/keepassxreboot/keepassxc/issues/3031), [#3236](https://github.com/keepassxreboot/keepassxc/issues/3236)]
+- Correctly bring window to the front when clicking tray icon on macOS [[#3576](https://github.com/keepassxreboot/keepassxc/issues/3576)]
+- Correct application shortcut created by MSI Installer on Windows [[#3296](https://github.com/keepassxreboot/keepassxc/issues/3296)]
+- Fix crash when removing custom data [[#3508](https://github.com/keepassxreboot/keepassxc/issues/3508)]
+- Fix placeholder resolution in URLs [[#3281](https://github.com/keepassxreboot/keepassxc/issues/3281)]
+- Fix various inconsistencies and platform-dependent compilation bugs [[#3664](https://github.com/keepassxreboot/keepassxc/issues/3664), [#3662](https://github.com/keepassxreboot/keepassxc/issues/3662), [#3660](https://github.com/keepassxreboot/keepassxc/issues/3660), [#3655](https://github.com/keepassxreboot/keepassxc/issues/3655), [#3649](https://github.com/keepassxreboot/keepassxc/issues/3649), [#3417](https://github.com/keepassxreboot/keepassxc/issues/3417), [#3357](https://github.com/keepassxreboot/keepassxc/issues/3357), [#3319](https://github.com/keepassxreboot/keepassxc/issues/3319), [#3318](https://github.com/keepassxreboot/keepassxc/issues/3318), [#3304](https://github.com/keepassxreboot/keepassxc/issues/3304)]
+- Browser: Fix potential leaking of entries through the browser integration API if multiple databases are opened [[#3480](https://github.com/keepassxreboot/keepassxc/issues/3480)]
+- Browser: Fix password entropy calculation [[#3107](https://github.com/keepassxreboot/keepassxc/issues/3107)]
+- Browser: Fix Windows registry settings for portable installation [[#3603](https://github.com/keepassxreboot/keepassxc/issues/3603)]
+
+## 2.4.3 (2019-06-12)
+
+### Added
+
+- Add documentation for keyboard shortcuts to source code distribution [[#3215](https://github.com/keepassxreboot/keepassxc/issues/3215)]
+
+### Fixed
+
+- Fix library loading issues in the Snap and macOS releases [[#3247](https://github.com/keepassxreboot/keepassxc/issues/3247)]
+- Fix various keyboard navigation issues [[#3248](https://github.com/keepassxreboot/keepassxc/issues/3248)]
+- Fix main window toggling regression when clicking the tray icon on KDE [[#3258](https://github.com/keepassxreboot/keepassxc/issues/3258)]
+
+## 2.4.2 (2019-05-31)
+
+- Improve resilience against memory attacks - overwrite memory before free [[#3020](https://github.com/keepassxreboot/keepassxc/issues/3020)]
+- Prevent infinite save loop when location is unavailable [[#3026](https://github.com/keepassxreboot/keepassxc/issues/3026)]
+- Attempt to fix quitting application when shutdown or logout issued [[#3199](https://github.com/keepassxreboot/keepassxc/issues/3199)]
+- Support merging database custom data [[#3002](https://github.com/keepassxreboot/keepassxc/issues/3002)]
+- Fix opening URL's with non-http schemes [[#3153](https://github.com/keepassxreboot/keepassxc/issues/3153)]
+- Fix data loss due to not reading all database attachments if duplicates exist [[#3180](https://github.com/keepassxreboot/keepassxc/issues/3180)]
+- Fix entry context menu disabling when using keyboard navigation [[#3199](https://github.com/keepassxreboot/keepassxc/issues/3199)]
+- Fix behaviors when canceling an entry edit [[#3199](https://github.com/keepassxreboot/keepassxc/issues/3199)]
+- Fix processing of tray icon click and doubleclick [[#3112](https://github.com/keepassxreboot/keepassxc/issues/3112)]
+- Update group in preview widget when focused [[#3199](https://github.com/keepassxreboot/keepassxc/issues/3199)]
+- Prefer DuckDuckGo service over direct icon download (increases resolution) [#2996](https://github.com/keepassxreboot/keepassxc/issues/2996)]
+- Remove apply button in application settings [[#3019](https://github.com/keepassxreboot/keepassxc/issues/3019)]
+- Use winqtdeploy on Windows to correct deployment issues [[#3025](https://github.com/keepassxreboot/keepassxc/issues/3025)]
+- Don't mark entry edit as modified when attribute selection changes [[#3041](https://github.com/keepassxreboot/keepassxc/issues/3041)]
+- Use console code page CP_UTF8 on Windows if supported [[#3050](https://github.com/keepassxreboot/keepassxc/issues/3050)]
+- Snap: Fix locking database with session lock [[#3046](https://github.com/keepassxreboot/keepassxc/issues/3046)]
+- Snap: Fix theming across Linux distributions [[#3057](https://github.com/keepassxreboot/keepassxc/issues/3057)]
+- Snap: Use SNAP_USER_COMMON and SNAP_USER_DATA directories [[#3131](https://github.com/keepassxreboot/keepassxc/issues/3131)]
+- KeeShare: Automatically enable WITH_XC_KEESHARE_SECURE if quazip is found [[#3088](https://github.com/keepassxreboot/keepassxc/issues/3088)]
+- macOS: Fix toolbar text when in dark mode [[#2998](https://github.com/keepassxreboot/keepassxc/issues/2998)]
+- macOS: Lock database on switching user [[#3097](https://github.com/keepassxreboot/keepassxc/issues/3097)]
+- macOS: Fix global Auto-Type when the database is locked[ [#3138](https://github.com/keepassxreboot/keepassxc/issues/3138)]
+- Browser: Close popups when database is locked [[#3093](https://github.com/keepassxreboot/keepassxc/issues/3093)]
+- Browser: Add tests [[#3016](https://github.com/keepassxreboot/keepassxc/issues/3016)]
+- Browser: Don't create default group if custom group is enabled [[#3127](https://github.com/keepassxreboot/keepassxc/issues/3127)]
+
+## 2.4.1 (2019-04-12)
+
+- Fix database deletion when using unsafe saves to a different file system [#2889](https://github.com/keepassxreboot/keepassxc/issues/2889)
+- Fix opening databases with legacy key files that contain '/' [#2872](https://github.com/keepassxreboot/keepassxc/issues/2872)
+- Fix opening database files from the command line [#2919](https://github.com/keepassxreboot/keepassxc/issues/2919)
+- Fix crash when editing master key [#2836](https://github.com/keepassxreboot/keepassxc/issues/2836)
+- Fix multiple issues with apply button behavior [#2947](https://github.com/keepassxreboot/keepassxc/issues/2947)
+- Fix issues on application startup (tab order, --pw-stdin, etc.) [#2830](https://github.com/keepassxreboot/keepassxc/issues/2830)
+- Fix building without WITH_XC_KEESHARE
+- Fix reference entry coloring on macOS dark mode [#2984](https://github.com/keepassxreboot/keepassxc/issues/2984)
+- Hide window when performing entry auto-type on macOS [#2969](https://github.com/keepassxreboot/keepassxc/issues/2969)
+- Improve UX of update checker; reduce checks to every 7 days [#2968](https://github.com/keepassxreboot/keepassxc/issues/2968)
+- KeeShare improvements [[#2946](https://github.com/keepassxreboot/keepassxc/issues/2946), [#2978](https://github.com/keepassxreboot/keepassxc/issues/2978), [#2824](https://github.com/keepassxreboot/keepassxc/issues/2824)]
+- Re-enable Ctrl+C to copy password from search box [#2947](https://github.com/keepassxreboot/keepassxc/issues/2947)
+- Add KeePassXC-Browser integration for Brave browser [#2933](https://github.com/keepassxreboot/keepassxc/issues/2933)
+- SSH Agent: Re-Add keys on database unlock [#2982](https://github.com/keepassxreboot/keepassxc/issues/2982)
+- SSH Agent: Only remove keys on app exit if they are removed on lock [#2985](https://github.com/keepassxreboot/keepassxc/issues/2985)
+- CLI: Add --no-password option [#2708](https://github.com/keepassxreboot/keepassxc/issues/2708)
+- CLI: Improve database extraction to XML [#2698](https://github.com/keepassxreboot/keepassxc/issues/2698)
+- CLI: Don't call mandb on build [#2774](https://github.com/keepassxreboot/keepassxc/issues/2774)
+- CLI: Add debug info [#2714](https://github.com/keepassxreboot/keepassxc/issues/2714)
+- Improve support for Snap theming [#2832](https://github.com/keepassxreboot/keepassxc/issues/2832)
+- Add support for building on Haiku OS [#2859](https://github.com/keepassxreboot/keepassxc/issues/2859)
+- Ctrl+PgDn now goes to the next tab and Ctrl+PgUp to the previous
+- Fix compiling on GCC 5 / Xenial [#2990](https://github.com/keepassxreboot/keepassxc/issues/2990)
+- Add .gitrev output to tarball for third-party builds [#2970](https://github.com/keepassxreboot/keepassxc/issues/2970)
+- Add WITH_XC_UPDATECHECK compile flag to toggle the update checker [#2968](https://github.com/keepassxreboot/keepassxc/issues/2968)
+
+## 2.4.0 (2019-03-19)
+
+- New Database Wizard [#1952](https://github.com/keepassxreboot/keepassxc/issues/1952)
+- Advanced Search [#1797](https://github.com/keepassxreboot/keepassxc/issues/1797)
+- Automatic update checker [#2648](https://github.com/keepassxreboot/keepassxc/issues/2648)
+- KeeShare database synchronization [[#2109](https://github.com/keepassxreboot/keepassxc/issues/2109), [#1992](https://github.com/keepassxreboot/keepassxc/issues/1992), [#2738](https://github.com/keepassxreboot/keepassxc/issues/2738), [#2742](https://github.com/keepassxreboot/keepassxc/issues/2742), [#2746](https://github.com/keepassxreboot/keepassxc/issues/2746), [#2739](https://github.com/keepassxreboot/keepassxc/issues/2739)]
+- Improve favicon fetching; transition to Duck-Duck-Go [[#2795](https://github.com/keepassxreboot/keepassxc/issues/2795), [#2011](https://github.com/keepassxreboot/keepassxc/issues/2011), [#2439](https://github.com/keepassxreboot/keepassxc/issues/2439)]
+- Remove KeePassHttp support [#1752](https://github.com/keepassxreboot/keepassxc/issues/1752)
+- CLI: output info to stderr for easier scripting [#2558](https://github.com/keepassxreboot/keepassxc/issues/2558)
+- CLI: Add --quiet option [#2507](https://github.com/keepassxreboot/keepassxc/issues/2507)
+- CLI: Add create command [#2540](https://github.com/keepassxreboot/keepassxc/issues/2540)
+- CLI: Add recursive listing of entries [#2345](https://github.com/keepassxreboot/keepassxc/issues/2345)
+- CLI: Fix stdin/stdout encoding on Windows [#2425](https://github.com/keepassxreboot/keepassxc/issues/2425)
+- SSH Agent: Support OpenSSH for Windows [#1994](https://github.com/keepassxreboot/keepassxc/issues/1994)
+- macOS: TouchID Quick Unlock [#1851](https://github.com/keepassxreboot/keepassxc/issues/1851)
+- macOS: Multiple improvements; include CLI in DMG [[#2165](https://github.com/keepassxreboot/keepassxc/issues/2165), [#2331](https://github.com/keepassxreboot/keepassxc/issues/2331), [#2583](https://github.com/keepassxreboot/keepassxc/issues/2583)]
+- Linux: Prevent Klipper from storing secrets in clipboard [#1969](https://github.com/keepassxreboot/keepassxc/issues/1969)
+- Linux: Use polling based file watching for NFS [#2171](https://github.com/keepassxreboot/keepassxc/issues/2171)
+- Linux: Enable use of browser plugin in Snap build [#2802](https://github.com/keepassxreboot/keepassxc/issues/2802)
+- TOTP QR Code Generator [#1167](https://github.com/keepassxreboot/keepassxc/issues/1167)
+- High-DPI Scaling for 4k screens [#2404](https://github.com/keepassxreboot/keepassxc/issues/2404)
+- Make keyboard shortcuts more consistent [#2431](https://github.com/keepassxreboot/keepassxc/issues/2431)
+- Warn user if deleting referenced entries [#1744](https://github.com/keepassxreboot/keepassxc/issues/1744)
+- Allow toolbar to be hidden and repositioned [[#1819](https://github.com/keepassxreboot/keepassxc/issues/1819), [#2357](https://github.com/keepassxreboot/keepassxc/issues/2357)]
+- Increase max allowed database timeout to 12 hours [#2173](https://github.com/keepassxreboot/keepassxc/issues/2173)
+- Password generator uses existing password length by default [#2318](https://github.com/keepassxreboot/keepassxc/issues/2318)
+- Improve alert message box button labels [#2376](https://github.com/keepassxreboot/keepassxc/issues/2376)
+- Show message when a database merge makes no changes [#2551](https://github.com/keepassxreboot/keepassxc/issues/2551)
+- Browser Integration Enhancements [[#1497](https://github.com/keepassxreboot/keepassxc/issues/1497), [#2253](https://github.com/keepassxreboot/keepassxc/issues/2253), [#1904](https://github.com/keepassxreboot/keepassxc/issues/1904), [#2232](https://github.com/keepassxreboot/keepassxc/issues/2232), [#1850](https://github.com/keepassxreboot/keepassxc/issues/1850), [#2218](https://github.com/keepassxreboot/keepassxc/issues/2218), [#2391](https://github.com/keepassxreboot/keepassxc/issues/2391), [#2396](https://github.com/keepassxreboot/keepassxc/issues/2396), [#2542](https://github.com/keepassxreboot/keepassxc/issues/2542), [#2622](https://github.com/keepassxreboot/keepassxc/issues/2622), [#2637](https://github.com/keepassxreboot/keepassxc/issues/2637), [#2790](https://github.com/keepassxreboot/keepassxc/issues/2790)]
+- Overall Code Improvements [[#2316](https://github.com/keepassxreboot/keepassxc/issues/2316), [#2284](https://github.com/keepassxreboot/keepassxc/issues/2284), [#2351](https://github.com/keepassxreboot/keepassxc/issues/2351), [#2402](https://github.com/keepassxreboot/keepassxc/issues/2402), [#2410](https://github.com/keepassxreboot/keepassxc/issues/2410), [#2419](https://github.com/keepassxreboot/keepassxc/issues/2419), [#2422](https://github.com/keepassxreboot/keepassxc/issues/2422), [#2443](https://github.com/keepassxreboot/keepassxc/issues/2443), [#2491](https://github.com/keepassxreboot/keepassxc/issues/2491), [#2506](https://github.com/keepassxreboot/keepassxc/issues/2506), [#2610](https://github.com/keepassxreboot/keepassxc/issues/2610), [#2667](https://github.com/keepassxreboot/keepassxc/issues/2667), [#2709](https://github.com/keepassxreboot/keepassxc/issues/2709), [#2731](https://github.com/keepassxreboot/keepassxc/issues/2731)]
+
+## 2.3.4 (2018-08-21)
+
+- Show all URL schemes in entry view [#1768](https://github.com/keepassxreboot/keepassxc/issues/1768)
+- Disable merge when database is locked [#1975](https://github.com/keepassxreboot/keepassxc/issues/1975)
+- Fix intermittent crashes with favorite icon downloads [#1980](https://github.com/keepassxreboot/keepassxc/issues/1980)
+- Provide potential crash warning to Qt 5.5.x users [#2211](https://github.com/keepassxreboot/keepassxc/issues/2211)
+- Disable apply button when creating new entry/group to prevent data loss [#2204](https://github.com/keepassxreboot/keepassxc/issues/2204)
+- Allow for 12 hour timeout to lock idle database [#2173](https://github.com/keepassxreboot/keepassxc/issues/2173)
+- Multiple SSH Agent fixes [[#1981](https://github.com/keepassxreboot/keepassxc/issues/1981), [#2117](https://github.com/keepassxreboot/keepassxc/issues/2117)]
+- Multiple Browser Integration enhancements [[#1993](https://github.com/keepassxreboot/keepassxc/issues/1993), [#2003](https://github.com/keepassxreboot/keepassxc/issues/2003), [#2055](https://github.com/keepassxreboot/keepassxc/issues/2055), [#2116](https://github.com/keepassxreboot/keepassxc/issues/2116), [#2159](https://github.com/keepassxreboot/keepassxc/issues/2159), [#2174](https://github.com/keepassxreboot/keepassxc/issues/2174), [#2185](https://github.com/keepassxreboot/keepassxc/issues/2185)]
+- Fix browser proxy application not closing properly [#2142](https://github.com/keepassxreboot/keepassxc/issues/2142)
+- Add real names and Patreon supporters to about dialog [#2214](https://github.com/keepassxreboot/keepassxc/issues/2214)
+- Add settings button to toolbar, Donate button, and Report a Bug button to help menu [#2214](https://github.com/keepassxreboot/keepassxc/issues/2214)
+- Enhancements to release-tool to appsign intermediate build products [#2101](https://github.com/keepassxreboot/keepassxc/issues/2101)
+
+
+## 2.3.3 (2018-05-09)
+
+- Fix crash when browser integration is enabled [#1923](https://github.com/keepassxreboot/keepassxc/issues/1923)
+
+## 2.3.2 (2018-05-07)
+
+- Enable high entropy ASLR on Windows [#1747](https://github.com/keepassxreboot/keepassxc/issues/1747)
+- Enhance favicon fetching [#1786](https://github.com/keepassxreboot/keepassxc/issues/1786)
+- Fix crash on Windows due to autotype [#1691](https://github.com/keepassxreboot/keepassxc/issues/1691)
+- Fix dark tray icon changing all icons [#1680](https://github.com/keepassxreboot/keepassxc/issues/1680)
+- Fix --pw-stdin not using getPassword function [#1686](https://github.com/keepassxreboot/keepassxc/issues/1686)
+- Fix placeholders being resolved in notes [#1907](https://github.com/keepassxreboot/keepassxc/issues/1907)
+- Enable auto-type start delay to be configurable [#1908](https://github.com/keepassxreboot/keepassxc/issues/1908)
+- Browser: Fix native messaging reply size [#1719](https://github.com/keepassxreboot/keepassxc/issues/1719)
+- Browser: Increase maximum buffer size [#1720](https://github.com/keepassxreboot/keepassxc/issues/1720)
+- Browser: Enhance usability and functionality [[#1810](https://github.com/keepassxreboot/keepassxc/issues/1810), [#1822](https://github.com/keepassxreboot/keepassxc/issues/1822), [#1830](https://github.com/keepassxreboot/keepassxc/issues/1830), [#1884](https://github.com/keepassxreboot/keepassxc/issues/1884), [#1906](https://github.com/keepassxreboot/keepassxc/issues/1906)]
+- SSH Agent: Parse aes-256-cbc/ctr keys [#1682](https://github.com/keepassxreboot/keepassxc/issues/1682)
+- SSH Agent: Enhance usability and functionality [[#1677](https://github.com/keepassxreboot/keepassxc/issues/1677), [#1679](https://github.com/keepassxreboot/keepassxc/issues/1679), [#1681](https://github.com/keepassxreboot/keepassxc/issues/1681), [#1787](https://github.com/keepassxreboot/keepassxc/issues/1787)]
+
+## 2.3.1 (2018-03-06)
+
+- Fix unnecessary automatic upgrade to KDBX 4.0 and prevent challenge-response key being stripped [#1568](https://github.com/keepassxreboot/keepassxc/issues/1568)
+- Abort saving and show an error message when challenge-response fails [#1659](https://github.com/keepassxreboot/keepassxc/issues/1659)
+- Support inner stream protection on all string attributes [#1646](https://github.com/keepassxreboot/keepassxc/issues/1646)
+- Fix favicon downloads not finishing on some websites [#1657](https://github.com/keepassxreboot/keepassxc/issues/1657)
+- Fix freeze due to invalid STDIN data [#1628](https://github.com/keepassxreboot/keepassxc/issues/1628)
+- Correct issue with encrypted RSA SSH keys [#1587](https://github.com/keepassxreboot/keepassxc/issues/1587)
+- Fix crash on macOS due to QTBUG-54832 [#1607](https://github.com/keepassxreboot/keepassxc/issues/1607)
+- Show error message if ssh-agent communication fails [#1614](https://github.com/keepassxreboot/keepassxc/issues/1614)
+- Fix --pw-stdin and filename parameters being ignored [#1608](https://github.com/keepassxreboot/keepassxc/issues/1608)
+- Fix Auto-Type syntax check not allowing spaces and special characters [#1626](https://github.com/keepassxreboot/keepassxc/issues/1626)
+- Fix reference placeholders in combination with Auto-Type [#1649](https://github.com/keepassxreboot/keepassxc/issues/1649)
+- Fix qtbase translations not being loaded [#1611](https://github.com/keepassxreboot/keepassxc/issues/1611)
+- Fix startup crash on Windows due to missing SVG libraries [#1662](https://github.com/keepassxreboot/keepassxc/issues/1662)
+- Correct database tab order regression [#1610](https://github.com/keepassxreboot/keepassxc/issues/1610)
+- Fix GCC 8 compilation error [#1612](https://github.com/keepassxreboot/keepassxc/issues/1612)
+- Fix copying of advanced attributes on KDE [#1640](https://github.com/keepassxreboot/keepassxc/issues/1640)
+- Fix member initialization of CategoryListWidgetDelegate [#1613](https://github.com/keepassxreboot/keepassxc/issues/1613)
+- Fix inconsistent toolbar icon sizes and provide higher-quality icons [#1616](https://github.com/keepassxreboot/keepassxc/issues/1616)
+- Improve preview panel geometry [#1609](https://github.com/keepassxreboot/keepassxc/issues/1609)
+
+## 2.3.0 (2018-02-27)
+
+- Add support for KDBX 4.0, Argon2 and ChaCha20 [[#148](https://github.com/keepassxreboot/keepassxc/issues/148), [#1179](https://github.com/keepassxreboot/keepassxc/issues/1179), [#1230](https://github.com/keepassxreboot/keepassxc/issues/1230), [#1494](https://github.com/keepassxreboot/keepassxc/issues/1494)]
+- Add SSH Agent feature [[#1098](https://github.com/keepassxreboot/keepassxc/issues/1098), [#1450](https://github.com/keepassxreboot/keepassxc/issues/1450), [#1463](https://github.com/keepassxreboot/keepassxc/issues/1463)]
+- Add preview panel with details of the selected entry [[#879](https://github.com/keepassxreboot/keepassxc/issues/879), [#1338](https://github.com/keepassxreboot/keepassxc/issues/1338)]
+- Add more and configurable columns to entry table and allow copying of values by double click [#1305](https://github.com/keepassxreboot/keepassxc/issues/1305)
+- Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608](https://github.com/keepassxreboot/keepassxc/issues/608)
+- Deprecate KeePassHTTP [#1392](https://github.com/keepassxreboot/keepassxc/issues/1392)
+- Add support for Steam one-time passwords [#1206](https://github.com/keepassxreboot/keepassxc/issues/1206)
+- Add support for multiple Auto-Type sequences for a single entry [#1390](https://github.com/keepassxreboot/keepassxc/issues/1390)
+- Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060](https://github.com/keepassxreboot/keepassxc/issues/1060)
+- Replace qHttp with cURL for website icon downloads [#1460](https://github.com/keepassxreboot/keepassxc/issues/1460)
+- Remove lock file [#1231](https://github.com/keepassxreboot/keepassxc/issues/1231)
+- Add option to create backup file before saving [#1385](https://github.com/keepassxreboot/keepassxc/issues/1385)
+- Ask to save a generated password before closing the entry password generator [#1499](https://github.com/keepassxreboot/keepassxc/issues/1499)
+- Resolve placeholders recursively [#1078](https://github.com/keepassxreboot/keepassxc/issues/1078)
+- Add Auto-Type button to the toolbar [#1056](https://github.com/keepassxreboot/keepassxc/issues/1056)
+- Improve window focus handling for Auto-Type dialogs [[#1204](https://github.com/keepassxreboot/keepassxc/issues/1204), [#1490](https://github.com/keepassxreboot/keepassxc/issues/1490)]
+- Auto-Type dialog and password generator can now be exited with ESC [[#1252](https://github.com/keepassxreboot/keepassxc/issues/1252), [#1412](https://github.com/keepassxreboot/keepassxc/issues/1412)]
+- Add optional dark tray icon [#1154](https://github.com/keepassxreboot/keepassxc/issues/1154)
+- Add new "Unsafe saving" option to work around saving problems with file sync services [#1385](https://github.com/keepassxreboot/keepassxc/issues/1385)
+- Add IBus support to AppImage and additional image formats to Windows builds [[#1534](https://github.com/keepassxreboot/keepassxc/issues/1534), [#1537](https://github.com/keepassxreboot/keepassxc/issues/1537)]
+- Add diceware password generator to CLI [#1406](https://github.com/keepassxreboot/keepassxc/issues/1406)
+- Add --key-file option to CLI [[#816](https://github.com/keepassxreboot/keepassxc/issues/816), [#824](https://github.com/keepassxreboot/keepassxc/issues/824)]
+- Add DBus interface for opening and closing KeePassXC databases [#283](https://github.com/keepassxreboot/keepassxc/issues/283)
+- Add KDBX compression options to database settings [#1419](https://github.com/keepassxreboot/keepassxc/issues/1419)
+- Discourage use of old fixed-length key files in favor of arbitrary files [[#1326](https://github.com/keepassxreboot/keepassxc/issues/1326), [#1327](https://github.com/keepassxreboot/keepassxc/issues/1327)]
+- Correct reference resolution in entry fields [#1486](https://github.com/keepassxreboot/keepassxc/issues/1486)
+- Fix window state and recent databases not being remembered on exit [#1453](https://github.com/keepassxreboot/keepassxc/issues/1453)
+- Correct history item generation when configuring TOTP for an entry [#1446](https://github.com/keepassxreboot/keepassxc/issues/1446)
+- Correct multiple TOTP bugs [#1414](https://github.com/keepassxreboot/keepassxc/issues/1414)
+- Automatic saving after every change is now a default [#279](https://github.com/keepassxreboot/keepassxc/issues/279)
+- Allow creation of new entries during search [#1398](https://github.com/keepassxreboot/keepassxc/issues/1398)
+- Correct menu issues on macOS [#1335](https://github.com/keepassxreboot/keepassxc/issues/1335)
+- Allow compilation on OpenBSD [#1328](https://github.com/keepassxreboot/keepassxc/issues/1328)
+- Improve entry attachments view [[#1139](https://github.com/keepassxreboot/keepassxc/issues/1139), [#1298](https://github.com/keepassxreboot/keepassxc/issues/1298)]
+- Fix auto lock for Gnome and Xfce [[#910](https://github.com/keepassxreboot/keepassxc/issues/910), [#1249](https://github.com/keepassxreboot/keepassxc/issues/1249)]
+- Don't remember key files in file dialogs when the setting is disabled [#1188](https://github.com/keepassxreboot/keepassxc/issues/1188)
+- Improve database merging and conflict resolution [[#807](https://github.com/keepassxreboot/keepassxc/issues/807), [#1165](https://github.com/keepassxreboot/keepassxc/issues/1165)]
+- Fix macOS pasteboard issues [#1202](https://github.com/keepassxreboot/keepassxc/issues/1202)
+- Improve startup times on some platforms [#1205](https://github.com/keepassxreboot/keepassxc/issues/1205)
+- Hide the notes field by default [#1124](https://github.com/keepassxreboot/keepassxc/issues/1124)
+- Toggle main window by clicking tray icon with the middle mouse button [#992](https://github.com/keepassxreboot/keepassxc/issues/992)
+- Fix custom icons not copied over when databases are merged [#1008](https://github.com/keepassxreboot/keepassxc/issues/1008)
+- Allow use of DEL key to delete entries [#914](https://github.com/keepassxreboot/keepassxc/issues/914)
+- Correct intermittent crash due to stale history items [#1527](https://github.com/keepassxreboot/keepassxc/issues/1527)
+- Sanitize newline characters in title, username and URL fields [#1502](https://github.com/keepassxreboot/keepassxc/issues/1502)
+- Reopen previously opened databases in correct order [#774](https://github.com/keepassxreboot/keepassxc/issues/774)
+- Use system's zxcvbn library if available [#701](https://github.com/keepassxreboot/keepassxc/issues/701)
+- Implement various i18n improvements [[#690](https://github.com/keepassxreboot/keepassxc/issues/690), [#875](https://github.com/keepassxreboot/keepassxc/issues/875), [#1436](https://github.com/keepassxreboot/keepassxc/issues/1436)]
+
+## 2.2.4 (2017-12-13)
+
+- Prevent database corruption when locked [#1219](https://github.com/keepassxreboot/keepassxc/issues/1219)
+- Fixes apply button not saving new entries [#1141](https://github.com/keepassxreboot/keepassxc/issues/1141)
+- Switch to Consolas font on Windows for password edit [#1229](https://github.com/keepassxreboot/keepassxc/issues/1229)
+- Multiple fixes to AppImage deployment [[#1115](https://github.com/keepassxreboot/keepassxc/issues/1115), [#1228](https://github.com/keepassxreboot/keepassxc/issues/1228)]
+- Fixes multiple memory leaks [#1213](https://github.com/keepassxreboot/keepassxc/issues/1213)
+- Resize message close to 16x16 pixels [#1253](https://github.com/keepassxreboot/keepassxc/issues/1253)
+
+## 2.2.2 (2017-10-22)
+
+- Fixed entries with empty URLs being reported to KeePassHTTP clients [#1031](https://github.com/keepassxreboot/keepassxc/issues/1031)
+- Fixed YubiKey detection and enabled CLI tool for AppImage binary [#1100](https://github.com/keepassxreboot/keepassxc/issues/1100)
+- Added AppStream description [#1082](https://github.com/keepassxreboot/keepassxc/issues/1082)
+- Improved TOTP compatibility and added new Base32 implementation [#1069](https://github.com/keepassxreboot/keepassxc/issues/1069)
+- Fixed error handling when processing invalid cipher stream [#1099](https://github.com/keepassxreboot/keepassxc/issues/1099)
+- Fixed double warning display when opening a database [#1037](https://github.com/keepassxreboot/keepassxc/issues/1037)
+- Fixed unlocking databases with --pw-stdin [#1087](https://github.com/keepassxreboot/keepassxc/issues/1087)
+- Added ability to override QT_PLUGIN_PATH environment variable for AppImages [#1079](https://github.com/keepassxreboot/keepassxc/issues/1079)
+- Fixed transform seed not being regenerated when saving the database [#1068](https://github.com/keepassxreboot/keepassxc/issues/1068)
+- Fixed only one YubiKey slot being polled [#1048](https://github.com/keepassxreboot/keepassxc/issues/1048)
+- Corrected an issue with entry icons while merging [#1008](https://github.com/keepassxreboot/keepassxc/issues/1008)
+- Corrected desktop and tray icons in Snap package [#1030](https://github.com/keepassxreboot/keepassxc/issues/1030)
+- Fixed screen lock and Google fallback settings [#1029](https://github.com/keepassxreboot/keepassxc/issues/1029)
+
+## 2.2.1 (2017-10-01)
+
+- Corrected multiple snap issues [[#934](https://github.com/keepassxreboot/keepassxc/issues/934), [#1011](https://github.com/keepassxreboot/keepassxc/issues/1011)]
+- Corrected multiple custom icon issues [[#708](https://github.com/keepassxreboot/keepassxc/issues/708), [#719](https://github.com/keepassxreboot/keepassxc/issues/719), [#994](https://github.com/keepassxreboot/keepassxc/issues/994)]
+- Corrected multiple Yubikey issues [#880](https://github.com/keepassxreboot/keepassxc/issues/880)
+- Fixed single instance preventing load on occasion [#997](https://github.com/keepassxreboot/keepassxc/issues/997)
+- Keep entry history when merging databases [#970](https://github.com/keepassxreboot/keepassxc/issues/970)
+- Prevent data loss if passwords were mismatched [#1007](https://github.com/keepassxreboot/keepassxc/issues/1007)
+- Fixed crash after merge [#941](https://github.com/keepassxreboot/keepassxc/issues/941)
+- Added configurable auto-type default delay [#703](https://github.com/keepassxreboot/keepassxc/issues/703)
+- Unlock database dialog window comes to front [#663](https://github.com/keepassxreboot/keepassxc/issues/663)
+- Translation and compiling fixes
+
+## 2.2.0 (2017-06-23)
+
+- Added YubiKey 2FA integration for unlocking databases [#127](https://github.com/keepassxreboot/keepassxc/issues/127)
+- Added TOTP support [#519](https://github.com/keepassxreboot/keepassxc/issues/519)
+- Added CSV import tool [[#146](https://github.com/keepassxreboot/keepassxc/issues/146), [#490](https://github.com/keepassxreboot/keepassxc/issues/490)]
+- Added KeePassXC CLI tool [#254](https://github.com/keepassxreboot/keepassxc/issues/254)
+- Added diceware password generator [#373](https://github.com/keepassxreboot/keepassxc/issues/373)
+- Added support for entry references [[#370](https://github.com/keepassxreboot/keepassxc/issues/370), [#378](https://github.com/keepassxreboot/keepassxc/issues/378)]
+- Added support for Twofish encryption [#167](https://github.com/keepassxreboot/keepassxc/issues/167)
+- Enabled DEP and ASLR for in-memory protection [#371](https://github.com/keepassxreboot/keepassxc/issues/371)
+- Enabled single instance mode [#510](https://github.com/keepassxreboot/keepassxc/issues/510)
+- Enabled portable mode [#645](https://github.com/keepassxreboot/keepassxc/issues/645)
+- Enabled database lock on screensaver and session lock [#545](https://github.com/keepassxreboot/keepassxc/issues/545)
+- Redesigned welcome screen with common features and recent databases [#292](https://github.com/keepassxreboot/keepassxc/issues/292)
+- Multiple updates to search behavior [[#168](https://github.com/keepassxreboot/keepassxc/issues/168), [#213](https://github.com/keepassxreboot/keepassxc/issues/213), [#374](https://github.com/keepassxreboot/keepassxc/issues/374), [#471](https://github.com/keepassxreboot/keepassxc/issues/471), [#603](https://github.com/keepassxreboot/keepassxc/issues/603), [#654](https://github.com/keepassxreboot/keepassxc/issues/654)]
+- Added auto-type fields {CLEARFIELD}, {SPACE}, {{}, {}} [[#267](https://github.com/keepassxreboot/keepassxc/issues/267), [#427](https://github.com/keepassxreboot/keepassxc/issues/427), [#480](https://github.com/keepassxreboot/keepassxc/issues/480)]
+- Fixed auto-type errors on Linux [#550](https://github.com/keepassxreboot/keepassxc/issues/550)
+- Prompt user prior to executing a cmd:// URL [#235](https://github.com/keepassxreboot/keepassxc/issues/235)
+- Entry attributes can be protected (hidden) [#220](https://github.com/keepassxreboot/keepassxc/issues/220)
+- Added extended ascii to password generator [#538](https://github.com/keepassxreboot/keepassxc/issues/538)
+- Added new database icon to toolbar [#289](https://github.com/keepassxreboot/keepassxc/issues/289)
+- Added context menu entry to empty recycle bin in databases [#520](https://github.com/keepassxreboot/keepassxc/issues/520)
+- Added "apply" button to entry and group edit windows [#624](https://github.com/keepassxreboot/keepassxc/issues/624)
+- Added macOS tray icon and enabled minimize on close [#583](https://github.com/keepassxreboot/keepassxc/issues/583)
+- Fixed issues with unclean shutdowns [[#170](https://github.com/keepassxreboot/keepassxc/issues/170), [#580](https://github.com/keepassxreboot/keepassxc/issues/580)]
+- Changed keyboard shortcut to create new database to CTRL+SHIFT+N [#515](https://github.com/keepassxreboot/keepassxc/issues/515)
+- Compare window title to entry URLs [#556](https://github.com/keepassxreboot/keepassxc/issues/556)
+- Implemented inline error messages [#162](https://github.com/keepassxreboot/keepassxc/issues/162)
+- Ignore group expansion and other minor changes when making database "dirty" [#464](https://github.com/keepassxreboot/keepassxc/issues/464)
+- Updated license and copyright information on souce files [#632](https://github.com/keepassxreboot/keepassxc/issues/632)
+- Added contributors list to about dialog [#629](https://github.com/keepassxreboot/keepassxc/issues/629)
+
+## 2.1.4 (2017-04-09)
+
+- Bumped KeePassHTTP version to 1.8.4.2
+- KeePassHTTP confirmation window comes to foreground [#466](https://github.com/keepassxreboot/keepassxc/issues/466)
+
+## 2.1.3 (2017-03-03)
+
+- Fix possible overflow in zxcvbn library [#363](https://github.com/keepassxreboot/keepassxc/issues/363)
+- Revert HiDPI setting to avoid problems on laptop screens [#332](https://github.com/keepassxreboot/keepassxc/issues/332)
+- Set file meta properties in Windows executable [#330](https://github.com/keepassxreboot/keepassxc/issues/330)
+- Suppress error message when auto-reloading a locked database [#345](https://github.com/keepassxreboot/keepassxc/issues/345)
+- Improve usability of question dialog when database is already locked by a different instance [#346](https://github.com/keepassxreboot/keepassxc/issues/346)
+- Fix compiler warnings in QHttp library [#351](https://github.com/keepassxreboot/keepassxc/issues/351)
+- Use unified toolbar on Mac OS X [#361](https://github.com/keepassxreboot/keepassxc/issues/361)
+- Fix an issue on X11 where the main window would be raised instead of closed on Alt+F4 [#362](https://github.com/keepassxreboot/keepassxc/issues/362)
+
+## 2.1.2 (2017-02-17)
+
+- Ask for save location when creating a new database [#302](https://github.com/keepassxreboot/keepassxc/issues/302)
+- Remove Libmicrohttpd dependency to clean up the code and ensure better OS X compatibility [[#317](https://github.com/keepassxreboot/keepassxc/issues/317), [#265](https://github.com/keepassxreboot/keepassxc/issues/265)]
+- Prevent Qt from degrading Wifi network performance on certain platforms [#318](https://github.com/keepassxreboot/keepassxc/issues/318)
+- Visually refine user interface on OS X and other platforms [#299](https://github.com/keepassxreboot/keepassxc/issues/299)
+- Remove unusable tray icon setting on OS X [#293](https://github.com/keepassxreboot/keepassxc/issues/293)
+- Fix compositing glitches on Ubuntu and prevent flashing when minimizing to the tray at startup [#307](https://github.com/keepassxreboot/keepassxc/issues/307)
+- Fix AppImage tray icon on Ubuntu [[#277](https://github.com/keepassxreboot/keepassxc/issues/277), [#273](https://github.com/keepassxreboot/keepassxc/issues/273)]
+- Fix global menu disappearing after restoring KeePassXC from the tray on Ubuntu [#276](https://github.com/keepassxreboot/keepassxc/issues/276)
+- Fix result order in entry search [#320](https://github.com/keepassxreboot/keepassxc/issues/320)
+- Enable HiDPI scaling on supported platforms [#315](https://github.com/keepassxreboot/keepassxc/issues/315)
+- Remove empty directories from installation target [#282](https://github.com/keepassxreboot/keepassxc/issues/282)
+
+## 2.1.1 (2017-02-06)
+
+- Enabled HTTP plugin build; plugin is disabled by default and limited to localhost [#147](https://github.com/keepassxreboot/keepassxc/issues/147)
+- Escape HTML in dialog boxes [#247](https://github.com/keepassxreboot/keepassxc/issues/247)
+- Corrected crashes in favicon download and password generator [[#233](https://github.com/keepassxreboot/keepassxc/issues/233), [#226](https://github.com/keepassxreboot/keepassxc/issues/226)]
+- Increase font size of password meter [#228](https://github.com/keepassxreboot/keepassxc/issues/228)
+- Fixed compatibility with Qt 5.8 [#211](https://github.com/keepassxreboot/keepassxc/issues/211)
+- Use consistent button heights in password generator [#229](https://github.com/keepassxreboot/keepassxc/issues/229)
+
+## 2.1.0 (2017-01-22)
+
+- Show unlock dialog when using autotype on a closed database [[#10](https://github.com/keepassxreboot/keepassxc/issues/10), [#89](https://github.com/keepassxreboot/keepassxc/issues/89)]
+- Show different tray icon when database is locked [[#37](https://github.com/keepassxreboot/keepassxc/issues/37), [#46](https://github.com/keepassxreboot/keepassxc/issues/46)]
+- Support autotype on Windows and OS X [[#42](https://github.com/keepassxreboot/keepassxc/issues/42), [#60](https://github.com/keepassxreboot/keepassxc/issues/60), [#63](https://github.com/keepassxreboot/keepassxc/issues/63)]
+- Add delay feature to autotype [[#76](https://github.com/keepassxreboot/keepassxc/issues/76), [#77](https://github.com/keepassxreboot/keepassxc/issues/77)]
+- Add password strength meter [[#84](https://github.com/keepassxreboot/keepassxc/issues/84), [#92](https://github.com/keepassxreboot/keepassxc/issues/92)]
+- Add option for automatically locking the database when minimizing
+ the window [#57](https://github.com/keepassxreboot/keepassxc/issues/57)
+- Add feature to download favicons and use them as entry icons [#30](https://github.com/keepassxreboot/keepassxc/issues/30)
+- Automatically reload and merge database when the file changed on
+ disk [[#22](https://github.com/keepassxreboot/keepassxc/issues/22), [#33](https://github.com/keepassxreboot/keepassxc/issues/33), [#93](https://github.com/keepassxreboot/keepassxc/issues/93)]
+- Add tool for merging two databases [[#22](https://github.com/keepassxreboot/keepassxc/issues/22), [#47](https://github.com/keepassxreboot/keepassxc/issues/47), [#143](https://github.com/keepassxreboot/keepassxc/issues/143)]
+- Add --pw-stdin commandline option to unlock the database by providing
+ a password on STDIN [#54](https://github.com/keepassxreboot/keepassxc/issues/54)
+- Add utility script for reading the database password from KWallet [#55](https://github.com/keepassxreboot/keepassxc/issues/55)
+- Fix some KeePassHTTP settings not being remembered [[#34](https://github.com/keepassxreboot/keepassxc/issues/34), [#65](https://github.com/keepassxreboot/keepassxc/issues/65)]
+- Make search box persistent [[#15](https://github.com/keepassxreboot/keepassxc/issues/15), [#67](https://github.com/keepassxreboot/keepassxc/issues/67), [#157](https://github.com/keepassxreboot/keepassxc/issues/157)]
+- Enhance search feature by scoping the search to selected group [[#16](https://github.com/keepassxreboot/keepassxc/issues/16), [#118](https://github.com/keepassxreboot/keepassxc/issues/118)]
+- Improve interaction between search field and entry list [[#131](https://github.com/keepassxreboot/keepassxc/issues/131), [#141](https://github.com/keepassxreboot/keepassxc/issues/141)]
+- Add stand-alone password-generator [[#18](https://github.com/keepassxreboot/keepassxc/issues/18), [#92](https://github.com/keepassxreboot/keepassxc/issues/92)]
+- Don't require password repetition when password is visible [[#27](https://github.com/keepassxreboot/keepassxc/issues/27), [#92](https://github.com/keepassxreboot/keepassxc/issues/92)]
+- Add support for entry attributes in autotype sequences [#107](https://github.com/keepassxreboot/keepassxc/issues/107)
+- Always focus password field when opening the database unlock widget [[#116](https://github.com/keepassxreboot/keepassxc/issues/116), [#117](https://github.com/keepassxreboot/keepassxc/issues/117)]
+- Fix compilation errors on various platforms [[#53](https://github.com/keepassxreboot/keepassxc/issues/53), [#126](https://github.com/keepassxreboot/keepassxc/issues/126), [#130](https://github.com/keepassxreboot/keepassxc/issues/130)]
+- Restructure and improve kdbx-extract utility [#160](https://github.com/keepassxreboot/keepassxc/issues/160)
+
+## 2.0.3 (2016-09-04)
+
+- Improved error reporting when reading / writing databases fails. [[#450](https://github.com/keepassxreboot/keepassxc/issues/450), [#462](https://github.com/keepassxreboot/keepassxc/issues/462)]
+- Display an error message when opening a custom icon fails.
+- Detect custom icon format based on contents instead of the filename. [#512](https://github.com/keepassxreboot/keepassxc/issues/512)
+- Keep symlink intact when saving databases. [#442](https://github.com/keepassxreboot/keepassxc/issues/442).
+- Fix a crash when deleting parent group of recycle bin. [#520](https://github.com/keepassxreboot/keepassxc/issues/520)
+- Display a confirm dialog before moving an entry to the recycle bin. [#447](https://github.com/keepassxreboot/keepassxc/issues/447)
+- Repair UUIDs of inconsistent history items. [#130](https://github.com/keepassxreboot/keepassxc/issues/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](https://github.com/keepassxreboot/keepassxc/issues/390)
+- Disable password generator when showing entry in history mode. [#422](https://github.com/keepassxreboot/keepassxc/issues/422)
+- Strip invalid XML chars when writing databases. [#392](https://github.com/keepassxreboot/keepassxc/issues/392)
+- Add repair function to fix databases with invalid XML chars. [#392](https://github.com/keepassxreboot/keepassxc/issues/392)
+- Display custom icons scaled. [#322](https://github.com/keepassxreboot/keepassxc/issues/322)
+- Allow opening databases that have no password and keyfile. [#391](https://github.com/keepassxreboot/keepassxc/issues/391)
+- Fix crash when importing .kdb files with invalid icon ids. [#425](https://github.com/keepassxreboot/keepassxc/issues/425)
+- Update translations.
+
+## 2.0 (2015-12-06)
+
+- Improve UI of the search edit.
+- Clear clipboard when locking databases. [#342](https://github.com/keepassxreboot/keepassxc/issues/342)
+- Enable Ctrl+M shortcut to minimize the window on all platforms. [#329](https://github.com/keepassxreboot/keepassxc/issues/329)
+- Show a better message when trying to open an old database format. [#338](https://github.com/keepassxreboot/keepassxc/issues/338)
+- Fix global auto-type behavior with some window managers.
+- Show global auto-type window on the active desktop. [#359](https://github.com/keepassxreboot/keepassxc/issues/359)
+- Disable systray on OS X. [#326](https://github.com/keepassxreboot/keepassxc/issues/326)
+- Restore main window when clicking on the OS X docker icon. [#326](https://github.com/keepassxreboot/keepassxc/issues/326)
+
+## 2.0 Beta 2 (2015-09-06)
+
+- Fix crash when locking with search UI open [#309](https://github.com/keepassxreboot/keepassxc/issues/309)
+- Fix file locking on Mac OS X [#327](https://github.com/keepassxreboot/keepassxc/issues/327)
+- Set default extension when saving a database [[#79](https://github.com/keepassxreboot/keepassxc/issues/79), [#308](https://github.com/keepassxreboot/keepassxc/issues/308)]
+
+## 2.0 Beta 1 (2015-07-18)
+
+- Remember entry column sizes [#159](https://github.com/keepassxreboot/keepassxc/issues/159)
+- Add translations
+- Support opening attachments directly
+- Support cmd:// URLs [#244](https://github.com/keepassxreboot/keepassxc/issues/244)
+- Protect opened databases with a file lock [#18](https://github.com/keepassxreboot/keepassxc/issues/18)
+- Export to csv files [#57](https://github.com/keepassxreboot/keepassxc/issues/57)
+- Add optional tray icon [#153](https://github.com/keepassxreboot/keepassxc/issues/153)
+- Allow setting the default auto-type sequence for groups [#175](https://github.com/keepassxreboot/keepassxc/issues/175)
+- Make the kdbx parser more lenient
+- Remove --password command line option [#285](https://github.com/keepassxreboot/keepassxc/issues/285)
+
+## 2.0 Alpha 6 (2014-04-12)
+
+- Add option to lock databases after user inactivity [#62](https://github.com/keepassxreboot/keepassxc/issues/62)
+- Add compatibility with libgcrypt 1.6 [#129](https://github.com/keepassxreboot/keepassxc/issues/129)
+- Display passwords in monospace font [#51](https://github.com/keepassxreboot/keepassxc/issues/51)
+- Use an icon for the button that shows/masks passwords [#38](https://github.com/keepassxreboot/keepassxc/issues/38)
+- Add an option to show passwords by default [#93](https://github.com/keepassxreboot/keepassxc/issues/93)
+- Improve password generator design [#122](https://github.com/keepassxreboot/keepassxc/issues/122)
+- On Linux link .kdbx files with KeePassX
+- Remember window size [#154](https://github.com/keepassxreboot/keepassxc/issues/154)
+- Disallow global auto-typing when the database is locked
+
+## 2.0 Alpha 5 (2013-12-20)
+
+- Support copying entries and groups using drag'n'drop [#74](https://github.com/keepassxreboot/keepassxc/issues/74)
+- Open last used databases on startup [#36](https://github.com/keepassxreboot/keepassxc/issues/36)
+- Made the kdbx file parser more robust
+- Only edit entries on doubleclick (not single) or with enter key
+- Allow removing multiple entries
+- Added option to minimize window when copying data to clipboard
+- Save password generator settings
+- Fixed auto-type producing wrong chars in some keyboard configurations [#116](https://github.com/keepassxreboot/keepassxc/issues/116)
+- Added some more actions to the toolbar
+
+## 2.0 Alpha 4 (2013-03-29)
+
+- Add random password generator [#52](https://github.com/keepassxreboot/keepassxc/issues/52)
+- Merge the 'Description' tab into the 'Entry' tab [#59](https://github.com/keepassxreboot/keepassxc/issues/59)
+- Fix crash when deleting history items [#56](https://github.com/keepassxreboot/keepassxc/issues/56)
+- Fix crash on Mac OS X Mountain Lion during startup [#50](https://github.com/keepassxreboot/keepassxc/issues/50)
+- Improved KeePassX application icon [#58](https://github.com/keepassxreboot/keepassxc/issues/58)
+
+## 2.0 Alpha 3 (2012-10-27)
+
+- Auto-Type on Linux / X11
+- Database locking
+- Fix database corruption when changing key transformation rounds [#34](https://github.com/keepassxreboot/keepassxc/issues/34)
+- Verify header data of kdbx files
+- Add menu entry to open URLs in the browser
+- Add menu entry to copy an entry attribute to clipboard
+
+## 2.0 Alpha 2 (2012-07-02)
+
+- Import kdb (KeePass 1) files [#2](https://github.com/keepassxreboot/keepassxc/issues/2)
+- Display history items [#23](https://github.com/keepassxreboot/keepassxc/issues/23)
+- Implement history item limits [#16](https://github.com/keepassxreboot/keepassxc/issues/16)
+- Group and entry icons can be set [#22](https://github.com/keepassxreboot/keepassxc/issues/22)
+- Add keyboard shortcuts
+- Search in databases [#24](https://github.com/keepassxreboot/keepassxc/issues/24)
+- Sortable entry view
+- Support building Mac OS X bundles
+
+## 2.0 Alpha 1 (2012-05-07)
+
+- First release.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 74b1a7ff0..226460987 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,6 +27,13 @@ string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+# Use the Compiler Cache (ccache) if it is installed
+# (install with: sudo apt get ccache)
+find_program (CCACHE_FOUND ccache)
+if (CCACHE_FOUND)
+ set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+endif (CCACHE_FOUND)
+
# Support Visual Studio Code
include(CMakeToolsHelpers OPTIONAL)
@@ -50,6 +57,9 @@ option(WITH_XC_YUBIKEY "Include YubiKey support." OFF)
option(WITH_XC_SSHAGENT "Include SSH agent support." OFF)
option(WITH_XC_KEESHARE "Sharing integration with KeeShare (requires quazip5 for secure containers)" OFF)
option(WITH_XC_UPDATECHECK "Include automatic update checks; disable for controlled distributions" ON)
+if(UNIX AND NOT APPLE)
+ option(WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API." OFF)
+endif()
if(APPLE)
option(WITH_XC_TOUCHID "Include TouchID support for macOS." OFF)
endif()
@@ -65,6 +75,9 @@ if(WITH_XC_ALL)
if(APPLE)
set(WITH_XC_TOUCHID ON)
endif()
+ if(UNIX AND NOT APPLE)
+ set(WITH_XC_FDOSECRETS ON)
+ endif()
endif()
if(WITH_XC_SSHAGENT OR WITH_XC_KEESHARE)
@@ -80,8 +93,8 @@ if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
endif()
set(KEEPASSXC_VERSION_MAJOR "2")
-set(KEEPASSXC_VERSION_MINOR "4")
-set(KEEPASSXC_VERSION_PATCH "3")
+set(KEEPASSXC_VERSION_MINOR "5")
+set(KEEPASSXC_VERSION_PATCH "0")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
@@ -160,15 +173,16 @@ if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
set(IS_32BIT TRUE)
endif()
+set(CLANG_COMPILER_ID_REGEX "^(Apple)?[Cc]lang$")
if("${CMAKE_C_COMPILER}" MATCHES "clang$"
OR "${CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS}" MATCHES "__clang__"
- OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
+ OR "${CMAKE_C_COMPILER_ID}" MATCHES ${CLANG_COMPILER_ID_REGEX})
set(CMAKE_COMPILER_IS_CLANG 1)
endif()
if("${CMAKE_CXX_COMPILER}" MATCHES "clang(\\+\\+)?$"
OR "${CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS}" MATCHES "__clang__"
- OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ OR "${CMAKE_CXX_COMPILER_ID}" MATCHES ${CLANG_COMPILER_ID_REGEX})
set(CMAKE_COMPILER_IS_CLANGXX 1)
endif()
@@ -247,6 +261,15 @@ if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcast-align")
endif()
+if(WITH_COVERAGE AND CMAKE_COMPILER_IS_CLANGXX)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
+ # then:
+ # $ llvm-profdata merge -sparse default.profraw -o default.profdata
+ # $ llvm-cov show ./tests/${the_test_binary} \
+ # -format=html -instr-profile=default.profdata -output-dir=./coverages \
+ # `find src -iname '*.h' -or -iname '*.cpp'`
+endif()
+
if(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
endif()
@@ -270,7 +293,7 @@ if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9.
add_gcc_compiler_cxxflags("-fsized-deallocation")
endif()
-if(APPLE)
+if(APPLE AND CMAKE_COMPILER_IS_CLANGXX)
add_gcc_compiler_cxxflags("-stdlib=libc++")
endif()
diff --git a/COPYING b/COPYING
index b3eddd766..9bfd33539 100644
--- a/COPYING
+++ b/COPYING
@@ -1,5 +1,5 @@
KeePassXC - http://www.keepassxc.org/
-Copyright (C) 2016-2017 KeePassXC Team <team@keepassxc.org>
+Copyright (C) 2016-2019 KeePassXC Team <team@keepassxc.org>
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
@@ -27,7 +27,7 @@ Copyright: 2010-2012, Felix Geyer <debfx@fobos.de>
2000-2008, Tom Sato <VEF00200@nifty.ne.jp>
2013, Laszlo Papp <lpapp@kde.org>
2013, David Faure <faure@kde.org>
- 2016-2018, KeePassXC Team <team@keepassxc.org>
+ 2016-2019, KeePassXC Team <team@keepassxc.org>
License: GPL-2 or GPL-3
Comment: The "KeePassXC Team" in every copyright notice is formed by the following people:
@@ -160,11 +160,11 @@ Comment: based on Nuvola icon theme
Files: share/icons/application/*/actions/application-exit.png
share/icons/application/*/actions/chronometer.png
share/icons/application/*/actions/configure.png
+ share/icons/application/*/actions/database-lock.png
share/icons/application/*/actions/dialog-close.png
share/icons/application/*/actions/dialog-ok.png
share/icons/application/*/actions/document-close.png
share/icons/application/*/actions/document-edit.png
- share/icons/application/*/actions/document-encrypt.png
share/icons/application/*/actions/document-new.png
share/icons/application/*/actions/document-open.png
share/icons/application/*/actions/document-properties.png
@@ -241,3 +241,10 @@ License: LGPL-2.1
Files: share/macosx/dmg-background.tiff
Copyright: 2008-2014, Andrey Tarantsov
License: MIT
+
+Files: share/icons/application/scalable/apps/freedesktop.svg
+Copyright: GPL-2+
+Comment: from Freedesktop.org website
+
+Files: share/icons/application/32x32/actions/statistics.png
+Copyright: Icon made by Freepik from https://www.flaticon.com/free-icon/bars-chart_265733
diff --git a/INSTALL.md b/INSTALL.md
index e3da8bda7..e82fb53b1 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -27,6 +27,8 @@ The following libraries are required:
* libxi, libxtst, qtx11extras (optional for auto-type on X11)
* libsodium (>= 1.0.12)
* libargon2
+* qrencode
+* yubikey ykpers (optional to support YubiKey)
Prepare the Building Environment
================================
@@ -100,6 +102,7 @@ These steps place the compiled KeePassXC binary inside the `./build/src/` direct
-DWITH_XC_NETWORKING=[ON|OFF] Enable/Disable Networking support (e.g., favicon downloading) (default: OFF)
-DWITH_XC_SSHAGENT=[ON|OFF] Enable/Disable SSHAgent support (default: OFF)
-DWITH_XC_TOUCHID=[ON|OFF] (macOS Only) Enable/Disable Touch ID unlock (default:OFF)
+ -DWITH_XC_FDOSECRETS=[ON|OFF] (Linux Only) Enable/Disable Freedesktop.org Secrets Service support (default:OFF)
-DWITH_XC_KEESHARE=[ON|OFF] Enable/Disable KeeShare group synchronization extension (default: OFF)
-DWITH_XC_KEESHARE_SECURE=[ON|OFF] Enable/Disable KeeShare signed containers, requires libquazip5 (default: OFF)
-DWITH_XC_ALL=[ON|OFF] Enable/Disable compiling all plugins above (default: OFF)
diff --git a/README.md b/README.md
index fa0e4575f..a8ca4c4d4 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ so please check out your distribution's package list to see if KeePassXC is avai
- YubiKey challenge-response support
- TOTP generation
- CSV import
-- Command line interface
+- A [Command Line Interface (keepassxc-cli)](./share/docs/man/keepassxc-cli.1)
- DEP and ASLR hardening
- Stand-alone password and passphrase generator
- Password strength meter
@@ -33,7 +33,7 @@ so please check out your distribution's package list to see if KeePassXC is avai
- Synchronize passwords using KeeShare. See [Using Sharing](./docs/QUICKSTART.md#using-sharing) for more details.
- Many bug fixes
-For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document.
+For a full list of features and changes, read the [CHANGELOG](CHANGELOG.md) document.
For a full list of keyboard shortcuts, see [KEYBINDS](./docs/KEYBINDS.md)
## Building KeePassXC
diff --git a/cmake/FindReadline.cmake b/cmake/FindReadline.cmake
new file mode 100644
index 000000000..9d9691370
--- /dev/null
+++ b/cmake/FindReadline.cmake
@@ -0,0 +1,50 @@
+# Code copied from sethhall@github
+#
+# - Try to find readline include dirs and libraries
+#
+# Usage of this module as follows:
+#
+# find_package(Readline)
+#
+# Variables used by this module, they can change the default behaviour and need
+# to be set before calling find_package:
+#
+# Readline_ROOT_DIR Set this variable to the root installation of
+# readline if the module has problems finding the
+# proper installation path.
+#
+# Variables defined by this module:
+#
+# READLINE_FOUND System has readline, include and lib dirs found
+# Readline_INCLUDE_DIR The readline include directories.
+# Readline_LIBRARY The readline library.
+
+find_path(Readline_ROOT_DIR
+ NAMES include/readline/readline.h
+)
+
+find_path(Readline_INCLUDE_DIR
+ NAMES readline/readline.h
+ HINTS ${Readline_ROOT_DIR}/include
+)
+
+find_library(Readline_LIBRARY
+ NAMES readline
+ HINTS ${Readline_ROOT_DIR}/lib
+)
+
+if(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY)
+ set(READLINE_FOUND TRUE)
+else(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY)
+ find_library(Readline_LIBRARY NAMES readline)
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY )
+ mark_as_advanced(Readline_INCLUDE_DIR Readline_LIBRARY)
+endif(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY)
+
+mark_as_advanced(
+ Readline_ROOT_DIR
+ Readline_INCLUDE_DIR
+ Readline_LIBRARY
+)
+
diff --git a/cmake/GNUInstallDirs.cmake b/cmake/GNUInstallDirs.cmake
deleted file mode 100644
index 4dc2d68a4..000000000
--- a/cmake/GNUInstallDirs.cmake
+++ /dev/null
@@ -1,188 +0,0 @@
-# - Define GNU standard installation directories
-# Provides install directory variables as defined for GNU software:
-# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
-# Inclusion of this module defines the following variables:
-# CMAKE_INSTALL_<dir> - destination for files of a given type
-# CMAKE_INSTALL_FULL_<dir> - corresponding absolute path
-# where <dir> is one of:
-# BINDIR - user executables (bin)
-# SBINDIR - system admin executables (sbin)
-# LIBEXECDIR - program executables (libexec)
-# SYSCONFDIR - read-only single-machine data (etc)
-# SHAREDSTATEDIR - modifiable architecture-independent data (com)
-# LOCALSTATEDIR - modifiable single-machine data (var)
-# LIBDIR - object code libraries (lib or lib64 or lib/<multiarch-tuple> on Debian)
-# INCLUDEDIR - C header files (include)
-# OLDINCLUDEDIR - C header files for non-gcc (/usr/include)
-# DATAROOTDIR - read-only architecture-independent data root (share)
-# DATADIR - read-only architecture-independent data (DATAROOTDIR)
-# INFODIR - info documentation (DATAROOTDIR/info)
-# LOCALEDIR - locale-dependent data (DATAROOTDIR/locale)
-# MANDIR - man documentation (DATAROOTDIR/man)
-# DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME)
-# Each CMAKE_INSTALL_<dir> value may be passed to the DESTINATION options of
-# install() commands for the corresponding file type. If the includer does
-# not define a value the above-shown default will be used and the value will
-# appear in the cache for editing by the user.
-# Each CMAKE_INSTALL_FULL_<dir> value contains an absolute path constructed
-# from the corresponding destination by prepending (if necessary) the value
-# of CMAKE_INSTALL_PREFIX.
-
-#=============================================================================
-# Copyright 2011 Nikita Krupen'ko <krnekit@gmail.com>
-# Copyright 2011 Kitware, Inc.
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-# License text for the above reference.)
-
-# Installation directories
-#
-if(NOT DEFINED CMAKE_INSTALL_BINDIR)
- set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_SBINDIR)
- set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR)
- set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
- set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR)
- set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
- set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
- set(_LIBDIR_DEFAULT "lib")
- # Override this default 'lib' with 'lib64' iff:
- # - we are on Linux system but NOT cross-compiling
- # - we are NOT on debian
- # - we are on a 64 bits system
- # reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
- # For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if
- # CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu"
- # See http://wiki.debian.org/Multiarch
- if((CMAKE_SYSTEM_NAME MATCHES "Linux|kFreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "GNU")
- AND NOT CMAKE_CROSSCOMPILING)
- if (EXISTS "/etc/debian_version") # is this a debian system ?
- if(CMAKE_LIBRARY_ARCHITECTURE)
- set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
- endif()
- else() # not debian, rely on CMAKE_SIZEOF_VOID_P:
- if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
- message(AUTHOR_WARNING
- "Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
- "Please enable at least one language before including GNUInstallDirs.")
- else()
- if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
- set(_LIBDIR_DEFAULT "lib64")
- endif()
- endif()
- endif()
- endif()
- set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
- set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR)
- set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)")
-endif()
-
-if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR)
- set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)")
-endif()
-
-#-----------------------------------------------------------------------------
-# Values whose defaults are relative to DATAROOTDIR. Store empty values in
-# the cache and store the defaults in local variables if the cache values are
-# not set explicitly. This auto-updates the defaults as DATAROOTDIR changes.
-
-if(NOT CMAKE_INSTALL_DATADIR)
- set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)")
- set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}")
-endif()
-
-if(NOT CMAKE_INSTALL_INFODIR)
- set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)")
- set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info")
-endif()
-
-if(NOT CMAKE_INSTALL_LOCALEDIR)
- set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)")
- set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale")
-endif()
-
-if(NOT CMAKE_INSTALL_MANDIR)
- set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)")
- set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man")
-endif()
-
-if(NOT CMAKE_INSTALL_DOCDIR)
- set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)")
- set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}")
-endif()
-
-#-----------------------------------------------------------------------------
-
-mark_as_advanced(
- CMAKE_INSTALL_BINDIR
- CMAKE_INSTALL_SBINDIR
- CMAKE_INSTALL_LIBEXECDIR
- CMAKE_INSTALL_SYSCONFDIR
- CMAKE_INSTALL_SHAREDSTATEDIR
- CMAKE_INSTALL_LOCALSTATEDIR
- CMAKE_INSTALL_LIBDIR
- CMAKE_INSTALL_INCLUDEDIR
- CMAKE_INSTALL_OLDINCLUDEDIR
- CMAKE_INSTALL_DATAROOTDIR
- CMAKE_INSTALL_DATADIR
- CMAKE_INSTALL_INFODIR
- CMAKE_INSTALL_LOCALEDIR
- CMAKE_INSTALL_MANDIR
- CMAKE_INSTALL_DOCDIR
- )
-
-# Result directories
-#
-foreach(dir
- BINDIR
- SBINDIR
- LIBEXECDIR
- SYSCONFDIR
- SHAREDSTATEDIR
- LOCALSTATEDIR
- LIBDIR
- INCLUDEDIR
- OLDINCLUDEDIR
- DATAROOTDIR
- DATADIR
- INFODIR
- LOCALEDIR
- MANDIR
- DOCDIR
- )
- if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
- set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
- else()
- set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
- endif()
-endforeach()
diff --git a/docs/KEYBINDS.md b/docs/KEYBINDS.md
index a5984bfad..94e8b3daf 100644
--- a/docs/KEYBINDS.md
+++ b/docs/KEYBINDS.md
@@ -28,6 +28,7 @@ Toggle Passwords Hidden | Ctrl + Shift + C
Toggle Usernames Hidden | Ctrl + Shift + B
Focus Search | Ctrl + F
Clear Search | ESC
+Show Keyboard Shortcuts | Ctrl + /
diff --git a/docs/QUICKSTART.md b/docs/QUICKSTART.md
index c2afd0b98..1a2cd3dd4 100644
--- a/docs/QUICKSTART.md
+++ b/docs/QUICKSTART.md
@@ -1,51 +1,47 @@
# Quick Start for KeePassXC
-This procedure gets KeePassXC running on your computer with browser integration,
-using the pre-built binaries available for [download](https://keepassxc.org/download)
-from [KeePassXC site](https://keepassxc.org).
+This procedure gets KeePassXC running on your computer with browser integration, using the pre-built binaries available for [download](https://keepassxc.org/download) from [KeePassXC site](https://keepassxc.org).
**TL;DR** KeePassXC saves your passwords securely.
When you double-click a URL in KeePassXC, it launches your default browser to that URL.
-With browser integration configured, KeePassXC automatically enters
-username/password credentials into web page fields.
+With browser integration configured, KeePassXC automatically enters username/password credentials into web page fields.
## Installing and Starting KeePassXC
-* [Download the native installer](https://keepassxc.org/download) and install
-KeePassXC for your Windows, macOS, or Linux computer in the usual way for your platform.
-* Open the KeePassXC application.
-* Create a new database and give it a master key that's used to unlock the database file.
-This database holds entries (usernames, passwords, account numbers, notes)
-for all your websites, programs, etc.
-* Create a few entries - enter the username, password, URL, and optionally notes about the entry.
-* KeePassXC securely stores those entries in the database.
-
+1. [Download the native installer](https://keepassxc.org/download) and install KeePassXC for your Windows, macOS, or Linux computer in the usual way for your platform.
+1. Open the KeePassXC application.
+1. Create a new database and give it a master key that's used to unlock the database file.
+This database holds entries (usernames, passwords, account numbers, notes) for all your websites, programs, etc.
+1. Create a few entries - enter the username, password, URL, and optionally notes about the entry.
+1. KeePassXC securely stores those entries in the database.
## Setting up Browser Integration with KeePassXC
-* *Within KeePassXC*, go to **Tools->Settings** (on macOS, go to **KeePassXC->Preferences**.)
-* In **Browser Integration**, check **Enable KeePassXC browser integration**
-* Right below that, click the checkbox for the browser(s) you use
+1. *Within KeePassXC*, go to **Tools &rarr; Settings** (on macOS, go to **KeePassXC &rarr; Preferences**).
+1. In **Browser Integration**, check **Enable KeePassXC browser integration**.
+1. Right below that, click the checkbox for the browser(s) you use.
Leave the other options at their defaults.
-* *In your default web browser,* install the KeePassXC Browser extension/add-on. Instructions for [Firefox or Tor Browser](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) or [Chrome](https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk)
-* Click the KeePassXC icon in the upper-right corner. You'll see the dialog below.
-* Click the blue Connect button to make the browser extension connect to the KeePassXC application.
-<img src="./KeePassHTTP/KeePassXC-Connect.png" height="200" alt="KeePassXC Connect dialog">
+1. *In your default web browser,* install the KeePassXC Browser extension/add-on. Instructions for [Firefox or Tor Browser](https://addons.mozilla.org/firefox/addon/keepassxc-browser/) or [Chrome or Chromium](https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk).
+1. Click the KeePassXC icon in the upper-right corner. You'll see the dialog below.
+1. Click the blue Connect button to make the browser extension connect to the KeePassXC application.
+
+&nbsp;<img src="./KeePassHTTP/KeePassXC-Connect.png" height="200" alt="KeePassXC Connect Dialog">
+
+7. *Switch back to KeePassXC.* You'll see a dialog (below) indicating that a request to connect has arrived.
+7. Give the connection a name (perhaps *Keepass-Browsername*, any unique name will suffice) and click OK to accept it.
+7. This one-time operation connects KeePassXC and your browser.
-* *Switch back to KeePassXC.* You'll see a dialog (below) indicating that a request to connect has arrived.
-* Give the connection a name (perhaps *Keepass-Browsername*, any unique name will suffice) and click OK to accept it.
-* This one-time operation connects KeePassXC and your browser.
-<img src="./KeePassHTTP/KeePassXC-Accept-Button.png" height="200" alt="KeePassXC accept connection dialog">
+<img src="./KeePassHTTP/KeePassXC-Accept-Button.png" height="200" alt="KeePassXC Accept Connection Dialog">
## Using Browser Integration
-* *Within KeePassXC,* double-click the URL of an entry,
-or select it and type Ctrl+U (Cmd+U on macOS).
-* Your browser opens to that URL.
-* If there are username/password fields on that page, you will see the dialog below.
-Click *Allow* to confirm that KeePassXC may access the credentials to auto-fill the fields.
-* Check *Remember this decision* to allow this each time you visit the page.
-<img src="./KeePassHTTP/KeePassXC-Confirm.png" height="200" alt="KeePassCX Confirm Access dialog">
+1. *Within KeePassXC,* double-click the URL of an entry, or select it and type Ctrl+U (Cmd+U on macOS).
+1. Your browser opens to that URL.
+1. If there are username/password fields on that page, you will see the dialog below.
+Click *Allow* to confirm that KeePassXC may access the credentials to auto-fill the fields.
+1. Check *Remember this decision* to allow this each time you visit the page.
+
+<img src="./KeePassHTTP/KeePassXC-Confirm.png" height="200" alt="KeePassCX Confirm Access Dialog">
## Using Sharing
@@ -55,26 +51,26 @@ Sharing allows you to share a subset of your credentials with others and vice ve
To use sharing, you need to enable for the application.
-1. Go to Tools &rarr; Settings
-2. Select the category KeeShare
-3. Check _Allow import_ if you want to import shared credentials
-4. Check _Allow export_ if you want to share credentials
+1. Go to Tools &rarr; Settings.
+1. Select the category KeeShare.
+1. Check _Allow import_ if you want to import shared credentials.
+1. Check _Allow export_ if you want to share credentials.
-To make sure that your data is valid when im imported by another client, please _generate_ (or _import_) a public/private key pair and enter your _signer_ name. This way your client may verify that the imported data is valid. When Importing, you'll see the known sources with names and fingerprint in the list at the bottom. This is the place to _trust_ or _untrust_ signers. It is only possible to trust someone on application level.
+To make sure that your data is valid when imported by another client, please _generate_ (or _import_) a public/private key pair and enter your _signer_ name. This way your client may verify that the imported data is valid. When Importing, you'll see the known sources with names and fingerprint in the list at the bottom. This is the place to _trust_ or _untrust_ signers. It is only possible to trust someone on application level.
<img src="./KeeShare/AppSettings.png" height="600" width="800" alt="KeeShare Application Settings">
### Sharing Credentials
-If you checked _Allow export_ in the Sharing settings you now are good to go to share some passwords with others. Sharing always is defined on a group. If you enable sharing on a group, every entry under this group or it's children is shared. If you enable sharing on the root node, **every password** inside your database gets shared!
+If you checked _Allow export_ in the Sharing settings you now are good to go to share some passwords with others. Sharing always is defined on a group. If you enable sharing on a group, every entry under this group or its children is shared. If you enable sharing on the root node, **every password** inside your database gets shared!
-1. Open the edit sheet on a group you want to share
-1. Select the sharing section
-1. Choose _Export to path_ as the sharing method
-1. Choose a path to store the shared credentials to
-1. Generate a password for this share container
+1. Open the edit sheet on a group you want to share.
+1. Select the sharing section.
+1. Choose _Export to path_ as the sharing method.
+1. Choose a path to store the shared credentials to.
+1. Generate a password for this share container.
-The export file will not be generated automatically. Instead, each time the database is saved, the file gets written (so please deactivate the autosafe feature). If an old file is present, the old file will be overwritten! The file should be written to a location that is accessible by others. An easy setup is a network share or storing the file inside the cloud.
+The export file will not be generated automatically. Instead, each time the database is saved, the file gets written (so please deactivate the autosafe feature). If an old file is present, the old file will be overwritten! The file should be written to a location that is accessible by others. An easy setup is a network share or storing the file inside the cloud.
<img src="./KeeShare/GroupSettings_Export.png" height="600" width="800" alt="KeeShare Group Sharing Settings">
@@ -82,14 +78,14 @@ The export file will not be generated automatically. Instead, each time the data
Checking _Allow import_ in the Sharing settings of the database enables you to receive credentials from others. KeePass will watch sharing sources and import any changes immediately into your database using the synchronization feature.
-1. Create a group for import
-1. Open the edit sheet on that group
-1. Select the sharing section
-1. Choose _Import from path_ as the sharing method
-1. Choose a share container that is shared with you
-1. Enter the password for the shared container
+1. Create a group for import.
+1. Open the edit sheet on that group.
+1. Select the sharing section.
+1. Choose _Import from path_ as the sharing method.
+1. Choose a share container that is shared with you.
+1. Enter the password for the shared container.
-KeeShare observes the container for changes and merges them into your database when necessary. Importing merges in time order, so older data is moved to the history, which should have a sufficient size to prevent loss of needed data.
+KeeShare observes the container for changes and merges them into your database when necessary. Importing merges in time order, so older data is moved to the history, which should have a sufficient size to prevent loss of needed data.
Please note, that the import currently is not restricted to the configured group. Every entry which was imported and moved outside the import group will be updated regardless of it's location!
@@ -99,11 +95,11 @@ Please note, that the import currently is not restricted to the configured group
Instead of using different groups for sharing and importing you can use a single group that acts as both. This way you can synchronize a number of credentials easily across many users without a lot of hassle.
-1. Open the edit sheet on a group you want to synchronize
-1. Select the sharing section
-1. Choose _Synchronize with path_ as the sharing method
-1. Choose a database that you want to use a synchronization file
-1. Enter the password for the database
+1. Open the edit sheet on a group you want to synchronize.
+1. Select the sharing section.
+1. Choose _Synchronize with path_ as the sharing method.
+1. Choose a database that you want to use a synchronization file.
+1. Enter the password for the database.
<img src="./KeeShare/GroupSettings_Sync.png" height="600" width="800" alt="KeeShare Group Synchronization Settings">
@@ -111,14 +107,14 @@ Instead of using different groups for sharing and importing you can use a single
In case you don't want to share (import or export) some credentials, it is possible to you can
* use the application settings and uncheck the options or
-* instead of selecting _Import from path_, _Export to path_ or _Synchronize with path_ you'll select _Inactive_ while leaving the path and the password untouched
+* instead of selecting _Import from path_, _Export to path_ or _Synchronize with path_ you'll select _Inactive_ while leaving the path and the password untouched.
### Sharing overview
There is a simple overview of shared groups to keep track of your data.
-1. Open the Database Settings
-1. Select the KeeShare category
+1. Open the Database Settings.
+1. Select the KeeShare category.
<img src="./KeeShare/DatabaseSettings.png" height="600" width="800" alt="KeeShare Group Sharing Ovewview">
@@ -128,4 +124,14 @@ Sharing relies on the combination of file exports and imports as well as the syn
KeeShare uses a custom certification mechanism to ensure that the source of the data is the expected one. This ensures that the data was exported by the signer but it is not possible to detect if someone replaced the data with an older version from a valid signer. To prevent this, the container could be placed at a location which is only writeable for valid signers.
+## Using Auto Open
+
+The Auto Open feature automatically loads and unlocks additional databases when you unlock your main database.
+In order to use this functionnality, do the following:
+1. Create a group called **AutoOpen** at the root of your main database.
+1. In this group, create a new entry for each database that should be opened automatically:
+ * Put the *password of the database* in the **Password** field
+ * Put the *path to the database's file* in the **URL** field* (it can be formatted either as **file://**, a **/path/to/the/file** form, or a relative file path.)
+ * If the extra database requires a keyfile to be unlocked, put the *path to the keyfile* in the **Username** field. The path options are the same as for the database's file in the URL field.
+1. The next time you unlock your database these databases will be opened and unlocked automatically.
diff --git a/release-tool b/release-tool
index 821a1e8c1..779d73753 100755
--- a/release-tool
+++ b/release-tool
@@ -231,7 +231,7 @@ checkOutputDirDoesNotExist() {
}
checkGitRepository() {
- if [ ! -d .git ] || [ ! -f CHANGELOG ]; then
+ if [ ! -d .git ] || [ ! -f CHANGELOG.md ]; then
exitError "Source directory is not a valid Git repository!"
fi
}
@@ -287,13 +287,13 @@ checkVersionInCMake() {
}
checkChangeLog() {
- if [ ! -f CHANGELOG ]; then
+ if [ ! -f CHANGELOG.md ]; then
exitError "No CHANGELOG file found!"
fi
- grep -qPzo "${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n=+\n" CHANGELOG
+ grep -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md
if [ $? -ne 0 ]; then
- exitError "'CHANGELOG' has not been updated to the '${RELEASE_NAME}' release!"
+ exitError "'CHANGELOG.md' has not been updated to the '${RELEASE_NAME}' release!"
fi
}
@@ -498,8 +498,8 @@ merge() {
fi
fi
- CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n?(?:.|\n)+?\n(?=\n)" \
- CHANGELOG | grep -Pzo '(?<=\n\n)(.|\n)+' | tr -d \\0)
+ CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n\n)\n?(?:.|\n)+?\n(?=## )" CHANGELOG.md \
+ | sed 's/^### //' | tr -d \\0)
COMMIT_MSG="Release ${RELEASE_NAME}"
logInfo "Checking out target branch '${TARGET_BRANCH}'..."
@@ -699,6 +699,10 @@ EOF
appimage_name="KeePassXC-${RELEASE_NAME}-x86_64.AppImage"
fi
+ # Allow appimagetool to insert version information into the AppImage to allow
+ # desktop integration tools to display that in app launchers
+ export VERSION="${RELEASE_NAME}"
+
# Run appimagetool to package (and possibly sign) AppImage
# --no-appstream is required, since it may crash on newer systems
# see: https://github.com/AppImage/AppImageKit/issues/856
diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt
index 635ee5963..3a088bb88 100644
--- a/share/CMakeLists.txt
+++ b/share/CMakeLists.txt
@@ -39,6 +39,8 @@ if(APPLE)
install(FILES macosx/keepassxc.icns DESTINATION ${DATA_INSTALL_DIR})
endif()
+install(DIRECTORY docs/ DESTINATION ${DATA_INSTALL_DIR}/docs FILES_MATCHING PATTERN "*.pdf")
+
install(DIRECTORY wizard/ DESTINATION ${DATA_INSTALL_DIR}/wizard FILES_MATCHING PATTERN "*.png")
install(DIRECTORY icons/application/ DESTINATION ${DATA_INSTALL_DIR}/icons/application
diff --git a/share/demo.kdbx b/share/demo.kdbx
new file mode 100644
index 000000000..71795676a
--- /dev/null
+++ b/share/demo.kdbx
Binary files differ
diff --git a/share/demo.key b/share/demo.key
new file mode 100644
index 000000000..d97c5eada
--- /dev/null
+++ b/share/demo.key
@@ -0,0 +1 @@
+secret
diff --git a/share/docs/KeePassXC_GettingStarted.pdf b/share/docs/KeePassXC_GettingStarted.pdf
new file mode 100644
index 000000000..2ae781ae9
--- /dev/null
+++ b/share/docs/KeePassXC_GettingStarted.pdf
Binary files differ
diff --git a/share/docs/KeePassXC_UserGuide.pdf b/share/docs/KeePassXC_UserGuide.pdf
new file mode 100644
index 000000000..9f9379e81
--- /dev/null
+++ b/share/docs/KeePassXC_UserGuide.pdf
Binary files differ
diff --git a/share/docs/man/keepassxc-cli.1 b/share/docs/man/keepassxc-cli.1
new file mode 100644
index 000000000..15d0fedc1
--- /dev/null
+++ b/share/docs/man/keepassxc-cli.1
@@ -0,0 +1,251 @@
+.TH KEEPASSXC-CLI 1 "June 15, 2019"
+
+.SH NAME
+keepassxc-cli \- command line interface for the \fBKeePassXC\fP password manager.
+
+.SH SYNOPSIS
+.B keepassxc-cli
+.I command
+.B [
+-I options
+.B ]
+
+.SH DESCRIPTION
+\fBkeepassxc-cli\fP is the command line interface for the \fBKeePassXC\fP password manager. It provides the ability to query and modify the entries of a KeePass database, directly from the command line.
+
+.SH COMMANDS
+
+.IP "add [options] <database> <entry>"
+Adds a new entry to a database. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option).
+The same password generation options as documented for the generate command can be used when the \fI-g\fP option is set.
+
+.IP "analyze [options] <database>"
+Analyzes passwords in a database for weaknesses.
+
+.IP "clip [options] <database> <entry> [timeout]"
+Copies the password or the current TOTP (\fI-t\fP option) of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard.
+
+.IP "close"
+In interactive mode, closes the currently opened database (see \fIopen\fP).
+
+.IP "create [options] <database>"
+Creates a new database with a key file and/or password. The key file will be created if the file that is referred to does not exist. If both the key file and password are empty, no database will be created.
+
+.IP "diceware [options]"
+Generates a random diceware passphrase.
+
+.IP "edit [options] <database> <entry>"
+Edits a database entry. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option).
+The same password generation options as documented for the generate command can be used when the \fI-g\fP option is set.
+
+.IP "estimate [options] [password]"
+Estimates the entropy of a password. The password to estimate can be provided as a positional argument, or using the standard input.
+
+.IP "exit"
+Exits interactive mode. Synonymous with \fIquit\fP.
+
+.IP "export [options] <database>"
+Exports the content of a database to standard output in the specified format (defaults to XML).
+
+.IP "generate [options]"
+Generates a random password.
+
+.IP "help [command]"
+Displays a list of available commands, or detailed information about the specified command.
+
+.IP "import [options] <xml> <database>"
+Imports the contents of an XML database to the target database.
+
+.IP "locate [options] <database> <term>"
+Locates all the entries that match a specific search term in a database.
+
+.IP "ls [options] <database> [group]"
+Lists the contents of a group in a database. If no group is specified, it will default to the root group.
+
+.IP "merge [options] <database1> <database2>"
+Merges two databases together. The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge. In the case that both databases make use of the same credentials, the \fI--same-credentials\fP or \fI-s\fP option can be used.
+
+.IP "mkdir [options] <database> <group>"
+Adds a new group to a database.
+
+.IP "mv [options] <database> <entry> <group>"
+Moves an entry to a new group.
+
+.IP "open [options] <database>"
+Opens the given database in a shell-style interactive mode. This is useful for performing multiple operations on a single database (e.g. \fIls\fP followed by \fIshow\fP).
+
+.IP "quit"
+Exits interactive mode. Synonymous with \fIexit\fP.
+
+.IP "rm [options] <database> <entry>"
+Removes an entry from a database. If the database has a recycle bin, the entry will be moved there. If the entry is already in the recycle bin, it will be removed permanently.
+
+.IP "rmdir [options] <database> <group>"
+Removes a group from a database. If the database has a recycle bin, the group will be moved there. If the group is already in the recycle bin, it will be removed permanently.
+
+.IP "show [options] <database> <entry>"
+Shows the title, username, password, URL and notes of a database entry. Can also show the current TOTP. Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the \fIclip\fP command section also applies here.
+
+.SH OPTIONS
+
+.SS "General options"
+
+.IP "--debug-info"
+Displays debugging information.
+
+.IP "-k, --key-file <path>"
+Specifies a path to a key file for unlocking the database. In a merge operation this option, is used to specify the key file path for the first database.
+
+.IP "--no-password"
+Deactivates the password key for the database.
+
+.IP "-y, --yubikey <slot>"
+Specifies a yubikey slot for unlocking the database. In a merge operation this option is used to specify the yubikey slot for the first database.
+
+.IP "-q, --quiet <path>"
+Silences password prompt and other secondary outputs.
+
+.IP "-h, --help"
+Displays help information.
+
+.IP "-v, --version"
+Displays the program version.
+
+
+.SS "Merge options"
+
+.IP "-d, --dry-run <path>"
+Prints the changes detected by the merge operation without making any changes to the database.
+
+.IP "-f, --key-file-from <path>"
+Sets the path of the key file for the second database.
+
+.IP "--no-password-from"
+Deactivates password key for the database to merge from.
+
+.IP "--yubikey-from <slot>"
+Yubikey slot for the second database.
+
+.IP "-s, --same-credentials"
+Uses the same credentials for unlocking both databases.
+
+
+.SS "Add and edit options"
+The same password generation options as documented for the generate command can be used
+with those 2 commands when the -g option is set.
+
+.IP "-u, --username <username>"
+Specifies the username of the entry.
+
+.IP "--url <url>"
+Specifies the URL of the entry.
+
+.IP "-p, --password-prompt"
+Uses a password prompt for the entry's password.
+
+.IP "-g, --generate"
+Generates a new password for the entry.
+
+
+.SS "Edit options"
+
+.IP "-t, --title <title>"
+Specifies the title of the entry.
+
+
+.SS "Estimate options"
+
+.IP "-a, --advanced"
+Performs advanced analysis on the password.
+
+
+.SS "Analyze options"
+
+.IP "-H, --hibp <filename>"
+Checks if any passwords have been publicly leaked, by comparing against the given
+list of password SHA-1 hashes, which must be in "Have I Been Pwned" format. Such
+files are available from https://haveibeenpwned.com/Passwords; note that they
+are large, and so this operation typically takes some time (minutes up to an
+hour or so).
+
+
+.SS "Clip options"
+
+.IP "-t, --totp"
+Copies the current TOTP instead of current password to clipboard. Will report
+an error if no TOTP is configured for the entry.
+
+
+.SS "Show options"
+
+.IP "-a, --attributes <attribute>..."
+Shows the named attributes. This option can be specified more than once,
+with each attribute shown one-per-line in the given order. If no attributes are
+specified and \fI-t\fP is not specified, a summary of the default attributes is given.
+
+.IP "-t, --totp"
+Also shows the current TOTP, reporting an error if no TOTP is configured for
+the entry.
+
+
+.SS "Diceware options"
+
+.IP "-W, --words <count>"
+Sets the desired number of words for the generated passphrase. [Default: 7]
+
+.IP "-w, --word-list <path>"
+Sets the Path of the wordlist for the diceware generator. The wordlist must
+have > 1000 words, otherwise the program will fail. If the wordlist has < 4000
+words a warning will be printed to STDERR.
+
+
+.SS "Export options"
+
+.IP "-f, --format"
+Format to use when exporting. Available choices are xml or csv. Defaults to xml.
+
+
+.SS "List options"
+
+.IP "-R, --recursive"
+Recursively lists the elements of the group.
+
+.IP "-f, --flatten"
+Flattens the output to single lines. When this option is enabled, subgroups and subentries will be displayed with a relative group path instead of indentation.
+
+.SS "Generate options"
+
+.IP "-L, --length <length>"
+Sets the desired length for the generated password. [Default: 16]
+
+.IP "-l --lower"
+Uses lowercase characters for the generated password. [Default: Enabled]
+
+.IP "-U --upper"
+Uses uppercase characters for the generated password. [Default: Enabled]
+
+.IP "-n --numeric"
+Uses numbers characters for the generated password. [Default: Enabled]
+
+.IP "-s --special"
+Uses special characters for the generated password. [Default: Disabled]
+
+.IP "-e --extended"
+Uses extended ASCII characters for the generated password. [Default: Disabled]
+
+.IP "-x --exclude <chars>"
+Comma-separated list of characters to exclude from the generated password. None is excluded by default.
+
+.IP "--exclude-similar"
+Exclude similar looking characters. [Default: Disabled]
+
+.IP "--every-group"
+Include characters from every selected group. [Default: Disabled]
+
+
+.SH REPORTING BUGS
+Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues.
+
+.SH AUTHOR
+This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>,
+and is maintained by the KeePassXC Team <team@keepassxc.org>.
diff --git a/share/docs/man/keepassxc.1 b/share/docs/man/keepassxc.1
new file mode 100644
index 000000000..74a9b02a6
--- /dev/null
+++ b/share/docs/man/keepassxc.1
@@ -0,0 +1,39 @@
+.TH KEEPASSXC 1 "Oct 25, 2019"
+.SH NAME
+keepassxc \- password manager
+
+.SH SYNOPSIS
+.B keepassxc
+.B [
+.I options
+.B ] [
+.I filename(s)
+.B ]
+
+.SH DESCRIPTION
+\fBKeePassXC\fP is a free/open-source password manager or safe which helps you to manage your passwords in a secure way. The complete database is always encrypted with the industry-standard AES (alias Rijndael) encryption algorithm using a 256 bit key. KeePassXC uses a database format that is compatible with KeePass Password Safe. Your wallet works offline and requires no Internet connection.
+
+.SH OPTIONS
+.IP "-h, --help"
+Displays this help.
+
+.IP "-v, --version"
+Displays version information.
+
+.IP "--config <config>"
+Path to a custom config file
+
+.IP "--keyfile <keyfile>"
+Key file of the database
+
+.IP "--pw-stdin"
+Read password of the database from stdin
+
+.IP "--pw, --parent-window <handle>"
+Parent window handle
+
+.IP "--debug-info"
+Displays debugging information.
+
+.SH AUTHOR
+This manual page is maintained by the KeePassXC Team <team@keepassxc.org>.
diff --git a/share/icons/application/16x16/actions/document-encrypt.png b/share/icons/application/16x16/actions/database-lock.png
index b06801211..b06801211 100644
--- a/share/icons/application/16x16/actions/document-encrypt.png
+++ b/share/icons/application/16x16/actions/database-lock.png
Binary files differ
diff --git a/share/icons/application/22x22/actions/document-encrypt.png b/share/icons/application/22x22/actions/database-lock.png
index eed69ac51..eed69ac51 100644
--- a/share/icons/application/22x22/actions/document-encrypt.png
+++ b/share/icons/application/22x22/actions/database-lock.png
Binary files differ
diff --git a/share/icons/application/32x32/actions/document-encrypt.png b/share/icons/application/32x32/actions/database-lock.png
index e2c996e6c..e2c996e6c 100644
--- a/share/icons/application/32x32/actions/document-encrypt.png
+++ b/share/icons/application/32x32/actions/database-lock.png
Binary files differ
diff --git a/share/icons/application/32x32/actions/statistics.png b/share/icons/application/32x32/actions/statistics.png
new file mode 100644
index 000000000..d5b67d0e5
--- /dev/null
+++ b/share/icons/application/32x32/actions/statistics.png
Binary files differ
diff --git a/share/icons/application/scalable/apps/freedesktop.svg b/share/icons/application/scalable/apps/freedesktop.svg
new file mode 100644
index 000000000..455a0b3a5
--- /dev/null
+++ b/share/icons/application/scalable/apps/freedesktop.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="108.7505"
+ height="91.166321"
+ viewBox="0 0 87.000389 72.933061"
+ id="svg2"
+ sodipodi:docname="freedesktop.svg"
+ inkscape:version="0.92.4 5da689c313, 2019-01-14">
+ <defs
+ id="defs14" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="3840"
+ inkscape:window-height="2106"
+ id="namedview12"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.7980996"
+ inkscape:cx="-97.45169"
+ inkscape:cy="25.551539"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <metadata
+ id="metadata57">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0.01402783,0.01402783)"
+ id="g37"
+ style="fill:#ffffff;fill-rule:nonzero;stroke:#3b80ae;stroke-width:2.45880008;stroke-miterlimit:4">
+ <g
+ id="g39">
+ <path
+ d="M 85.277,40.796 C 87.335,48.68 82.61,56.738 74.726,58.795 L 27.143,71.21 C 19.259,73.267 11.2,68.543 9.143,60.658 L 1.695,32.108 C -0.362,24.224 4.362,16.166 12.246,14.109 L 59.83,1.695 c 7.884,-2.057 15.942,2.667 17.999,10.551 l 7.449,28.55 z"
+ id="path41"
+ style="stroke:#bababa"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 80.444,39.778 c 1.749,7.854 -1.816,13.621 -9.504,15.447 L 28.704,66.245 C 21.135,68.641 14.615,65.064 12.866,57.409 L 6.53,33.127 C 4.781,24.982 7.239,20.238 16.033,17.68 L 58.27,6.661 c 8.144,-1.826 14.089,1.363 15.838,8.835 z"
+ id="path43"
+ style="fill:#3b80ae;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ d="M 45.542,51.793 24.104,31.102 62.204,26.709 Z"
+ id="path45"
+ style="opacity:0.5;fill:none;stroke:#ffffff"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 72.325,28.769 c 0.405,1.55 -0.525,3.136 -2.075,3.541 l -12.331,3.217 c -1.551,0.404 -3.137,-0.525 -3.542,-2.076 L 52.082,24.65 c -0.405,-1.551 0.524,-3.137 2.076,-3.542 l 12.33,-3.217 c 1.551,-0.405 3.137,0.525 3.542,2.076 l 2.295,8.801 z"
+ id="path47"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 36.51,33.625 c 0.496,1.9 -0.645,3.844 -2.545,4.34 l -15.112,3.943 c -1.901,0.496 -3.845,-0.644 -4.34,-2.544 L 11.699,28.578 c -0.496,-1.901 0.644,-3.844 2.544,-4.34 l 15.113,-3.942 c 1.901,-0.496 3.845,0.643 4.34,2.544 l 2.814,10.786 z"
+ id="path49"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 52.493,53.208 c 0.278,1.065 -0.36,2.154 -1.425,2.432 L 42.6,57.848 c -1.064,0.277 -2.153,-0.36 -2.431,-1.426 l -1.577,-6.043 c -0.277,-1.064 0.36,-2.153 1.425,-2.432 l 8.468,-2.209 c 1.064,-0.277 2.154,0.361 2.431,1.426 l 1.577,6.043 z"
+ id="path51"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/share/keepassxc.ini b/share/keepassxc.ini
index b91fefb4b..d40572659 100644
--- a/share/keepassxc.ini
+++ b/share/keepassxc.ini
@@ -5,7 +5,10 @@ OpenPreviousDatabasesOnStartup=true
AutoSaveAfterEveryChange=false
AutoSaveOnExit=false
AutoReloadOnChange=true
-MinimizeOnCopy=false
+HideWindowOnCopy=false
+MinimizeOnCopy=true
+DropToBackgroundOnCopy=false
+MinimizeOnOpenUrl=false
UseGroupIconOnEntryCreation=true
IgnoreGroupExpansion=false
AutoTypeEntryTitleMatch=true
@@ -20,6 +23,7 @@ DarkTrayIcon=false
MinimizeToTray=false
MinimizeOnClose=false
MinimizeOnStartup=false
+MonospaceNotes=false
MainWindowGeometry="@ByteArray(\x1\xd9\xd0\xcb\0\x2\0\0\0\0\x2(\0\0\0\xbd\0\0\x5W\0\0\x3;\0\0\x2\x30\0\0\0\xdc\0\0\x5O\0\0\x3\x33\0\0\0\0\0\0\0\0\a\x80)"
SplitterState=@Invalid()
EntryListColumnSizes=@Invalid()
diff --git a/share/linux/org.keepassxc.KeePassXC.appdata.xml b/share/linux/org.keepassxc.KeePassXC.appdata.xml
index b8e8c36d6..69d26cf54 100644
--- a/share/linux/org.keepassxc.KeePassXC.appdata.xml
+++ b/share/linux/org.keepassxc.KeePassXC.appdata.xml
@@ -50,6 +50,87 @@
</screenshots>
<releases>
+ <release version="2.5.0" date="2019-10-26">
+ <description>
+ <ul>
+ <li>Add 'Paper Backup' aka 'Export to HTML file' to the 'Database' menu [#3277]</li>
+ <li>Add statistics panel with information about the database (number of entries, number of unique passwords, etc.) to the Database Settings dialog [#2034]</li>
+ <li>Add offline user manual accessible via the 'Help' menu [#3274]</li>
+ <li>Add support for importing 1Password OpVault files [#2292]</li>
+ <li>Implement Freedesktop.org secret storage DBus protocol so that KeePassXC can be used as a vault service by libsecret [#2726]</li>
+ <li>Add support for OnlyKey as an alternative to YubiKeys (requires yubikey-personalization >= 1.20.0) [#3352]</li>
+ <li>Add group sorting feature [#3282]</li>
+ <li>Add feature to download favicons for all entries at once [#3169]</li>
+ <li>Add word case option to passphrase generator [#3172]</li>
+ <li>Add support for RFC6238-compliant TOTP hashes [#2972]</li>
+ <li>Add UNIX man page for main program [#3665]</li>
+ <li>Add 'Monospaced font' option to the notes field [#3321]</li>
+ <li>Add support for key files in auto open [#3504]</li>
+ <li>Add search field for filtering entries in Auto-Type dialog [#2955]</li>
+ <li>Complete usernames based on known usernames from other entries [#3300]</li>
+ <li>Parse hyperlinks in the notes field of the entry preview pane [#3596]</li>
+ <li>Allow abbreviation of field names in entry search [#3440]</li>
+ <li>Allow setting group icons recursively [#3273]</li>
+ <li>Add copy context menu for username and password in Auto-Type dialog [#3038]</li>
+ <li>Drop to background after copying a password to the clipboard [#3253]</li>
+ <li>Add 'Lock databases' entry to tray icon menu [#2896]</li>
+ <li>Add option to minimize window after unlocking [#3439]</li>
+ <li>Add option to minimize window after opening a URL [#3302]</li>
+ <li>Request accessibility permissions for Auto-Type on macOS [#3624]</li>
+ <li>Browser: Add initial support for multiple URLs [#3558]</li>
+ <li>Browser: Add entry-specific browser integration settings [#3444]</li>
+ <li>Add offline HIBP checker (requires a downloaded HIBP dump) [#2707]</li>
+ <li>CLI: Add 'flatten' option to the 'ls' command [#3276]</li>
+ <li>CLI: Add password generation options to `Add` and `Edit` commands [#3275]</li>
+ <li>CLI: Add XML import [#3572]</li>
+ <li>CLI: Add CSV export to the 'export' command [#3278]</li>
+ <li>CLI: Add `-y --yubikey` option for YubiKey [#3416]</li>
+ <li>CLI: Add `--dry-run` option for merging databases [#3254]</li>
+ <li>CLI: Add group commands (mv, mkdir and rmdir) [#3313].</li>
+ <li>CLI: Add interactive shell mode command `open` [#3224]</li>
+ <li>Redesign database unlock dialog [ [#3287]</li>
+ <li>Rework the entry preview panel [ [#3306]</li>
+ <li>Move notes to General tab on Group Preview Panel [#3336]</li>
+ <li>Enable entry actions when editing an entry and cleanup entry context menu [#3641]</li>
+ <li>Improve detection of external database changes [#2389]</li>
+ <li>Warn if user is trying to use a KDBX file as a key file [#3625]</li>
+ <li>Add option to disable KeePassHTTP settings migrations prompt [#3349, #3344]</li>
+ <li>Re-enabled Wayland support (no Auto-Type yet) [#3520, #3341]</li>
+ <li>Add icon to 'Toggle Window' action in tray icon menu [[3244]</li>
+ <li>Merge custom data between databases only when necessary [#3475]</li>
+ <li>Improve various file-handling related issues when picking files using the system's file dialog [#3473]</li>
+ <li>Add 'New Entry' context menu when no entries are selected [#3671]</li>
+ <li>Reduce default Argon2 settings from 128 MiB and one thread per CPU core to 64 MiB and two threads to account for lower-spec mobile hardware [#3672]</li>
+ <li>Browser: Remove unused 'Remember' checkbox for HTTP Basic Auth [#3371]</li>
+ <li>Browser: Show database name when pairing with a new browser [#3638]</li>
+ <li>Browser: Show URL in allow access dialog [#3639]</li>
+ <li>CLI: The password length option `-l` for the CLI commands `Add` and `Edit` is now `-L` [#3275]</li>
+ <li>CLI: The `-u` shorthand for the `--upper` password generation option has been renamed to `-U` [#3275]</li>
+ <li>CLI: Rename command `extract` to `export`. [#3277]</li>
+ <li>Improve accessibility for assistive technologies [#3409]</li>
+ <li>Correctly unlock all databases if `--pw-stdin` is provided [#2916]</li>
+ <li>Fix password generator issues with special characters [#3303]</li>
+ <li>Fix KeePassXC interrupting shutdown procedure [#3666]</li>
+ <li>Fix password visibility toggle button state on unlock dialog [#3312]</li>
+ <li>Fix potential data loss if database is reloaded while user is editing an entry [#3656]</li>
+ <li>Fix hard-coded background color in search help popup [#3001]</li>
+ <li>Fix font choice for password preview [#3425]</li>
+ <li>Fix handling of read-only files when autosave is enabled [#3408]</li>
+ <li>Handle symlinks correctly when atomic saves are disabled [#3463]</li>
+ <li>Enable HighDPI icon scaling on Linux [#3332]</li>
+ <li>Make Auto-Type on macOS more robust and remove old Carbon API calls [#3634, #3347]</li>
+ <li>Hide Share tab if KeePassXC is compiled without KeeShare support and other minor KeeShare improvements [#3654, #3291, #3029, #3031, #3236]</li>
+ <li>Correctly bring window to the front when clicking tray icon on macOS [#3576]</li>
+ <li>Correct application shortcut created by MSI Installer on Windows [#3296]</li>
+ <li>Fix crash when removing custom data [#3508]</li>
+ <li>Fix placeholder resolution in URLs [#3281]</li>
+ <li>Fix various inconsistencies and platform-dependent compilation bugs [#3664, #3662, #3660, #3655, #3649, #3417, #3357, #3319, #3318, #3304]</li>
+ <li>Browser: Fix potential leaking of entries through the browser integration API if multiple databases are opened [#3480]</li>
+ <li>Browser: Fix password entropy calculation [#3107]</li>
+ <li>Browser: Fix Windows registry settings for portable installation [#3603]</li>
+ </ul>
+ </description>
+ </release>
<release version="2.4.3" date="2019-06-12">
<description>
<ul>
diff --git a/share/linux/org.keepassxc.KeePassXC.desktop b/share/linux/org.keepassxc.KeePassXC.desktop
index 6ee0f7411..541af3c02 100644
--- a/share/linux/org.keepassxc.KeePassXC.desktop
+++ b/share/linux/org.keepassxc.KeePassXC.desktop
@@ -1,11 +1,13 @@
[Desktop Entry]
Name=KeePassXC
GenericName=Password Manager
+GenericName[da]=Adgangskodehåndtering
GenericName[de]=Passwortverwaltung
GenericName[es]=Gestor de contraseñas
GenericName[fr]=Gestionnaire de mot de passe
GenericName[ru]=менеджер паролей
Comment=Community-driven port of the Windows application “KeePass Password Safe”
+Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe”
Exec=keepassxc %f
TryExec=keepassxc
Icon=keepassxc
diff --git a/share/macosx/keepassxc.entitlements b/share/macosx/keepassxc.entitlements
index a63705585..be766090c 100644
--- a/share/macosx/keepassxc.entitlements
+++ b/share/macosx/keepassxc.entitlements
@@ -8,8 +8,6 @@
<string>production</string>
<key>com.apple.security.network.client</key>
<true/>
- <key>com.apple.security.app-sandbox</key>
- <true/>
<key>com.apple.security.print</key>
<true/>
<key>com.apple.security.app-sandbox</key>
diff --git a/share/translations/keepassx_ar.ts b/share/translations/keepassx_ar.ts
index ddffd7fa8..a89fa7533 100644
--- a/share/translations/keepassx_ar.ts
+++ b/share/translations/keepassx_ar.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>شغل تطبيق واحد فقط من KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>تذكر قواعد البيانات الأخيرة</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>تذكر الملفات الرئيسية الأخيرة و قواعد الأمن</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>إستعادة قواعد البيانات السابقة عند بدء التشغيل</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>تصغير النافذة عند بدء تشغيل التطبيق</translation>
</message>
@@ -163,10 +159,6 @@
<translation>استخدم رمز المجموعة عند إنشاء الإدخال</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>تصغير عند النسخ إلى الحافظة</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation type="unfinished"/>
</message>
@@ -195,10 +187,6 @@
<translation>إخفاء النافذة إلى شريط المهام عند تصغيرها</translation>
</message>
<message>
- <source>Language</source>
- <translation>اللغة</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>الطباعة التلقائية</translation>
</message>
@@ -232,19 +220,100 @@
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates at application startup</source>
+ <source>Movable toolbar</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
+ <source>Remember previously used databases</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> ثانية</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
<translation type="unfinished"/>
</message>
</context>
@@ -320,7 +389,28 @@
<translation>الخصوصية</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear search query after</source>
<translation type="unfinished"/>
</message>
</context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>نسخ &amp;اسم المستخدم</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>حدد مدخل للطباعة التلقائية:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>البحث...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 طلب الدخول إلى كلمات المرور للعنصر التالي (العناصر) التالية.
يرجى تحديد ما إذا كنت تريد السماح بالوصول أم لا.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -456,10 +569,6 @@ Please select the correct database for saving credentials.</source>
<translation>هذا مطلوب للوصول إلى قواعد بياناتك مع KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>تفعيل تكامل KeepassXC مع المتصفح</translation>
- </message>
- <message>
<source>General</source>
<translation>العام</translation>
</message>
@@ -502,7 +611,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>لا تعرض سوى أفضل التطابقات للرابط المحدد بدلا من جميع الإدخالات للنطاق بأكمله.</translation>
+ <translation>لا تعرض سوى أفضل التطابقات للرابط المحدد بدلًا من جميع الإدخالات للنطاق بأكمله.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
@@ -533,10 +642,6 @@ Please select the correct database for saving credentials.</source>
<translation>لا تسأل مطلقًا قبل تحديث بيانات الإعتماد</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>قاعدة البيانات المحددة هي التي يجب تتصل مع العميل فقط.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>البحث في جميع قواعد البيانات لمطابقة بيانات الإعتماد</translation>
@@ -592,10 +697,6 @@ Please select the correct database for saving credentials.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Executable Files</source>
<translation type="unfinished"/>
</message>
@@ -620,6 +721,50 @@ Please select the correct database for saving credentials.</source>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -708,6 +853,10 @@ This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>لا تُظهر هذا التحذير مرة أخرى</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -767,10 +916,6 @@ Would you like to migrate your existing settings now?</source>
<translation>يحتوي السجل الأول على أسماء الحقول</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>عدد رؤوس الأسطر لتجاهلها</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>يعتبر &apos;\&apos; حرف هروب</translation>
</message>
@@ -819,12 +964,28 @@ Would you like to migrate your existing settings now?</source>
%1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n عمود</numerusform><numerusform>%n عمود</numerusform><numerusform>%n عمود</numerusform><numerusform>%n عمود</numerusform><numerusform>%n عمود</numerusform><numerusform>%n عمود</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -860,17 +1021,34 @@ Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not save, database has no file name.</source>
+ <source>File cannot be written as it is opened in read-only mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File cannot be written as it is opened in read-only mode.</source>
+ <source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>سلة المهملات</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -882,30 +1060,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>أدخل المفتاح الرئيسي</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>ملف المفتاح:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>كلمه السر:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>تصّفح</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>تحديث</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>استجابة التحدي:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>تنسيق ملف المفتاح القديم</translation>
</message>
@@ -936,17 +1098,95 @@ Please consider generating a new key file.</source>
<translation>إختر ملف المفتاح</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
+ <source>Select slot...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>إستعراض...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>مسح</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1098,6 +1338,14 @@ Permissions to access entries will be revoked.</source>
This is necessary to maintain compatibility with the browser plugin.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1240,6 +1488,57 @@ If you keep this number, your database may be too easy to crack!</source>
<comment>seconds</comment>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1287,6 +1586,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>تفعيل &amp;الضغط (مستحسن)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1352,6 +1684,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1363,6 +1699,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>الاسم</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>القيمة</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1412,10 +1871,6 @@ This is definitely a bug, please report it to the developers.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select CSV file</source>
<translation type="unfinished"/>
</message>
@@ -1438,6 +1893,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1455,7 +1934,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>هل تريد حقًا نقل %n مُدخل إلى سلة المهملات؟</numerusform><numerusform>هل تريد حقًا نقل %n مُدخل إلى سلة المهملات؟</numerusform><numerusform>هل تريد حقًا نقل %n مُدخل إلى سلة المهملات؟</numerusform><numerusform>هل تريد حقًا نقل %n مُدخل إلى سلة المهملات؟</numerusform><numerusform>هل تريد حقًا نقل %n مُدخل إلى سلة المهملات؟</numerusform><numerusform>هل تريد حقًا نقل %n مُدخل إلى سلة المهملات؟</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1528,10 +2007,6 @@ Do you want to merge your changes?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>الملف تم فتحه بوضع القراءة فقط.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation type="unfinished"/>
</message>
@@ -1570,11 +2045,6 @@ Disable safe saves and try again?</source>
أتريد إلغاء خيار الحفظ الامن ثم المحاولة مرة أخرى؟</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Passwords</source>
<translation>كلمه السر</translation>
</message>
@@ -1618,6 +2088,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1699,11 +2177,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n أسبوع</numerusform><numerusform>أسبوع</numerusform><numerusform>أسبوعين</numerusform><numerusform>%n أسابيع</numerusform><numerusform>%n أسبوع</numerusform><numerusform>%n أسابيع</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n شهر</numerusform><numerusform>شهر</numerusform><numerusform>شهرين</numerusform><numerusform>%n شهور</numerusform><numerusform>%n شهور</numerusform><numerusform>%n شهور</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1737,6 +2215,18 @@ Disable safe saves and try again?</source>
<source>Confirm Removal</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>تكامل المتصفح</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1776,6 +2266,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>لون الخلفية:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1811,6 +2337,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation>إستخدم تسلسل محدد لهذا الإرتباط:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>العام</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>إضافة</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>إزالة</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1830,6 +2427,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>حذف الكل</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1869,6 +2486,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>انتهاء</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1945,6 +2618,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>يتطلب تأكيد المستخدم عندما يتم إستخدام هذا المفتاح</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1980,6 +2669,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>ورث من المجموعة الرئيسية (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2008,67 +2701,97 @@ Disable safe saves and try again?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from path</source>
+ <source>KeeShare unsigned container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to path</source>
+ <source>KeeShare signed container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
+ <source>Select import source</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>Select export target</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
+ <source>Select import/export file</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
+ <source>Clear</source>
+ <translation>مسح</translation>
+ </message>
+ <message>
+ <source>Import</source>
+ <translation>إستيراد</translation>
+ </message>
+ <message>
+ <source>Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database import is disabled</source>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
+ <source>%1 is already being imported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
+ <source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
<translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>مسح</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Sharing mode field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2102,6 +2825,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>تعيين تسلسل الطباعة التلقائية الإفتراضي</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2138,22 +2889,10 @@ Disable safe saves and try again?</source>
<translation>كل الملفات</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>الرمز المخصص موجود بالفعل</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>تأكيد الحذف</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
<translation type="unfinished"/>
</message>
@@ -2177,6 +2916,42 @@ Disable safe saves and try again?</source>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2222,6 +2997,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>القيمة</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2269,7 +3068,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>هل أنت متأكد من حذف %n مرفق؟</numerusform><numerusform>هل أنت متأكد من حذف %n مرفق؟</numerusform><numerusform>هل أنت متأكد من حذف %n مرفق؟</numerusform><numerusform>هل أنت متأكد من حذف %n مرفقات؟</numerusform><numerusform>هل أنت متأكد من حذف %n مرفق؟</numerusform><numerusform>هل أنت متأكد من حذف %n مرفقات؟</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2316,6 +3115,26 @@ This may cause the affected plugins to malfunction.</source>
%1</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>المرفقات</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2410,10 +3229,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>إنشاء رمز TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>إغلاق</translation>
</message>
@@ -2498,6 +3313,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>متقدم</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2531,11 +3354,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>سلة المهملات</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2554,6 +3399,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>ألغ</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>إغلاق</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>رابط</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2575,10 +3472,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>تعذر إصدار إستجابة التحدي.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>المفتاح أو ملف قاعدة البيانات معطوب.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>رؤوس قاعدة البيانات مفقودة</translation>
</message>
@@ -2598,6 +3491,11 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>طول بيانات الرأس غير صحيح</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2629,10 +3527,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>رأس SHA256 غير متطابق</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>المفتاح خاطئ أو ملف قاعدة البيانات تالف. (HMAC غير متطابق)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>تشفير غير معروف</translation>
</message>
@@ -2732,6 +3626,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>حقل حجم النوع للخريطة المتنوعة غير صحيح</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2952,12 +3855,12 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>إستيراد قاعدة بيانات KeePass1</translation>
+ <source>Unable to open the database.</source>
+ <translation>يتعذر فتح قاعدة البيانات.</translation>
</message>
<message>
- <source>Unable to open the database.</source>
- <translation>فتح قاعدة البيانات غير ممكن.</translation>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3016,10 +3919,6 @@ Line %2, column %3</source>
<translation>تعذر حساب المفتاح الرئيسي</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>المفتاح أو ملف قاعدة البيانات معطوب.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>تعذر تحويل المفتاح</translation>
</message>
@@ -3115,39 +4014,56 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
+ <source>Inactive share %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
+ <source>Imported from %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
+ <source>Exported to %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
+ <source>Synchronized with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Import is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Export is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3193,10 +4109,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>تصّفح</translation>
- </message>
- <message>
<source>Generate</source>
<translation>توليد</translation>
</message>
@@ -3248,6 +4160,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>حدد ملف المفتاح</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>إستعراض...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3336,10 +4285,6 @@ Message: %2</source>
<translation>&amp;الإعدادات</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>مولد كلمة السر</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;قفل قواعد البيانات</translation>
</message>
@@ -3525,28 +4470,88 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for Updates...</source>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Share entry</source>
+ <source>Check for updates on startup?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>You can always check for updates manually from the application menu.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>تحميل رمز المفضلة</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3608,6 +4613,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3678,6 +4691,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3777,6 +4856,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3802,6 +4892,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3831,22 +4937,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>أنواع الرموز</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>الحروف الكبيرة</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>أحرف صغيرة</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>أرقام</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>رموز مخصصة</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>تمديد ASCII</translation>
</message>
@@ -3876,7 +4970,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Copy</source>
- <translation>نسخة</translation>
+ <translation>نسخ</translation>
</message>
<message>
<source>Accept</source>
@@ -3927,18 +5021,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>متقدم</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3971,18 +5057,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation type="unfinished"/>
</message>
<message>
- <source>Math</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Dashes</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>\_|-/</source>
<translation type="unfinished"/>
</message>
@@ -4030,6 +5108,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4037,11 +5183,8 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4079,6 +5222,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4171,10 +5318,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>إنشاء كلمة المرور للمُدخل.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>طول كلمة المرور المُنشئة.</translation>
- </message>
- <message>
<source>length</source>
<translation>الطول</translation>
</message>
@@ -4224,18 +5367,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>إجراء تحليل متقدم على كلمة المرور.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>استخراج وطباعة محتوى قاعدة البيانات.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>مسار قاعدة البيانات للإستخراج.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>ادخل كلمة المرور لإلغاء قفل %1:</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4280,10 +5411,6 @@ Available commands:
<translation>دمج قاعدتي بيانات.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>مسار قاعدة البيانات المُراد دمجها.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>مسار قاعدة البيانات المُراد الدمج منها.</translation>
</message>
@@ -4360,10 +5487,6 @@ Available commands:
<translation>تكامل المتصفح</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] إستجابة التحدي - فتحة %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>اضغط</translation>
</message>
@@ -4394,10 +5517,6 @@ Available commands:
<translation>إنشاء كلمة مرور عشوائية جديدة.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4455,10 +5574,6 @@ Available commands:
<translation>العدد</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4583,24 +5698,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Length of the generated password</source>
<translation type="unfinished"/>
</message>
@@ -4613,10 +5710,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Use special characters</source>
<translation type="unfinished"/>
</message>
@@ -4760,10 +5853,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation type="unfinished"/>
</message>
@@ -4772,10 +5861,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>حذف مُدخل من قاعدة البيانات.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>مسار المُدخل التي ستحذف.</translation>
</message>
@@ -4831,6 +5916,330 @@ Available commands:
<source>Cannot create new group</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>مراجعة: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>مراجعة: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>نظام التشغيل: %1
+معمارية المعالج: %2
+النواة: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>الطباعة التلقائية</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>الإضافات المُفعلة:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4985,6 +6394,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>العام</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>المجموعة</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>إعدادات قاعدة البيانات</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>إلغاء قفل قاعدة البيانات</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>قفل قاعدة بيانات</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5107,147 +6603,205 @@ Available commands:
<source>Signer:</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>المفتاح</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
<message>
- <source>Import from container without signature</source>
+ <source>Overwriting signed share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Could not write export container (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
+ <source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Never</source>
- <translation>أبدًا</translation>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Always</source>
+ <source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Just this time</source>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Could not write export container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
- <source>Imported from %1</source>
+ <source>Import from container without signature</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Signed share container are not supported - import prevented</source>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File is not readable</source>
+ <source>Import from container with certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid sharing container</source>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Untrusted import prevented</source>
+ <source>Not this time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful signed import</source>
- <translation type="unfinished"/>
+ <source>Never</source>
+ <translation>أبدًا</translation>
</message>
<message>
- <source>Unexpected error</source>
+ <source>Always</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unsigned share container are not supported - import prevented</source>
+ <source>Just this time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful unsigned import</source>
+ <source>Signed share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File does not exist</source>
+ <source>File is not readable</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unknown share container type</source>
+ <source>Invalid sharing container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
+ <source>Untrusted import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container (%1)</source>
+ <source>Successful signed import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <source>Unexpected error</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container</source>
+ <source>Unsigned share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unexpected export error occurred</source>
+ <source>Successful unsigned import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1 failed (%2)</source>
+ <source>File does not exist</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
+ <source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Export to %1</source>
+ <source>Import from %1 failed (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <source>Import from %1 successful (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Multiple import source path to %1 in %2</source>
+ <source>Imported from %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Conflicting export target path %1 in %2</source>
+ <source>Export to %1 failed (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
+ <source>Export to %1 successful (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not write file (%1)</source>
+ <source>Export to %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed database: Could not open file to write (%1)</source>
+ <source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed database: Could not write file (%1)</source>
+ <source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5297,10 +6851,6 @@ Available commands:
<translation>إعداد TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>المفتاح:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>الإعدادات الإفتراضية لرمز RFC 6238</translation>
</message>
@@ -5330,16 +6880,45 @@ Available commands:
<translation>حجم الكود:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 أرقام</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source> digits</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 أرقام</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5423,6 +7002,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>مرحبا بك في KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5446,5 +7033,13 @@ Available commands:
<source>No YubiKey inserted.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_cs.ts b/share/translations/keepassx_cs.ts
index 98f5fcb0e..7527275db 100644
--- a/share/translations/keepassx_cs.ts
+++ b/share/translations/keepassx_cs.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Styl následování</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Vrátit nastavení do výchozích hodnot?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Opravdu chcete vrátit veškerá obecná nastavení a nastavení zabezpečení do výchozích hodnot?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Spouštět pouze jedinou instanci KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Pamatovat si nedávno otevřené databáze</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Pamatovat si minule použité soubory s klíči a zabezpečovací klíčenky</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Při spouštění aplikace načíst minule otevřené databáze</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Spouštět aplikaci s minimalizovaným oknem</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Pro vytvářený záznam použít ikonu skupiny, pod kterou je vytvářen</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Po zkopírování údaje do schránky odklidit okno aplikace jeho automatickou minimalizací</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Skrýt panel náhledu položky</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Minimalizovat okno aplikace do oznamovací oblasti systémového panelu</translation>
</message>
<message>
- <source>Language</source>
- <translation>Jazyk</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Automatické vyplňování</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Prodleva zahájení automatického vyplňování</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Kontrolovat dostupnost aktualizací při spouštění aplikace</translation>
+ <source>Movable toolbar</source>
+ <translation>Přesouvatelná lišta nástrojů</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>Pamatovat si minule použité databáze</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Do vyhledávání aktualizací zahrnovat i ještě nehotové verze</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Při spuštění načíst minule otevřené databáze</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Přesouvatelná lišta nástrojů</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Pamatovat si soubory s klíči k databázím a hardwarová bezpečnostní zařízení</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Zjišťovat dostupnost aktualizací aplikace jednou týdně</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Při zjišťování případných aktualizací brát v potaz i vývojové testovací verze</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Styl tlačítka:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Jazyk:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(pro aktivaci je třeba aplikaci ukončit a spustit znovu)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Po odemčení databáze okno minimalizovat</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Při otevírání URL okno minimalizovat</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Po zkopírování do schránky okno zminimalizovat</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimalizovat</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Upustit na pozadí</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Časový limit stažení ikony webu</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Časový limit (v sekundách) pro stažení ikony webu</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>sek.</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Styl tlačítek na liště nástrojů</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>V sekci Poznámky použít písmo s neměnnou šířkou</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Výběr jazyka</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Vráti nastavení do výchozích hodnot</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Globální zkratka automatického vyplňování</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Styl tlačítka</translation>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Prodleva mezi zadáváním jednotlivých znaků při automatickém vyplňování</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Prodleva (v milisekundách) zahájení automatického vyplňování</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Soukromí</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Použít DuckDuckGo jako náhradní zdroj pro stahování ikon webů</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Pro stahování ikon webů použít službu DuckDuckGo</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Za kolik sekund vyčistit schránku</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Reset neaktivity Touch ID</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Časový limit (v sekundách) uzamčení databáze</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Vyčistit vyhledávací dotaz po uplynutí</translation>
</message>
</context>
<context>
@@ -386,7 +476,18 @@
</message>
<message>
<source>Sequence</source>
- <translation>Posloupnost</translation>
+ <translation>Pořadí</translation>
+ </message>
+</context>
+<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Zkopírovat &amp;uživatelské jméno</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Zko&amp;pírovat heslo</translation>
</message>
</context>
<context>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Vyberte záznam, kterým se bude automaticky vyplňovat:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Hledat…</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 si vyžádalo přístup k heslům u následujících položek.
Umožnit přístup?</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Umožnit přístup</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Odepřít přístup</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Vyberte databázi, do které chcete přihlašovací údaje uložit.</translation
<translation>Toto je potřebné pro přístup do vašich databází pomocí KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Zapnout propojení webového prohlížeče s KeepassXC</translation>
- </message>
- <message>
<source>General</source>
<translation>Obecné</translation>
</message>
@@ -534,10 +643,6 @@ Vyberte databázi, do které chcete přihlašovací údaje uložit.</translation
<translation>Nikdy se neptat před akt&amp;ualizací přihlašovacích údajů</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>S klientem bude propojena pouze označená databáze.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>&amp;Hledat odpovídající přihlašovací údaje ve všech otevřených databázích</translation>
@@ -593,10 +698,6 @@ Vyberte databázi, do které chcete přihlašovací údaje uložit.</translation
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Varování&lt;/b&gt;, aplikace keepassxc-proxy nebyla nalezena! &lt;br /&gt;Zkontrolujte instalační složku KeePassXC nebo v pokročilých možnostech potvrďte uživatelsky určené umístění.&lt;br /&gt;Napojení na prohlížeč NEBUDE FUNGOVAT bez proxy aplikace. &lt;br /&gt; Očekávané umístění:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Spustitelné soubory</translation>
</message>
@@ -621,6 +722,50 @@ Vyberte databázi, do které chcete přihlašovací údaje uložit.</translation
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>Aby fungovalo napojení na prohlížeč, je třeba KeePassXC. &lt;br /&gt; Stáhnete ho pro %1 a %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Vracet přihlašovací údaje, kterým skončila platnost. Do názvu je přidán řetězec [expired].</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Umožnit poskytování i přihlašovacích údajů, kterým skončila platnost.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Zapnout napojení na webový prohlížeč</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Prohlížeče, nainstalované formou snap balíčků, zatím nejsou podporované.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Odpovídající přihlašovací údaje budou poskytovány ze všech databází, napojených na toto rozšíření.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Nezobrazovat vyskakovací okno doporučující převedení nastavení ze starého KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>Nedotazovat se na převedení nastavení z KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Kolonka pro uživatelsky určené proxy umístění</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Nalistovat uživatelsky určený proxy soubor</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Varování&lt;/b&gt;, aplikace keepassxc-prox nenalezena! &lt;br /&gt;Zkontrolujte instalační složku KeePassXC nebo potvrďte vlastní popis umístění v pokročilých volbách.&lt;br /&gt;Napojení na webový prohlížeč NEBUDE FUNGOVAT bez proxy aplikace.&lt;br /&gt;Očekávaný popis umístění: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -680,7 +825,7 @@ Přesunuto %2 klíčů do uživatelsky určených dat.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>%n klíč úspěšně přesunut do uživatelsky určených dat.</numerusform><numerusform>%n klíče úspěšně přesunuty do uživatelsky určených dat.</numerusform><numerusform>%n klíčů úspěšně přesunuto do uživatelsky určených dat.</numerusform><numerusform>%n klíčy úspěšně přesunuty do uživatelsky určených dat.</numerusform></translation>
+ <translation><numerusform>%n klíč úspěšně přesunut do uživatelsky určených dat.</numerusform><numerusform>%n klíče úspěšně přesunuty do uživatelsky určených dat.</numerusform><numerusform>%n klíčů úspěšně přesunuto do uživatelsky určených dat.</numerusform><numerusform>%n klíče úspěšně přesunuty do uživatelsky určených dat.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Toto je nezbytné pro zachování vašich stávajících spojení prohlížeče.
Chcete přenést vaše stávající nastavení nyní?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Toto varování znovu nezobrazovat</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Chcete přenést vaše stávající nastavení nyní?</translation>
<translation>První záznam obsahuje názvy kolonek</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Počet řádek s hlavičkou, kterou zahodit</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Považovat „\“ za únikový znak</translation>
</message>
@@ -818,7 +963,7 @@ Chcete přenést vaše stávající nastavení nyní?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n další zpráva přeskočena]</numerusform><numerusform>[%n další zprávy přeskočeny]</numerusform><numerusform>[%n dalších zpráv přeskočeno]</numerusform><numerusform>[%n další zprávy přeskočeny]</numerusform></translation>
+ <translation><numerusform>[%n další zpráva přeskočeno]</numerusform><numerusform>[%n další zprávy přeskočeny]</numerusform><numerusform>[%n dalších zpráv přeskočeno]</numerusform><numerusform>[%n další zprávy přeskočeny]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -826,12 +971,28 @@ Chcete přenést vaše stávající nastavení nyní?</translation>
<translation>CSV import: chyby zápisu:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Zařazení textu</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Oddělování kolonek</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Počet řádků hlavičky, které zahodit</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Náhled importu CSV</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n sloupec</numerusform><numerusform>%n sloupce</numerusform><numerusform>%n sloupců</numerusform><numerusform>%n sloupců</numerusform></translation>
+ <translation><numerusform>%n sloupec</numerusform><numerusform>%n sloupce</numerusform><numerusform>%n sloupců</numerusform><numerusform>%n sloupce</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -867,10 +1028,6 @@ Chcete přenést vaše stávající nastavení nyní?</translation>
<translation>Chyba při čtení databáze: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Nedaří se uložit, databáze nemá název.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Do souboru nelze zapisovat, protože je otevřen v režimu pouze pro čtení.</translation>
</message>
@@ -878,6 +1035,28 @@ Chcete přenést vaše stávající nastavení nyní?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Klíč nebyl přeměněn. Toto je chyba, nahlaste to vývojářům.</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Záložní databáze se nachází v %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Není možné uložit, databáze neodkazuje na platný soubor.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Nedaří se uložit, soubor s databází je přístupný pouze pro čtení.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>V databázovém souboru jsou nesloučené změny.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Koš</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1068,14 @@ Chcete přenést vaše stávající nastavení nyní?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Zadejte hlavní klíč</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Soubor s klíčem:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Heslo:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Procházet</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Načíst znovu</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Výzva–odpověď:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Starý formát souboru s klíčem</translation>
</message>
@@ -942,20 +1105,100 @@ Zvažte vytvoření nového souboru s klíčem.</translation>
<translation>Vyberte soubor s klíčem</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID pro rychlé odemčení</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Nepodařilo se otevřít soubor s klíčem: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Databázi se nedaří otevřít:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Vybrat slot…</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Soubor s klíčem se nedaří otevřít:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Odemknout databázi KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Zadejte heslo:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Kolonka pro heslo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Zobraz./nezobrazovat hesla</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Zadejte další přihlašovací údaje:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Výběr souboru s klíčem</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Výběr slotu v hardwarovém klíči</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Nalistovat soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Procházet…</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Znovu načíst hardwarová bezpečnostní zařízení</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Hardwarový klíč:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>1Je možné používat hardwarové bezpečnostní klíče jako například 2YubiKey2 nebo 3OnlyKey3 se sloty nastavenými pro HMAC-SHA1.
+ &lt;p&gt;Klikněte pro další informace…&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Nápověda k hardwarovému klíči</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID pro rychlé odemknutí</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Vyčistit</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Vyčistit soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Vybrat soubor…</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Odemknutí se nezdařilo a nebylo zadáno žádné heslo</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Odemčení databáze se nezdařilo a nezadali jste heslo.
+Chcete to zkusit znovu s „prázdným“ heslem?
+
+Abyste tomu, aby se tato chyba objevovala, je třeba přejít do „Nastavení databáze / Zabezpečení“ a nastavit heslo znovu.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Zkusit znovu bez hesla</translation>
</message>
</context>
<context>
@@ -989,7 +1232,7 @@ Zvažte vytvoření nového souboru s klíčem.</translation>
</message>
<message>
<source>Browser Integration</source>
- <translation>Napojení webového prohlížeče</translation>
+ <translation>Napojení na webový prohlížeč</translation>
</message>
</context>
<context>
@@ -1064,7 +1307,7 @@ To může zabránit spojení se zásuvným modulem prohlížeče.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Z nastavení KeePassXC úspěšně odebrán %n šifrovací klíč.</numerusform><numerusform>Z nastavení KeePassXC úspěšně odebrány %n šifrovací klíče.</numerusform><numerusform>Z nastavení KeePassXC úspěšně odebráno %n šifrovacích klíčů.</numerusform><numerusform>Z nastavení KeePassXC úspěšně odebrány %n šifrovací klíče.</numerusform></translation>
+ <translation><numerusform>Úspěšně odebrán %n šifrovací klíč z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebrány %n šifrovací klíče z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebráno %n šifrovacích klíčů z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebrány %n šifrovací klíče z nastavení KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1090,7 +1333,7 @@ Oprávnění pro přístup k položkám budou odvolána.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Z %n položky úspěšně odebrána oprávnění.</numerusform><numerusform>Ze %n položek úspěšně odebrána oprávnění.</numerusform><numerusform>Z %n položek úspěšně odebrána oprávnění.</numerusform><numerusform>Ze %n položek úspěšně odebrána oprávnění.</numerusform></translation>
+ <translation><numerusform>Z %n položky úspěšně odebrána oprávnění.</numerusform><numerusform>Ze %n položek úspěšně odebrána oprávnění.</numerusform><numerusform>Ze %n položek úspěšně odebrána oprávnění.</numerusform><numerusform>Ze %n položek úspěšně odebrána oprávnění.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1110,6 +1353,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Opravdu chcete přesunout všechna data starého napojení na prohlížeč na nejnovější standard?
Toto je nezbytné pro zachování kompatibility se zásuvným modulem pro prohlížeč.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Uložené klíče prohlížeče</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Odebrat označený klíč</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1252,6 +1503,57 @@ Pokud tento počet ponecháte, může být velmi snadné prolomit šifrování v
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Změnit existující čas rozšifrování</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Doba rozšifrování (v sekundách)</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Formát databáze</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Šifrovací algoritmus</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Funkce pro odvození klíče</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Počet průchodů transformace</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Využití operační paměti</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Souběžné zpracovávání</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Vystavené záznamy</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>&amp;Nevystavovat tuto databázi</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Vystavit záznamy nacházející s v této sk&amp;upině:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Pro přístup k těmto nastavením zapněte fd.o Secret Service.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1299,6 +1601,40 @@ Pokud tento počet ponecháte, může být velmi snadné prolomit šifrování v
<source>Enable &amp;compression (recommended)</source>
<translation>Zapnout &amp;kompresi (doporučeno)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Kolonka název databáze</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Kolonka popis databáze</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Kolonka výchozí uživatelské jméno</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Nejvyšší umožněný počet historických záznamů pro jednotlivé záznamy</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Nejvyšší umožněná velikost historických záznamů pro jednotlivé záznamy</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Smazat Koš</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Chcete smazat stávající Koš a vše co obsahuje?
+Tuto akci nelze vzít zpět.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(staré)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1366,6 +1702,10 @@ Opravdu chcete pokračovat bez hesla?</translation>
<source>Failed to change master key</source>
<translation>Hlavní klíč se nepodařilo změnit</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Pokračovat bez hesla</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1377,6 +1717,129 @@ Opravdu chcete pokračovat bez hesla?</translation>
<source>Description:</source>
<translation>Popis:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Kolonka název databáze</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Kolonka popis databáze</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statistiky</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Další informace získáte najetím kurzoru nad řádky s ikonou chyb.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Název</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Hodnota</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Název databáze</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Popis</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Umístění</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Naposledy uloženo</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Neuložené změny</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>ano</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>ne</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Databáze byla změněna, ale změny doposud nebyly uloženy na disk.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Počet skupin</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Počet položek</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Počet záznamů, kterým skončila platnost</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Databáze obsahuje záznamy, kterým skončila platnost.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Hesel, která se neopakují</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Hesel, které se opakují</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Více než 10% hesel je použito na více místech. Pokud je to jen trochu možné, používejte pro různé účely různá hesla.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Kolikrát nejvýše je možné opakovat použití hesla</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Některá hesla jsou použita více než třikrát. Pokud možno používejte pro každou věc jiné heslo.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Počet krátkých hesel</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Doporučené minimum délky hesla je alespoň 8 znaků.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Počet slabých hesel</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Doporučovat používání dlouhých, náhodných hesel s hodnocením „dobré“ nebo „excelentní“.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Průměrná délka hesla</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 znaků</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Průměrná délka hesla je kratší, než deset znaků. Delší hesla poskytují vyšší zabezpečení.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1427,10 +1890,6 @@ This is definitely a bug, please report it to the developers.</source>
Toto je nepochybně chyba, nahlaste ji prosím vývojářům.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Soubor s databází neexistuje nebo není přístupný.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Vyberte CSV soubor</translation>
</message>
@@ -1453,6 +1912,30 @@ Toto je nepochybně chyba, nahlaste ji prosím vývojářům.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [pouze pro čtení]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>%1 se nepodařilo otevřít. Buď neexistuje, nebo není přístupné.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Exportovat databázi do HTML souboru</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML soubor</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Zápis do HTML souboru se nezdařil.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Potvrzení exportu</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Chystáte se exportovat svou databázi do nešifrovaného souboru. To zanechá vaše hesla a citlivé informace zranitelné. Opravdu to chcete?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1470,7 +1953,7 @@ Toto je nepochybně chyba, nahlaste ji prosím vývojářům.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Opravdu přesunout %n záznam do Koše? ()</numerusform><numerusform>Opravdu přesunout %n záznamy do Koše? ()</numerusform><numerusform>Opravdu přesunout %n záznamů do Koše?</numerusform><numerusform>Opravdu přesunout %n záznamů do Koše?</numerusform></translation>
+ <translation><numerusform>Opravdu přesunout %n záznam do Koše?</numerusform><numerusform>Opravdu přesunout %n záznamy do Koše?</numerusform><numerusform>Opravdu přesunout %n záznamů do Koše?</numerusform><numerusform>Opravdu přesunout %n záznamy do Koše?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1532,19 +2015,15 @@ Přejete si je sloučit?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Opravdu chcete %n položku nadobro smazat?</numerusform><numerusform>Opravdu chcete %n položky nadobro smazat?</numerusform><numerusform>Opravdu chcete %n položek nadobro smazat?</numerusform><numerusform>Opravdu chcete %n položky nadobro smazat?</numerusform></translation>
+ <translation><numerusform>Opravdu chcete nadobro smazat %n položku?</numerusform><numerusform>Opravdu chcete nadobro smazat %n položky?</numerusform><numerusform>Opravdu chcete nadobro smazat %n položek?</numerusform><numerusform>Opravdu chcete nadobro smazat %n položky?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Smazat položku</numerusform><numerusform>Smazat položky</numerusform><numerusform>Smazat položek</numerusform><numerusform>Smazat položky</numerusform></translation>
+ <translation><numerusform>Smazat položku?</numerusform><numerusform>Smazat položky?</numerusform><numerusform>Smazat položek?</numerusform><numerusform>Smazat položky?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Přesunout položku do Koše?</numerusform><numerusform>Přesunout položky do Koše?</numerusform><numerusform>Přesunout položek do Koše?</numerusform><numerusform>Přesunout položky do Koše?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Soubor otevřen v režimu pouze pro čtení.</translation>
+ <translation><numerusform>Přesunout položku do Koše?</numerusform><numerusform>Přesunout položky do Koše?</numerusform><numerusform>Přesunout položky do Koše?</numerusform><numerusform>Přesunout položky do Koše?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1587,12 +2066,6 @@ Disable safe saves and try again?</source>
Vypnout bezpečné ukládání a zkusit to znovu?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Zápis do databáze se nezdařil.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Hesla</translation>
</message>
@@ -1602,7 +2075,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
</message>
<message>
<source>KeePass 2 Database</source>
- <translation>Databáze ve formátu KeePass 2</translation>
+ <translation>Databáze ve formátu KeePass verze 2</translation>
</message>
<message>
<source>Replace references to entry?</source>
@@ -1636,6 +2109,14 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Shared group...</source>
<translation>Sdílená skupina…</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Zápis do databáze se nezdařil: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Tato databáze je otevřena v režimu pouze pro čtení. Automatické ukládání je vypnuto.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1717,11 +2198,11 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n týden</numerusform><numerusform>%n týdny</numerusform><numerusform>%n týdnů</numerusform><numerusform>%n týdnů</numerusform></translation>
+ <translation><numerusform>%n týden</numerusform><numerusform>%n týdny</numerusform><numerusform>%n týdnů</numerusform><numerusform>%n týdny</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform><numerusform>%n měsíců</numerusform></translation>
+ <translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform><numerusform>%n měsíce</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1755,6 +2236,18 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Confirm Removal</source>
<translation>Potvrdit odebrání</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Napojení na webový prohlížeč</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;prázdná URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Opravdu chcete tuto URL odebrat?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1794,6 +2287,42 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Background Color:</source>
<translation>Barva pozadí:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Výběr atributu</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Hodnota atributu</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Přidat nový atribut</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Odebrat označený atribut</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Upravit název atributu</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Vyp/zap. ochranu atributu</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Zobrazit chráněný atribut</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Výběr barvy popředí</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Výběr barvy pozadí</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1829,6 +2358,77 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Pro toto přiřazení použít konkrétní posloupnost:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Uživatelsky určená posloupnost automatického vyplňování</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Otevřít webovou stránku s nápovědou k automatickému vyplňování</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Existující přiřazení k oknům</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Přidat nové přiřazení k oknu</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Odebrat označené přiřazení k oknu</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Pro shodu s čímkoli je možné použít hvězdičku (*)</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Nastavit název okna, podle kterého přiřadit</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Pro shodu s čímkoli je možné použít hvězdičku</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Uživatelsky určená posloupnost automatického vyplňování pro toto okno</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Tato nastavení ovlivní chování záznamu pro rozšíření pro webový prohlížeč.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Obecné</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Přeskočit automatické odeslání pro tento záznam</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Skrýt tento záznam před rozšířením pro prohlížeč</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Další URL adresy</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Přidat</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odebrat</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Upravit</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1848,6 +2448,26 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Delete all</source>
<translation>Smazat vše</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Výběr historie záznamu</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Zobrazit záznam ve vybraném stavu v historii</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Obnovit záznam do podoby označeného stavu v historii</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Smazat označený stav v historii</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Smazat veškerou historii</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1887,6 +2507,62 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Expires</source>
<translation>Platnost skončí</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Kolonka pro URL</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Stáhnout ikonu webu pro URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Kolonka pro zopakování zadání hesla</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Vyp./zap vytváření hesel</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Kolonka pro heslo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Zobraz./nezobrazovat hesla</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Zobraz./nezobrazovat poznámky</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Kolonka data a času konce platnosti</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Předpřipravené konce platnosti</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Předpřipravené konce platnosti</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Kolonka pro poznámky</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Kolonka pro název</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Kolonka pro uživatelské jméno</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Vyp/zap. skončení platnosti</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1963,6 +2639,22 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Při použití tohoto klíče vyžadovat potvrzení od uživatele</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Odebrat klíč z agenta po uplynutí zadaného počtu sekund</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Nalistovat soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Soubor s externím klíčem</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Vybrat soubor, který přiložit</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1998,6 +2690,10 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Převzít od nadřazené skupiny (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Položka má neuložené změny</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2026,68 +2722,99 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<translation>Neaktivní</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importovat z umístění</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Nepodepsaný KeeShare kontejner</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportovat do umístění</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare sdílený kontejner</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchronizovat s umístěním</translation>
+ <source>Select import source</source>
+ <translation>Vybrat zdroj importu</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Vámi používaná verze KeePassXC nepodporuje sdílení vašeho typu kontejneru. Použijte %1.</translation>
+ <source>Select export target</source>
+ <translation>Vybrat cíl importu</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Sdílení databáze je vypnuto</translation>
+ <source>Select import/export file</source>
+ <translation>Vybrat importní/exportní soubor</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Export databáze je vypnutý</translation>
+ <source>Clear</source>
+ <translation>Vyčistit</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Import databáze je vypnutý</translation>
+ <source>Import</source>
+ <translation>Importovat</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Nepodepsaný KeeShare kontejner</translation>
+ <source>Export</source>
+ <translation>Export</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare sdílený kontejner</translation>
+ <source>Synchronize</source>
+ <translation>Synchronizovat</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Vybrat zdroj importu</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Vámi používaná verze KeePassXC nepodporuje sdílení tohoto typu kontejneru.
+Podporovaná rozšíření jsou: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Vybrat cíl importu</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 už je exportováno touto databází.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Vybrat importní/exportní soubor</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 už je importováno touto databází.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Vyčistit</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 je importováno a exportováno jinými skupinami v této databázi.</translation>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare je nyní vypnuté. Import/export je možné zapnout v nastavení aplikace.</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Exportování databáze je nyní vypnuto v nastavení aplikace.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Import do databáze je nyní vypnutý v nastavení aplikace.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Kolonka pro režim sdílení</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Kolonka pro popis umístění sdíleného souboru</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Nalistovat sdílený soubor</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Kolonka pro heslo</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Exportní kontejner %1 už je odkazován.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Zobraz./nezobrazovat hesla</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Importní kontejner %1 už byl naimportován.</translation>
+ <source>Toggle password generator</source>
+ <translation>Vyp./zap vytváření hesel</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Kontejner %1 naimportován a exportován různými skupinami.</translation>
+ <source>Clear fields</source>
+ <translation>Vyčistit kolonky</translation>
</message>
</context>
<context>
@@ -2120,6 +2847,34 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Nastavit výchozí pořadí automatického vyplňování</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Kolonka pro název</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Kolonka pro poznámky</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Vyp/zap. skončení platnosti</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Vyp/zap. automatické vyplňování pro tuto a podskupiny</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Kolonka data a času konce platnosti</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Vyp/zap. pro tuto a podskupiny</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Výchozí kolonka pro posloupnost automatického vyplňování</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2156,22 +2911,10 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<translation>Veškeré soubory</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Tato vlastní ikona už existuje</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Potvrdit smazání</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Uživatelsky určená ikona úspěšně stažena</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Rada: Jako náhradní řešení můžete zapnout DuckDuckGo v Nástroje → Nastavení → Zabezpečení</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Vyberte obrázky</translation>
</message>
@@ -2185,7 +2928,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n ikona už v databázi existuje</numerusform><numerusform>%n ikony už v databázi existují</numerusform><numerusform>%n ikon už v databázi existuje</numerusform><numerusform>%n ikony už v databázi existují</numerusform></translation>
+ <translation><numerusform>V databázi už existuje %n ikona</numerusform><numerusform>V databázi už existují %n ikony</numerusform><numerusform>V databázi už existuje %n ikon</numerusform><numerusform>V databázi už existují %n ikony</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
@@ -2195,6 +2938,42 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Tato ikona je používána %n záznamem a bude nahrazena výchozí ikonou. Opravdu ji chcete smazat?</numerusform><numerusform>Tato ikona je používána %n záznamy a bude nahrazena výchozí ikonou. Opravdu ji chcete smazat?</numerusform><numerusform>Tato ikona je používána %n záznamy a bude nahrazena výchozí ikonou. Opravdu ji chcete smazat?</numerusform><numerusform>Tato ikona je používána %n záznamy a bude nahrazena výchozí ikonou. Opravdu ji chcete smazat?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Používání služby DuckDuckGo pro stahování ikon webových stránek je možné zapnout v Nástroje -&gt; Nastavení -&gt; zabezpečení</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Stáhnout ikonu webu pro URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Uplatnit označenou ikonu na podskupiny a záznamy</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Použí&amp;t ikonu na…</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Použít pouze na toto</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Uplatnit také na podskupiny</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Uplatnit také na obsažené záznamy</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Uplatnit také na vše obsažené</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Vybrána existující ikona.</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2240,6 +3019,30 @@ Dotčený zásuvný modul to může rozbít.</translation>
<source>Value</source>
<translation>Hodnota</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Datum a čas vytvoření</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Datum a čas změny</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Datum a čas přístupu</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Neopakující se identifikátor</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Data zásuvného modulu</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Odebrat označená data zásuvného modulu</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2287,7 +3090,7 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Opravdu chcete odebrat %n přílohu?</numerusform><numerusform>Opravdu chcete odebrat %n přílohy?</numerusform><numerusform>Opravdu chcete odebrat %n příloh?</numerusform><numerusform>Opravdu chcete odebrat %n příloh?</numerusform></translation>
+ <translation><numerusform>Opravdu chcete odebrat %n přílohu?</numerusform><numerusform>Opravdu chcete odebrat %n přílohy?</numerusform><numerusform>Opravdu chcete odebrat %n příloh?</numerusform><numerusform>Opravdu chcete odebrat %n přílohy?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2334,10 +3137,30 @@ Dotčený zásuvný modul to může rozbít.</translation>
%1</source>
<translation><numerusform>Nedaří se otevřít soubor:
%1</numerusform><numerusform>Nedaří se otevřít soubory:
-%1</numerusform><numerusform>Nedaří se otevřít soubory:
+%1</numerusform><numerusform>Nedaří se otevřít souborů:
%1</numerusform><numerusform>Nedaří se otevřít soubory:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Přílohy</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Přidat novou přílohu</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Odebrat označenou přílohu</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Otevřít označenou přílohu</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Uložit označenou přílohu na disk</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2432,10 +3255,6 @@ Dotčený zásuvný modul to může rozbít.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Vytvořit token na času založeného jednorázového hesla (TOTP)</translation>
- </message>
- <message>
<source>Close</source>
<translation>Zavřít</translation>
</message>
@@ -2481,7 +3300,7 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
<message>
<source>Sequence</source>
- <translation>Posloupnost</translation>
+ <translation>Pořadí</translation>
</message>
<message>
<source>Searching</source>
@@ -2520,6 +3339,14 @@ Dotčený zásuvný modul to může rozbít.</translation>
<source>Share</source>
<translation>Sdílet</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Zobrazit stávající hodnotu TOTP</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Pokročilé</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2553,11 +3380,33 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Koš</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Záznam „%1“ z databáze „%2“ byl použit %3</translation>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Nepodařilo se zaregistrovat službu DBus na %1: je spuštěná jiná služba.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n záznam byl použit %1</numerusform><numerusform>%n záznamy byly použity %1</numerusform><numerusform>%n záznamů bylo použito %1</numerusform><numerusform>%n záznamy byly použity %1</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo tajná služba: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2576,6 +3425,59 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Stáhnout ikony webů</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Máte problémy se stahováním ikon?
+Můžete zapnout službu pro stahování ikon z DuckDuckGo v sekci zabezpečení v nastavení aplikace.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zavřít</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL adresa</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Stav</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Čekejte, zpracovává se seznam položek…</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Stahování…</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Už existuje</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Stažení se nezdařilo</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Stahování ikon webů (%1/%2)…</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2590,17 +3492,13 @@ Dotčený zásuvný modul to může rozbít.</translation>
<name>Kdbx3Reader</name>
<message>
<source>Unable to calculate master key</source>
- <translation>Nedaří se vypočítat hlavní klíč</translation>
+ <translation>Nedaří se spočítat hlavní klíč</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
<translation>Nedaří se vyvolat výzva-odpověď.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Byl zadán nesprávný klíč, nebo je soubor s databází poškozený.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>chybí databázové hlavičky</translation>
</message>
@@ -2620,6 +3518,12 @@ Dotčený zásuvný modul to může rozbít.</translation>
<source>Invalid header data length</source>
<translation>Neplatné délka dat hlavičky</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Byly zadány neplatné přihlašovací údaje, zkuste to prosím znovu.
+Pokud se toto opakuje, pak je možné, že je váš soubor s databází poškozený.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2629,7 +3533,7 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Nedaří se vypočítat hlavní klíč</translation>
+ <translation>Nedaří se spočítat hlavní klíč</translation>
</message>
</context>
<context>
@@ -2640,7 +3544,7 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Nedaří se vypočítat hlavní klíč</translation>
+ <translation>Nedaří se spočítat hlavní klíč</translation>
</message>
<message>
<source>Invalid header checksum size</source>
@@ -2651,10 +3555,6 @@ Dotčený zásuvný modul to může rozbít.</translation>
<translation>Neshoda SHA256 kontrolního součtu hlavičky</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Nesprávný klíč nebo je soubor s databází poškozený (neshoda HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Neznámá šifra</translation>
</message>
@@ -2754,6 +3654,16 @@ Dotčený zásuvný modul to může rozbít.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Neplatná velikost typu kolonky mapy varianty</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Byly zadány neplatné přihlašovací údaje, zkuste to prosím znovu.
+Pokud se toto opakuje, pak je možné, že je váš soubor s databází poškozený.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC neshoda)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2768,7 +3678,7 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Nedaří se vypočítat hlavní klíč</translation>
+ <translation>Nedaří se spočítat hlavní klíč</translation>
</message>
<message>
<source>Failed to serialize KDF parameters variant map</source>
@@ -2816,7 +3726,7 @@ Dotčený zásuvný modul to může rozbít.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Nejedná se o databázi KeePass.</translation>
+ <translation>Nejedná se o databázi Keepass.</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
@@ -2976,13 +3886,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importovat databázi ve formátu KeePass verze 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Databázi se nedaří otevřít.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importovat databázi ve formátu KeePass1</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3040,10 +3950,6 @@ Line %2, column %3</source>
<translation>Nedaří se spočítat hlavní klíč</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Transformace klíče se nezdařila</translation>
</message>
@@ -3139,40 +4045,58 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>nedaří se posunout na pozici obsahu</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Byly zadány neplatné přihlašovací údaje, zkuste to prosím znovu.
+Pokud se toto opakuje, pak je možné, že je váš soubor s databází poškozený.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Vypnuté sdílení</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Neplatná reference sdílení</translation>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation>Neaktivní sdílení %1</translation>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importováno z %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation>Exportováno do %1</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importovat z</translation>
+ <source>Synchronized with %1</source>
+ <translation>Synchronizováno s %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Exportovat do</translation>
+ <source>Import is disabled in settings</source>
+ <translation>Import je vypnutý v nastavení</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchronizovat s</translation>
+ <source>Export is disabled in settings</source>
+ <translation>Export je vypnutý v nastavení</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Sdílení %1 vypnuto</translation>
+ <source>Inactive share</source>
+ <translation>Neaktivní sdílen</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importovat ze sdílení %1</translation>
+ <source>Imported from</source>
+ <translation>Importováno z</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportovat do sdílení %1</translation>
+ <source>Exported to</source>
+ <translation>Exportováno do</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synchronizovat se sdílením %1</translation>
+ <source>Synchronized with</source>
+ <translation>Synchronizováno s</translation>
</message>
</context>
<context>
@@ -3217,10 +4141,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Procházet</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Tvoř</translation>
</message>
@@ -3275,6 +4195,44 @@ Zpráva: %2</translation>
<source>Select a key file</source>
<translation>Vyberte soubor s klíčem</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Výběr souboru s klíčem</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Nalistovat soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Procházet…</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Vytvořit nový soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Pozn.: Nepoužívejte soubor, který se může změnit, protože by to znemožnilo odemčení databáze!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Neplatný soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Není možné použít stávající databázi jako soubor s klíčem pro ní samotnou. Zvolte jiný soubor nebo nějaký vytvořte.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Podezřelý soubor s klíčem</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Zvolený soubor se zdá být souborem s databází hesel. Je třeba, aby soubor s klíčem byl soubor, který se nikdy nezmění, nebo navždy ztratíte k databázi přístup.
+Opravdu chcete tento soubor použít?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3363,10 +4321,6 @@ Zpráva: %2</translation>
<translation>Na&amp;stavení</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Generátor hesel</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>Uzamknout databáze</translation>
</message>
@@ -3553,14 +4507,6 @@ Doporučujeme použít AppImage, které je k dispozici v sekci stahování naši
<translation>Zobrazit QR kód s TOTP…</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Zjistit dostupnost aktualizací…</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Sdílet položku</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>UPOZORNĚNÍ: Používáte vývojové sestavení KeePassXC!
@@ -3578,6 +4524,74 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>You can always check for updates manually from the application menu.</source>
<translation>Vždy můžete aktualizace vyhledávat ručně z nabídky aplikace.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Export</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Zjistit dostupnost případných aktualizací…</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>&amp;Stáhnout veškeré ikony webů</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Seřadit &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Seřadit &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Vytváření hesel</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Stáhnout ikonu webu (favicon)</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Exportovat do HTML souboru…</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password trezor…</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importovat 1Password trezor</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Začínáme</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Otevřít PDF s příručkou Začínáme</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>Náp&amp;ověda na webu…</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Přejít na dokumentaci na webu (otevře prohlížeč)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>&amp;Uživatelská příručka</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Otevřít PDF s uživatelskou příručkou</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Klávesové zkratky</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3637,6 +4651,14 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Adding missing icon %1</source>
<translation>Přidávání chybějící ikony %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Odebrána uživatelsky určená data %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Přidávána uživatelsky určená data %1 [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3707,6 +4729,73 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>Neplatné OpData01 – neobsahuje hlavičku</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Nedaří se číst všech IV bajtů, chtěno 16, ale obdrženo %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Nedaří se inicializovat šifru pro opdata01: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Nedaří se číst všechny bajty HMAC signatury</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>Chybně formulované OpData01 kvůli selhavšímu HMAC</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Nedaří se zpracovat clearText v jednom kroku</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>Očekáváno %1 bajtů v neformátovaném textu, nalezeno %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Čtení databáze nevytvořilo instanci
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Je třeba, aby existovala složka .opvault</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>Je třeba, aby složka .opvault byla přístupná pro čtení</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Je třeba, aby existovala složka .opvault/default</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Je třeba, aby složka .opvault/default byla přístupná pro čtení</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Nedaří se dekódovat masterKey: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Nedaří se odvodit hlavní klíč: %1</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3806,6 +4895,17 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Zadání hesla se neshodují</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Zadání hesla jsou zatím shodná</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3831,6 +4931,22 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Generate master password</source>
<translation>Vytvořit hlavní heslo</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Kolonka pro heslo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Zobraz./nezobrazovat hesla</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Kolonka pro zopakování zadání hesla</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Vyp./zap vytváření hesel</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3860,22 +4976,10 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<translation>Typy znaků</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Velká písmena</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Malá písmena</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Číslice</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Zvláštní znaky</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Rozšířené ASCII</translation>
</message>
@@ -3956,18 +5060,10 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<translation>Pokročilé</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Velká písmena od A do F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Malá písmena od A do F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4000,18 +5096,10 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematické</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Pomlčky</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4059,6 +5147,74 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Regenerate</source>
<translation>Vytvoř nové</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Vytvořené heslo</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Velká písmena</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Malá písmena</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Zvláštní znaky</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Matematické symboly</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Pomlčky a lomítka</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Vyloučené znaky</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Šestnáctková hesla</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Délka hesla</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Velikost písmen:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Znovu vytvořit heslo</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Zkopírovat heslo</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Přijmout heslo</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>malá písmena</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>VELKÁ PÍSMENA</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Velikost písmen nadpisu</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Zobraz./nezobrazovat hesla</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4066,12 +5222,9 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Vybrat</translation>
+ <source>Statistics</source>
+ <translation>Statistiky</translation>
</message>
</context>
<context>
@@ -4108,6 +5261,10 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Merge</source>
<translation>Sloučit</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Pokračovat</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4200,10 +5357,6 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<translation>Vytvořit heslo pro položku.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Délka vytvářeného hesla.</translation>
- </message>
- <message>
<source>length</source>
<translation>délka</translation>
</message>
@@ -4253,18 +5406,6 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<translation>Provést pokročilou analýzu hesla.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Vytáhnout a vypsat obsah databáze.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Umístění databáze ze které vytáhnout.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Zadejte heslo pro odemknutí %1:</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4308,10 +5449,6 @@ Příkazy k dispozici:
<translation>Sloučit dvě databáze.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Umístění databáze do které sloučit.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Umístění databáze ze které sloučit.</translation>
</message>
@@ -4388,10 +5525,6 @@ Příkazy k dispozici:
<translation>Napojení na webový prohlížeč</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>Výzva–odpověď YubiKey[%1] – slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Stisknout</translation>
</message>
@@ -4422,10 +5555,6 @@ Příkazy k dispozici:
<translation>Vytvořit nové náhodné heslo.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Neplatná hodnota pro délku hesla %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Nedaří se vytvořit položku v umístění %1.</translation>
</message>
@@ -4467,7 +5596,7 @@ Příkazy k dispozici:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Vyčištění schránky za %1 sekundu…</numerusform><numerusform>Vyčištění schránky za %1 sekundy…</numerusform><numerusform>Vyčištění schránky za %1 sekund…</numerusform><numerusform>Vyčištění schránky za %1 sekundy…</numerusform></translation>
+ <translation><numerusform>Obsah schránky bude vymazán za %1 sekundu…</numerusform><numerusform>Obsah schránky bude vymazán za %1 sekundy…</numerusform><numerusform>Obsah schránky bude vymazán za %1 sekund…</numerusform><numerusform>Obsah schránky bude vymazán za %1 sekundy…</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4483,10 +5612,6 @@ Příkazy k dispozici:
<translation>počet</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Neplatná hodnota pro délku hesla: %1.</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Položku se nedaří v umístění %1 nalézt.</translation>
</message>
@@ -4611,26 +5736,6 @@ Příkazy k dispozici:
<translation>Nepodařilo se načíst soubor s klíčem %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Soubor %1 neexistuje.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Soubor %1 se nedaří otevřít.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Chyba při čtení databáze:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Chyba při zpracování databáze:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Délka vytvářeného hesla</translation>
</message>
@@ -4643,10 +5748,6 @@ Příkazy k dispozici:
<translation>Použít velká písmena</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Použít čísla.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Použít zvláštní znaky</translation>
</message>
@@ -4791,10 +5892,6 @@ Příkazy k dispozici:
<translation>Nová databáze úspěšně vytvořena.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Zadejte heslo pro zašifrování databáze (pokud nechcete vyplňovat, stiskněte Enter):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Vytváření souboru s klíčem %1 se nezdařilo: %2</translation>
</message>
@@ -4803,10 +5900,6 @@ Příkazy k dispozici:
<translation>Načítání souboru s klíčem %1 se nezdařilo: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Odebrat položku z databáze.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Popis umístění položky k odebrání.</translation>
</message>
@@ -4862,6 +5955,332 @@ Příkazy k dispozici:
<source>Cannot create new group</source>
<translation>Novou skupinu se nedaří vytvořit</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Deaktivovat klíč heslo pro databázi.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Zobrazuje ladící informace.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Deaktivovat klíč heslo pro databázi, ze které sloučit.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Verze %1
+</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Typ sestavení: %1
+</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revize: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribuce: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Ladící režim je vypnutý.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Ladící režim je zapnutý.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operační systém: %1
+Architektura procesoru: %2
+Jádro systému: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Automatické vyplňování</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (podepsané a nepodepsané sdílení)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (pouze podepsané sdílení)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (pouze nepodepsané sdílení)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Žádné</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Zapnutá rozšíření:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Kryptografické knihovny:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Není možné vytvořit a dotázat se na heslo naráz!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Přidá do databáze novou skupinu.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Popis umístění skupiny, kterou přidat.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Skupina %1 už existuje!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Skupina %1 nenalezena.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Úspěšně přidána skupina %1.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Zkontrolovat, zda otisky některých z hesel unikly na veřejnost. Je třeba, aby SOUBOR byl popis umístění souboru, obsahujícího výpis SHA-1 otisků uniklých hesel ve formátu HIBP, jak je k dispozici z https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>SOUBOR</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analyzovat hesla a vyhledat slabiny a ostatní problémy.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Nepodařilo se otevřít HIBP soubor %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Vyhodnocování databázových záznamů vůči HIBP souboru – chvíli potrvá…</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Zavřít právě otevřenou databázi.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Zobrazit tuto nápovědu.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Slot v Yubikey použitý pro šifrování databáze.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>slot</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Neplatný počet slov %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>Seznam slov je příliš malý (&lt; 1000 položek)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Opustit interaktivní režim.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Formát který použít pro export. Možnosti jsou xml nebo csv. Výchozí je xml.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Exportuje obsah databáze na standardní výstup v zadaném formátu.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Nedaří se exportovat databázi do XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Nepodporovaný formát %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Použít čísla</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Neplatná délka hesla %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Zobrazit nápovědu k příkazu</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Příkazy k dispozici:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Importovat obsah XML databáze.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Popis umístění XML souboru pro export z databáze.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Popis umístění nové databáze.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Nedaří se importovat XML export z databáze %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Úspěšně naimportovaná databáze.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Neznámý příkaz %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Zploští výstup do jediných řádek.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Vypsat pouze změny zjištěné operací sloučení.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Slož na Yubikey pro druhou databázi.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>%1 úspěšně sloučeno do %2.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Databáze nebyla operací slučování upravena.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Přesune záznam do nové skupiny.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Popis umístění záznamu, který přesunout.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Popis umístění cílové skupiny.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Nedaří se nalézt skupinu s popisem umístění %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>Záznam už se nachází ve skupině %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Záznam %1 úspěšně přesunut do skupiny %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Otevřít databázi.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Popis umístění skupiny, kterou odebrat.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Z databáze není možné odebrat kořenovou skupinu.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Skupina %1 úspěšně zrecyklována.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Úspěšně smazána skupina %1.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Nepodařilo se otevřít soubor s databází %1: nenalezen</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Nepodařilo se otevřít soubor s databází %1: nejedná se o holý soubor</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Nepodařilo se otevřít soubor s databází %1: není přístupný pro čtení</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Zadejte heslo pro odemčení %1:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Neplatný slot na YubiKey %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Odemkněte %1 dotknutím se tlačítka na YubiKey</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Zadejte heslo pro zašifrování databáze (volitelné):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>HIBP soubor, řádek %1: chyba zpracovávání</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Zapnout napojení na Secret Service</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Uživatelské jméno</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Výzva-odpověď – slot %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Otisk z hesla pro „%1“ unikl %2 krát!</numerusform><numerusform>Otisk z hesla pro „%1“ unikl %2 krát!</numerusform><numerusform>Otisk z hesla pro „%1“ unikl %2 krát!</numerusform><numerusform>Otisk z hesla pro „%1“ unikl %2 krát!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Po uplatnění všech možností není vytváření hesel platné</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5016,6 +6435,93 @@ Příkazy k dispozici:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Možnosti</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Zapnout napojení KeepassXC na Freedesktop Secret Service </translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Obecné</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Při vyžádání si přihlašovacích údajů zobrazit oznámení</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;/p&gt;Pokud je pro databázi zapnutý Koš, záznamy budou přesouvány přímo do něj. Jinak budou bez potvrzování smazány.&lt;/p&gt;&lt;p&gt;Pokud je položka odkazována z jiné, budete ale dotázáni.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Když jsou záznamy mazány klienty, nevyžadovat potvrzení.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Vystavené skupiny databáze:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Soubor</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Skupina</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Spravovat</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorizace</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Tyto aplikace jsou aktuálně připojené:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Aplikace</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Odpojit</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Nastavení databáze</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Upravit nastavení databáze</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Odemknout databázi</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Odemknout databázi a zobrazit další informace</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Uzamknout databázi</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Odemkněte pro zobrazení</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Žádné</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5138,9 +6644,100 @@ Příkazy k dispozici:
<source>Signer:</source>
<translation>Podepsal(a):</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Umožnit KeeShare importy</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Umožnit KeeShare exporty</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Zobrazovat pouze varování a chyby</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Klíč</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Kolonka pro jméno podepisujícího</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Vytvořit nový certifikát</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importovat existující certifikát</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Exportovat vlastní certifikát</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Známá sdílení</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Důvěřovat označený certifikát</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Ptát se pokaždé zda označenému certifikátu důvěřujete</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Přestat důvěřovat označenému certifikátu</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Odebrat označený certifikát</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Přepsání podepsaného kontejneru sdílení není podporováno – exportu zabráněno</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Nedaří se zapsat exportní kontejner (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Nedaří se zapouzdřit podpis: Soubor se nedaří otevřít pro zápis (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Nedaří se zapouzdřit podpis: Do souboru se nedaří zapsat (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Nedaří se zapouzdřit databázi: Soubor se nedaří otevřít pro zápis (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Nedaří se zapouzdřit databázi: Do souboru se nedaří zapsat (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Přepsání nepodepsaného kontejneru sdílení není podporováno – exportu zabráněno</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Nedaří se zapsat do exportního kontejneru</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Došlo k neočekávané chybě exportu</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importovat z kontejneru bez podpisu</translation>
@@ -5154,6 +6751,10 @@ Příkazy k dispozici:
<translation>Importovat z kontejneru s certifikátem</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Věříte %1 s otiskem %2 od %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Tentokrát ne</translation>
</message>
@@ -5170,18 +6771,6 @@ Příkazy k dispozici:
<translation>Jen pro teď</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Import z %1 se nezdařil (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Import z %1 úspěšný (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importováno z %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Kontejner podepsaného sdílení není podporován – importu zabráněno</translation>
</message>
@@ -5221,25 +6810,20 @@ Příkazy k dispozici:
<source>Unknown share container type</source>
<translation>Neznámý typ kontejneru pro sdílení</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Přepsání podepsaného kontejneru sdílení není podporováno – exportu zabráněno</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Nedaří se zapsat exportní kontejner (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Přepsání nepodepsaného kontejneru sdílení není podporováno – exportu zabráněno</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import z %1 se nezdařil (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Nedaří se zapsat do exportního kontejneru</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import z %1 úspěšný (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Došlo k neočekávané chybě exportu</translation>
+ <source>Imported from %1</source>
+ <translation>Importováno z %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5254,10 +6838,6 @@ Příkazy k dispozici:
<translation>Exportovat do %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Věříte %1 s otiskem %2 od %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Popis umístění zdroje pro vícero importů do %1 v %2</translation>
</message>
@@ -5265,22 +6845,6 @@ Příkazy k dispozici:
<source>Conflicting export target path %1 in %2</source>
<translation>Kolidující popis umístění %1 cíle exportu v %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Nedaří se zapouzdřit podpis: Soubor se nedaří otevřít pro zápis (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Nedaří se zapouzdřit podpis: Do souboru se nedaří zapsat (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Nedaří se zapouzdřit databázi: Soubor se nedaří otevřít pro zápis (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Nedaří se zapouzdřit databázi: Do souboru se nedaří zapsat (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5298,7 +6862,7 @@ Příkazy k dispozici:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Platnost končí za &lt;b&gt;%n&lt;/b&gt; sekundu</numerusform><numerusform>Platnost končí za %n sekundy</numerusform><numerusform>Platnost končí za %n sekund</numerusform><numerusform>Platnost končí za %n sekundy</numerusform></translation>
+ <translation><numerusform>Platnost skončí za &lt;b&gt;%n&lt;/b&gt; sekundu</numerusform><numerusform>Platnost skončí za %n sekundy</numerusform><numerusform>Platnost skončí za %n sekund</numerusform><numerusform>Platnost skončí za %n sekundy</numerusform></translation>
</message>
</context>
<context>
@@ -5328,10 +6892,6 @@ Příkazy k dispozici:
<translation>Nastavit na času založené jednorázové heslo (TOTP)</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Klíč:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Výchozí nastavení RFC 6238 tokenu</translation>
</message>
@@ -5361,16 +6921,46 @@ Příkazy k dispozici:
<translation>Velikost kódu:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 číslic</translation>
+ <source>Secret Key:</source>
+ <translation>Tajný klíč:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>Je třeba, aby tajný klíč byl ve formátu Base32</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Kolonka pro tajný klíč</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritmus:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Kolonka pro časový krok</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 číslic</translation>
+ <source> digits</source>
+ <translation>číslice</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 číslic</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>Neplatné TOTP tajemství</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Zadali jste neplatný tajný klíč. Je třeba, aby byl ve formátu Base32.
+Příklad: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Potvrdit odebrání nastavení pro TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Opravdu chcete smazat nastavení TOTP u tohoto záznamu?</translation>
</message>
</context>
<context>
@@ -5454,6 +7044,14 @@ Příkazy k dispozici:
<source>Welcome to KeePassXC %1</source>
<translation>Vítejte v KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importovat z 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Otevřít nedávno otevřenou databázi</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5477,5 +7075,13 @@ Příkazy k dispozici:
<source>No YubiKey inserted.</source>
<translation>Není připojeno žádné Yubikey zařízení.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Znovu načíst hardwarová bezpečnostní zařízení</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Výběr slotu v hardwarovém klíči</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_da.ts b/share/translations/keepassx_da.ts
index 558cfbd6f..eb096f963 100644
--- a/share/translations/keepassx_da.ts
+++ b/share/translations/keepassx_da.ts
@@ -31,11 +31,11 @@
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
- <translation>Inkludér følgende information når du indrapporterer en fejl:</translation>
+ <translation>Inkludér følgende information når du rapporterer en fejl:</translation>
</message>
<message>
<source>Copy to clipboard</source>
- <translation>Kopier til udklipsholder</translation>
+ <translation>Kopiér til udklipsholder</translation>
</message>
<message>
<source>Project Maintainers:</source>
@@ -43,18 +43,18 @@
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
- <translation>Særlig tak fra KeePassXC holdet går til debfx for at udvikle den oprindelige KeePassX.</translation>
+ <translation>Særlig tak fra KeePassXC-holdet går til debfx for at udvikle den oprindelige KeePassX.</translation>
</message>
</context>
<context>
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>Slå SSH Agenten til (kræver genstart)</translation>
+ <translation>Aktivér SSH-agent (kræver genstart)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
- <translation type="unfinished"/>
+ <translation>Brug OpenSSH til Windows i stedet for Pageant</translation>
</message>
</context>
<context>
@@ -77,22 +77,30 @@
</message>
<message>
<source>Icon only</source>
- <translation type="unfinished"/>
+ <translation>Kun ikon</translation>
</message>
<message>
<source>Text only</source>
- <translation type="unfinished"/>
+ <translation>Kun tekst</translation>
</message>
<message>
<source>Text beside icon</source>
- <translation type="unfinished"/>
+ <translation>Tekst ved siden af ikon</translation>
</message>
<message>
<source>Text under icon</source>
- <translation type="unfinished"/>
+ <translation>Tekst uden ikon</translation>
</message>
<message>
<source>Follow style</source>
+ <translation>Følg stil</translation>
+ </message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -100,7 +108,7 @@
<name>ApplicationSettingsWidgetGeneral</name>
<message>
<source>Basic Settings</source>
- <translation>Grundlæggende indstillinnger</translation>
+ <translation>Grundlæggende indstillinger</translation>
</message>
<message>
<source>Startup</source>
@@ -108,23 +116,11 @@
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
- <translation>Start kun en enkelt instans af KeePassXC</translation>
- </message>
- <message>
- <source>Remember last databases</source>
- <translation>Husk seneste databaser</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Husk de sidste nøglefiler og sikkerhedsdongler</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Load den forrige database ved opstart</translation>
+ <translation>Start kun én instans af KeePassXC</translation>
</message>
<message>
<source>Minimize window at application startup</source>
- <translation>Minimér vindue ved opstart</translation>
+ <translation>Minimer vindue ved opstart</translation>
</message>
<message>
<source>File Management</source>
@@ -132,15 +128,15 @@
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
- <translation>Gem databasefiler sikkert (kan være inkompatibelt med Dropbox, etc.)</translation>
+ <translation>Gem databasefiler sikkert (kan være inkompatibelt med Dropbox osv.)</translation>
</message>
<message>
<source>Backup database file before saving</source>
- <translation>Lav backup af databasefil før der gemmes</translation>
+ <translation>Sikkerhedskopiér databasefilen inden den gemmes</translation>
</message>
<message>
<source>Automatically save after every change</source>
- <translation>Gem automatisk ved ændringer</translation>
+ <translation>Gem automatisk når der foretages ændringer</translation>
</message>
<message>
<source>Automatically save on exit</source>
@@ -152,7 +148,7 @@
</message>
<message>
<source>Automatically reload the database when modified externally</source>
- <translation>Load automatisk databasenn når den bliver ændret udefra</translation>
+ <translation>Genindlæs automatisk databasen når den er blevet ændret eksternt</translation>
</message>
<message>
<source>Entry Management</source>
@@ -163,12 +159,8 @@
<translation>Brug gruppeikon ved oprettelse af post</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimér ved kopiering til udklipsholder</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
- <translation type="unfinished"/>
+ <translation>Skjul panelet til forhåndsvisning af post</translation>
</message>
<message>
<source>General</source>
@@ -176,11 +168,11 @@
</message>
<message>
<source>Hide toolbar (icons)</source>
- <translation type="unfinished"/>
+ <translation>Skjul værktøjslinje (ikoner)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
- <translation type="unfinished"/>
+ <translation>Minimer i stedet for at afslutte programmet</translation>
</message>
<message>
<source>Show a system tray icon</source>
@@ -188,63 +180,140 @@
</message>
<message>
<source>Dark system tray icon</source>
- <translation>Mørk ikon i systembakken</translation>
+ <translation>Mørkt ikon i systembakken</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation>Skjul vindue i systembakken når det er minimeret</translation>
</message>
<message>
- <source>Language</source>
- <translation>Sprog</translation>
- </message>
- <message>
<source>Auto-Type</source>
- <translation>Auto-Indsæt</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
- <translation>Brug post-titel til at matche vinduer for global Auto-Indsæt</translation>
+ <translation>Brug postens titel til at matche vinduer for global autoskriv</translation>
</message>
<message>
<source>Use entry URL to match windows for global Auto-Type</source>
- <translation>Brug post-URL til at matche vinduer for global Auto-Indsæt</translation>
+ <translation>Brug postens URL til at matche vinduer for global autoskriv</translation>
</message>
<message>
<source>Always ask before performing Auto-Type</source>
- <translation>Spørg altid for Auto-Indsæt udføres</translation>
+ <translation>Spørg altid før autoskriv udføres</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
- <translation>Global Auto-Indsæt genvej</translation>
+ <translation>Global genvej til autoskriv</translation>
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation type="unfinished"/>
+ <translation>Skriveforsinkelse for autoskriv</translation>
</message>
<message>
<source> ms</source>
<comment>Milliseconds</comment>
- <translation>ms</translation>
+ <translation> ms</translation>
</message>
<message>
<source>Auto-Type start delay</source>
+ <translation>Startforsinkelse for autoskriv</translation>
+ </message>
+ <message>
+ <source>Movable toolbar</source>
+ <translation>Værktøjslinje kan flyttes</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates at application startup</source>
+ <source>Load previously open databases on startup</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
+ <source>Remember database key files and security dongles</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sek</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
<translation type="unfinished"/>
</message>
</context>
@@ -261,7 +330,7 @@
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>sek</translation>
+ <translation> sek</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -269,11 +338,11 @@
</message>
<message>
<source> min</source>
- <translation type="unfinished"/>
+ <translation> min</translation>
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation type="unfinished"/>
+ <translation>Glem TouchID efter inaktivitet på</translation>
</message>
<message>
<source>Convenience</source>
@@ -281,46 +350,67 @@
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
- <translation>Lås databaser når sessionen låses eller låget er lukket</translation>
+ <translation>Lås databaser når sessionen låses eller låget lukkes</translation>
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation type="unfinished"/>
+ <translation>Glem TouchID når sessionen låses eller låget lukkes</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
- <translation>Lås databaser efter at minimere vinduet</translation>
+ <translation>Lås databaser efter vinduet er blevet minimeret</translation>
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>Lås tidligere låste databaser efter udførsel af Auto-Indsæt</translation>
+ <translation>Lås tidligere låste databaser igen efter udførsel af autoskriv</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>Kræv ikke kodeord gentaget når det er synligt</translation>
+ <translation>Kræv ikke gentagelse af adgangskode når det er synligt</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
- <translation type="unfinished"/>
+ <translation>Skjul ikke adgangskoder når de redigeres</translation>
</message>
<message>
<source>Don&apos;t use placeholder for empty password fields</source>
- <translation type="unfinished"/>
+ <translation>Brug ikke pladsholder til tomme adgangskodefelter</translation>
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
- <translation type="unfinished"/>
+ <translation>Skjul adgangskoder i panelet til forhåndsvisning af post</translation>
</message>
<message>
<source>Hide entry notes by default</source>
- <translation>Skjul post-noter som standard</translation>
+ <translation>Skjul postens bemærkninger som standard</translation>
</message>
<message>
<source>Privacy</source>
<translation>Privatliv</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
<translation type="unfinished"/>
</message>
</context>
@@ -332,27 +422,27 @@
</message>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation>Auto-Indsæt - KeePassXC</translation>
+ <translation>Autoskriv - KeePassXC</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-Indsæt</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation>Syntaksen af dit Auto-Type udtryk er forkert!</translation>
+ <translation>Syntaksen af dit autoskriv-udtryk er forkert!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
- <translation>Denne Auto-Indsæt sætning indeholder en meget lang pause. Er du sikker på at du vil fortsætte? </translation>
+ <translation>Denne autoskriv-kommando indholder en meget lang pause. Er du sikker på, at du vil fortsætte?</translation>
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>Denne Auto-Indsæt kommando indeholder meget langsomme tastetryk. Er du sikker på at du vil fortsætte? </translation>
+ <translation>Denne autoskriv-kommando indholder meget langsomme tastetryk. Er du sikker på, at du vil fortsætte?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
- <translation>Denne Auto-Indsæt kommando indeholder argumenter, som er gentaget ofte. Er du sikker på at du vil fortsætte? </translation>
+ <translation>Denne autoskriv-kommando indholder argumenter, som er gentaget ofte. Er du sikker på, at du vil fortsætte?</translation>
</message>
</context>
<context>
@@ -390,14 +480,29 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Kopiér &amp;brugernavn</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Kopiér adgangsk&amp;ode</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation>Auto-Indsæt - KeePassXC</translation>
+ <translation>Autoskriv - KeePassXC</translation>
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation>Vælg post til Auto-Indsæt:</translation>
+ <translation>Vælg post til autoskriv:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>Søg...</translation>
</message>
</context>
<context>
@@ -421,28 +526,37 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
- <translation>%1 har forespurgt adgang til kodeord tilhørende disse element(er).
+ <translation>%1 har anmodet om adgang til adgangskoder tilhørende disse element(er).
Vælg venligst hvorvidt du vil tillade denne adgang.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
<message>
<source>KeePassXC-Browser Save Entry</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC-Browser gem post</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished"/>
+ <translation>Ok</translation>
</message>
<message>
<source>Cancel</source>
- <translation>Afbryd</translation>
+ <translation>Annuller</translation>
</message>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
- <translation type="unfinished"/>
+ <translation>Du har flere databaser åbne.
+Venligst vælg den korrekte database for at gemme loginoplysninger.</translation>
</message>
</context>
<context>
@@ -456,16 +570,12 @@ Please select the correct database for saving credentials.</source>
<translation>Dette er nødvendigt for at tilgå din database med KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Slå KeepassXC browser integration til</translation>
- </message>
- <message>
<source>General</source>
<translation>Generelt</translation>
</message>
<message>
<source>Enable integration for these browsers:</source>
- <translation>Slå integration til for disse browsere:</translation>
+ <translation>Aktivér integritet for disse browsere:</translation>
</message>
<message>
<source>&amp;Google Chrome</source>
@@ -486,37 +596,37 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Show a &amp;notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Vis en notifikation når legitimationsoplysninger forespørges</translation>
+ <translation>Vis en &amp;underretning når der anmodes om loginoplysninger</translation>
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
- <translation>Anmod om at låse databasen op hvis den er låst</translation>
+ <translation>Anmod om at låse op for databasen hvis den er låst</translation>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>Kun poster med samme skema (http://, https://, ftp://, ...) bliver returneret.</translation>
+ <translation>Kun poster med samme skema (http://, https:// ...) bliver returneret.</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
- <translation>&amp;Match URL skemaer (f.eks., https://...)</translation>
+ <translation>&amp;Match URL-skema (f.eks. https://...)</translation>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>Returner kun det bedste match for en specifik URL i stedet for alle matches for hele domænet.</translation>
+ <translation>Returnér kun det bedste match for en specifik URL i stedet for alle matches for hele domænet.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
- <translation>&amp;Returnér kun de bedst matchende poster</translation>
+ <translation>&amp;Returnér kun de loginoplysninger som matcher bedst</translation>
</message>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Sorter matchende poster efter &amp;navn</translation>
+ <translation>Sortér matchende loginoplysninger efter &amp;titel</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Sorter matchende poster efter &amp;brugernavn</translation>
+ <translation>Sortér matchende loginoplysninger efter &amp;brugernavn</translation>
</message>
<message>
<source>Advanced</source>
@@ -525,99 +635,135 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Spørg aldrig om lov for hente leigitamationsoplysninger</translation>
+ <translation>&amp;Spørg aldrig før loginoplysninger tilgås</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Spørg aldrig før legitimationsoplysninger &amp;ændres</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Kun den valgte database er nødt til at være forbundet med en klient.</translation>
+ <translation>Spørg aldrig før loginoplysninger &amp;opdateres</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Søg i alle åbnede databaser efter matchende legitimationsoplysninger</translation>
+ <translation>Søg i &amp;alle åbne databaser efter matchende loginoplysninger</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
- <translation>At automatisk skabe eller opdatere tekst-felter er ikke understøttet.</translation>
+ <translation>Automatisk oprettelse eller opdatering af tekstfelter understøttes ikke.</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>&amp;Vis avancerede tekst felter som begynder med &quot;KPH:&quot;</translation>
+ <translation>&amp;Returnér avancerede strengfelter som begynder med &quot;KPH: &quot;</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation>Opdaterer KeePassXC eller keepassxc-proxy binære sti automatisk til beskedscript ved opstart</translation>
+ <translation>Opdaterer KeePassXC eller keepassxc-proxy binære sti automatisk til beskedscript ved opstart.</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>Opdater besked manifest dokumenter ved opstart</translation>
+ <translation>Opdater &amp;beskedmanifestfiler ved opstart</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
- <translation>Understøt en proxy applikation mellem KeePassXC og browser-udvidelse.</translation>
+ <translation>Understøttelse af et proxyprogram mellem KeePassXC og browserudvidelse.</translation>
</message>
<message>
<source>Use a &amp;proxy application between KeePassXC and browser extension</source>
- <translation>Understøt en proxy applikation mellem KeePassXC og browser-udvidelse.</translation>
+ <translation>Brug et proxyprogram mellem KeePassXC og browserudvidelse</translation>
</message>
<message>
<source>Use a custom proxy location if you installed a proxy manually.</source>
- <translation>Brug en brugerdefineret proxy lokation hvis du har installeret en proxy manuelt.</translation>
+ <translation>Brug en tilpasset proxyplacering hvis du har installeret en proxy manuelt.</translation>
</message>
<message>
<source>Use a &amp;custom proxy location</source>
<comment>Meant is the proxy for KeePassXC-Browser</comment>
- <translation>Vælg en brugerdefineret proxy lokation</translation>
+ <translation>Brug en tilpasset proxyplacering</translation>
</message>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Gennemse...</translation>
+ <translation>Gennemse ...</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
- <translation>&lt;b&gt;Advarsel:&lt;/b&gt;De følgende instillinger kan være farlige!</translation>
+ <translation>&lt;b&gt;Advarsel:&lt;/b&gt; Følgende indstillinger kan være farlige!</translation>
</message>
<message>
<source>Select custom proxy location</source>
- <translation>Vælg en brugerdefineret proxy lokation</translation>
+ <translation>Vælg en tilpasset proxyplacering</translation>
</message>
<message>
<source>&amp;Tor Browser</source>
+ <translation>&amp;Tor Browser</translation>
+ </message>
+ <message>
+ <source>Executable Files</source>
+ <translation>Eksekverbare filer</translation>
+ </message>
+ <message>
+ <source>All Files</source>
+ <translation>Alle filer</translation>
+ </message>
+ <message>
+ <source>Do not ask permission for HTTP &amp;Basic Auth</source>
+ <extracomment>An extra HTTP Basic Auth setting</extracomment>
+ <translation>Spørg ikke om tilladelse til HTTP &amp;Basic Auth</translation>
+ </message>
+ <message>
+ <source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
+ <translation>Grundet Snap-sandkasse, er du nødsaget til at køre et script for at aktivere browserintegritet.&lt;br /&gt;Du kan hente scriptet fra %1</translation>
+ </message>
+ <message>
+ <source>Please see special instructions for browser extension use below</source>
+ <translation>Venligst se vigtige instruktioner for brug af browser tilføjelsen nedenfor</translation>
+ </message>
+ <message>
+ <source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
+ <translation>KeePassXC-Browser kræves for at browserintegritet skal virke. &lt;br /&gt;Download den til %1 og %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Executable Files</source>
+ <source>&amp;Allow returning expired credentials.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>All Files</source>
+ <source>Enable browser integration</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do not ask permission for HTTP &amp;Basic Auth</source>
- <extracomment>An extra HTTP Basic Auth setting</extracomment>
+ <source>Browsers installed as snaps are currently not supported.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
+ <source>All databases connected to the extension will return matching credentials.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Please see special instructions for browser extension use below</source>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -632,10 +778,10 @@ Please select the correct database for saving credentials.</source>
If you would like to allow it access to your KeePassXC database,
give it a unique name to identify and accept it.</source>
- <translation>Du har modtaget en associeringsanmodelse for the ovenstående nøgle.
+ <translation>Du har modtaget en associeringsanmodelse for ovenstående nøgle.
-Hvis du gerne vil give den adgang til din KeePassXC database,
-så giv den et unikt navn for at kunne identificere den og accepter den.</translation>
+Hvis du vil give den adgang til din KeePassXC-database,
+så giv den et unikt navn for at kunne identificere og acceptere den.</translation>
</message>
<message>
<source>Save and allow access</source>
@@ -665,48 +811,57 @@ Vil du overskrive den?</translation>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation type="unfinished"/>
+ <translation>Konverterer attributter til tilpasset data …</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Konverterede KeePassHTTP-attributter</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>Det lykkedes at konvertere attributter fra %1 post(er).
+Flyttede %2 nøgler til tilpasset data.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Det lykkedes at flytte %n nøgle til tilpasset data.</numerusform><numerusform>Det lykkedes at flytte %n nøgler til tilpasset data.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Fandt ingen post med KeePassHTTP-attributter!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation type="unfinished"/>
+ <translation>Den aktive database indeholder ikke en post med KeePassHTTP-attributter.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Registreret udgået browserintegritetindstillinger</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Opret en ny gruppe</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation type="unfinished"/>
+ <translation>Modtog en anmodning om at oprette en ny gruppe &quot;%1&quot;.
+Vil du oprette gruppen?
+</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation type="unfinished"/>
+ <translation>Dine indstillinger for KeePassXC-Browser skal flyttes ind i databaseindstillingerne.
+Det er nødvendigt for at vedligeholde dine nuværende browserforbindelser.
+Vil du migrere dine eksisterende indstillinger nu?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Vis ikke denne advarsel igen</translation>
</message>
</context>
<context>
@@ -717,15 +872,15 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>Tilføj &apos; - Clone&apos; til titel</translation>
+ <translation>Tilføj &apos; - Klon&apos; til titel</translation>
</message>
<message>
<source>Replace username and password with references</source>
- <translation>Udskift brugernavn og kodeord med referencer</translation>
+ <translation>Udskift brugernavn og adgangskode med referencer</translation>
</message>
<message>
<source>Copy history</source>
- <translation>Kopier historik</translation>
+ <translation>Kopiér historik</translation>
</message>
</context>
<context>
@@ -744,7 +899,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Encoding</source>
- <translation>Encoding</translation>
+ <translation>Kodning</translation>
</message>
<message>
<source>Codec</source>
@@ -752,7 +907,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Text is qualified by</source>
- <translation type="unfinished"/>
+ <translation>Tekst er kvalificeret af</translation>
</message>
<message>
<source>Fields are separated by</source>
@@ -767,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Første optegnelse har feltnavne</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Antallet af header linjer, som skal ignoreres</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Betragt &apos;\&apos; som en escape karakter</translation>
</message>
@@ -792,7 +943,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Original data: </source>
- <translation>Original data:</translation>
+ <translation>Original data: </translation>
</message>
<message>
<source>Error</source>
@@ -800,23 +951,40 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Empty fieldname %1</source>
- <translation type="unfinished"/>
+ <translation>Tomt feltnavn %1</translation>
</message>
<message>
<source>column %1</source>
- <translation type="unfinished"/>
+ <translation>kolonne %1</translation>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation type="unfinished"/>
+ <translation>Fejl registreret i CSV-fil!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>[%n yderligere meddelelse sprunget over]</numerusform><numerusform>[%n yderligere meddelelser sprunget over]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
+ <translation>CSV-import: skriver har fejl:
+%1</translation>
+ </message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
<translation type="unfinished"/>
</message>
</context>
@@ -824,20 +992,20 @@ Would you like to migrate your existing settings now?</source>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n kolonne</numerusform><numerusform>%n kolonner</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
<comment>file info: bytes, rows, columns</comment>
- <translation type="unfinished"/>
+ <translation>%1, %2, %3</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n byte</numerusform><numerusform>%n bytes</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n række</numerusform><numerusform>%n rækker</numerusform></translation>
</message>
</context>
<context>
@@ -849,72 +1017,74 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>File %1 does not exist.</source>
- <translation type="unfinished"/>
+ <translation>Filen %1 findes ikke.</translation>
</message>
<message>
<source>Unable to open file %1.</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke åbne filen %1.</translation>
</message>
<message>
<source>Error while reading the database: %1</source>
+ <translation>Fejl ved læsning af databasen: %1</translation>
+ </message>
+ <message>
+ <source>File cannot be written as it is opened in read-only mode.</source>
+ <translation>Filen kan ikke skrives da den er åbnet i skrivebeskyttet tilstand.</translation>
+ </message>
+ <message>
+ <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <translation>Nøglen blev ikke transformeret. Det er en fejl. Rapportér det venligst til udviklerne!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not save, database has no file name.</source>
+ <source>Could not save, database does not point to a valid file.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File cannot be written as it is opened in read-only mode.</source>
+ <source>Could not save, database file is read-only.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <source>Database file has unmerged changes.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Papirkurv</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
<message>
<source>Unlock Database - KeePassXC</source>
- <translation type="unfinished"/>
+ <translation>Lås op for database - KeePassXC</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Indtast hovednøgle</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Nøglefil:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Kodeord:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Gennemse</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Genopfrisk</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Udfordring Svar</translation>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation>Forældet nøglefilformat</translation>
+ <translation>Udgået nøglefilformat</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation>Du benytter et forældet nøglefilformat, som muligvis ikke vil blive understøttet i fremtiden.
+ <translation>Du bruger et udgået nøglefilformat, som muligvis
+ikke understøttes i fremtiden.
Overvej at generere en ny nøglefil.</translation>
</message>
@@ -935,17 +1105,95 @@ Overvej at generere en ny nøglefil.</translation>
<translation>Vælg nøglefil</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
+ <source>Select slot...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Gennemse ...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Ryd</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -953,14 +1201,14 @@ Overvej at generere en ny nøglefil.</translation>
<name>DatabaseSettingWidgetMetaData</name>
<message>
<source>Passwords</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskoder</translation>
</message>
</context>
<context>
<name>DatabaseSettingsDialog</name>
<message>
<source>Advanced Settings</source>
- <translation type="unfinished"/>
+ <translation>Avancerede indstillinger</translation>
</message>
<message>
<source>General</source>
@@ -972,38 +1220,38 @@ Overvej at generere en ny nøglefil.</translation>
</message>
<message>
<source>Master Key</source>
- <translation type="unfinished"/>
+ <translation>Hovednøgle</translation>
</message>
<message>
<source>Encryption Settings</source>
- <translation type="unfinished"/>
+ <translation>Krypteringsindstillinger</translation>
</message>
<message>
<source>Browser Integration</source>
- <translation>Browser-integration</translation>
+ <translation>Browserintegritet</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidgetBrowser</name>
<message>
<source>KeePassXC-Browser settings</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC-Browserindstillinger</translation>
</message>
<message>
<source>&amp;Disconnect all browsers</source>
- <translation>&amp;Fjern tilslutning til alle browsere</translation>
+ <translation>&amp;Afbryd forbindelse til alle browsere</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>&amp;Glem alle stedspecifikke indstillinger på posterne</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation type="unfinished"/>
+ <translation>Flyt KeePassHTTP-attributter til KeePassXC-Browser &amp;tilpasset data</translation>
</message>
<message>
<source>Stored keys</source>
- <translation type="unfinished"/>
+ <translation>Gemte nøgler</translation>
</message>
<message>
<source>Remove</source>
@@ -1011,12 +1259,13 @@ Overvej at generere en ny nøglefil.</translation>
</message>
<message>
<source>Delete the selected key?</source>
- <translation type="unfinished"/>
+ <translation>Slet den valgte nøgle?</translation>
</message>
<message>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vil du virkelig slette den valgte nøgle?
+Det kan forhindre forbindelse til browserpluginet.</translation>
</message>
<message>
<source>Key</source>
@@ -1028,16 +1277,17 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>Enable Browser Integration to access these settings.</source>
- <translation type="unfinished"/>
+ <translation>Aktivér browserintegritet for at tilgå indstillingerne.</translation>
</message>
<message>
<source>Disconnect all browsers</source>
- <translation type="unfinished"/>
+ <translation>Afbryd forbindelse til alle browsere</translation>
</message>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vil du virkelig afbryde forbindelsen til alle browsere?
+Det kan forhindre forbindelse til browserpluginet.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
@@ -1045,7 +1295,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>Fandt ingen delte krypteringsnøgler i KeePassXC-indstillinger.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
@@ -1053,20 +1303,21 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Det lykkedes at fjerne %n krypteret nøgle fra KeePassXC-indstillingerne.</numerusform><numerusform>Det lykkedes at fjerne %n krypteret nøgler fra KeePassXC-indstillingerne.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Glem alle stedspecifikke indstillinger på posterne</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation type="unfinished"/>
+ <translation>Vil du virkelig glemme alle stedspecifikke indstillinger på hver post?
+Tilladelser til at tilgå poster tilbagekaldes.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
- <translation>Fjerner gemte tilladelser...</translation>
+ <translation>Fjerner gemte tilladelser …</translation>
</message>
<message>
<source>Abort</source>
@@ -1078,23 +1329,32 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Det lykkedes at fjerne tilladelser fra %n post.</numerusform><numerusform>Det lykkedes at fjerne tilladelser fra %n poster.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
- <translation>KeePassXC: Ingen nøgler fundet</translation>
+ <translation>KeePassXC: Ingen nøgler fundet!</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
- <translation>Den aktive database indholder ikke en post med tilladelser</translation>
+ <translation>Den aktive database indholder ikke en post med tilladelser.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation type="unfinished"/>
+ <translation>Flyt KeePassHTTP-attributter til tilpasset data</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
+ <translation>Vil du virkelig flytte alle udgået browerintegrationsdata til den seneste standard?
+Det er nødvendigt for at vedligeholde kompatibilitet med browserpluginet.</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1102,19 +1362,19 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<name>DatabaseSettingsWidgetEncryption</name>
<message>
<source>Encryption Algorithm:</source>
- <translation>Krypteringsalgoritme</translation>
+ <translation>Krypteringsalgoritme:</translation>
</message>
<message>
<source>AES: 256 Bit (default)</source>
- <translation>AES: 256 Bit (standard)</translation>
+ <translation>AES: 256 bit (standard)</translation>
</message>
<message>
<source>Twofish: 256 Bit</source>
- <translation>Twofish: 256 Bit</translation>
+ <translation>Twofish: 256 bit</translation>
</message>
<message>
<source>Key Derivation Function:</source>
- <translation>Nøgleafledningsfunktion</translation>
+ <translation>Nøgleafledningsfunktion:</translation>
</message>
<message>
<source>Transform rounds:</source>
@@ -1122,11 +1382,11 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Benchmark 1-second delay</source>
- <translation>Benchmark 1-sekunds forsinkelse</translation>
+ <translation>Benchmark forsinkelse på 1 sekund</translation>
</message>
<message>
<source>Memory Usage:</source>
- <translation>Hukommelsesforbrug</translation>
+ <translation>Hukommelsesforbrug:</translation>
</message>
<message>
<source>Parallelism:</source>
@@ -1134,48 +1394,48 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Decryption Time:</source>
- <translation type="unfinished"/>
+ <translation>Krypteringstid:</translation>
</message>
<message>
<source>?? s</source>
- <translation type="unfinished"/>
+ <translation>?? s</translation>
</message>
<message>
<source>Change</source>
- <translation type="unfinished"/>
+ <translation>Skift</translation>
</message>
<message>
<source>100 ms</source>
- <translation type="unfinished"/>
+ <translation>100 ms</translation>
</message>
<message>
<source>5 s</source>
- <translation type="unfinished"/>
+ <translation>5 s</translation>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>Højere værdier giver mere beskyttelse, men det vil tage længere at åbne databasen.</translation>
</message>
<message>
<source>Database format:</source>
- <translation type="unfinished"/>
+ <translation>Format på database:</translation>
</message>
<message>
<source>This is only important if you need to use your database with other programs.</source>
- <translation type="unfinished"/>
+ <translation>Det er kun vigtigt hvis du skal bruge din database med andre programmer.</translation>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
- <translation type="unfinished"/>
+ <translation>KDBX 4.0 (anbefales)</translation>
</message>
<message>
<source>KDBX 3.1</source>
- <translation type="unfinished"/>
+ <translation>KDBX 3.1</translation>
</message>
<message>
<source>unchanged</source>
<comment>Database decryption time is unchanged</comment>
- <translation type="unfinished"/>
+ <translation>uændret</translation>
</message>
<message>
<source>Number of rounds too high</source>
@@ -1196,7 +1456,7 @@ Hvis du vil beholde antallet, så kan din database tage timer eller dage (eller
</message>
<message>
<source>Cancel</source>
- <translation>Afbryd</translation>
+ <translation>Annuller</translation>
</message>
<message>
<source>Number of rounds too low</source>
@@ -1222,22 +1482,73 @@ Hvis du beholder dette antal, så kan din database være nem af knække!</transl
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform> tråd</numerusform><numerusform> tråde</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1248,7 +1559,7 @@ Hvis du beholder dette antal, så kan din database være nem af knække!</transl
</message>
<message>
<source>Database name:</source>
- <translation>Databasenavn:</translation>
+ <translation>Navn på database:</translation>
</message>
<message>
<source>Database description:</source>
@@ -1272,7 +1583,7 @@ Hvis du beholder dette antal, så kan din database være nem af knække!</transl
</message>
<message>
<source> MiB</source>
- <translation>MB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1280,68 +1591,103 @@ Hvis du beholder dette antal, så kan din database være nem af knække!</transl
</message>
<message>
<source>Additional Database Settings</source>
- <translation>Flere database-indstillinger</translation>
+ <translation>Yderligere databaseindstillinger</translation>
</message>
<message>
<source>Enable &amp;compression (recommended)</source>
- <translation>Slå &amp;compression til (anbefalet)</translation>
+ <translation>Aktivér &amp;komprimering (anbefales)</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
<message>
<source>Sharing</source>
- <translation type="unfinished"/>
+ <translation>Deling</translation>
</message>
<message>
<source>Breadcrumb</source>
- <translation type="unfinished"/>
+ <translation>Brødkrumme</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished"/>
+ <translation>Type</translation>
</message>
<message>
<source>Path</source>
- <translation type="unfinished"/>
+ <translation>Sti</translation>
</message>
<message>
<source>Last Signer</source>
- <translation type="unfinished"/>
+ <translation>Sidste underskriver</translation>
</message>
<message>
<source>Certificates</source>
- <translation type="unfinished"/>
+ <translation>Certifikater</translation>
</message>
<message>
<source> &gt; </source>
<comment>Breadcrumb separator</comment>
- <translation type="unfinished"/>
+ <translation> &gt; </translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidgetMasterKey</name>
<message>
<source>Add additional protection...</source>
- <translation type="unfinished"/>
+ <translation>Tilføj yderligere beskyttelse ...</translation>
</message>
<message>
<source>No encryption key added</source>
- <translation type="unfinished"/>
+ <translation>Ingen krypteringsnøgle tilføjet</translation>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation type="unfinished"/>
+ <translation>Du skal tilføje mindst en krypteringsnøgle for at sikre din database!</translation>
</message>
<message>
<source>No password set</source>
- <translation type="unfinished"/>
+ <translation>Ingen adgangskode indstillet</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation type="unfinished"/>
+ <translation>ADVARSEL! Du har ikke indstillet en adgangskode. Det frarådes kraftigt at bruge en database uden en adgangskode!
+
+Er du sikker på, du vil fortsætte uden en adgangskode?</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1349,6 +1695,10 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Failed to change master key</source>
+ <translation>Kunne ikke skifte hovednøgle</translation>
+ </message>
+ <message>
+ <source>Continue without password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1356,10 +1706,133 @@ Are you sure you want to continue without a password?</source>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
<message>
<source>Database Name:</source>
- <translation type="unfinished"/>
+ <translation>Navn på database:</translation>
</message>
<message>
<source>Description:</source>
+ <translation>Beskrivelse:</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Navn</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Værdi</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1367,7 +1840,7 @@ Are you sure you want to continue without a password?</source>
<name>DatabaseTabWidget</name>
<message>
<source>KeePass 2 Database</source>
- <translation>KeePass 2 Database</translation>
+ <translation>KeePass 2-database</translation>
</message>
<message>
<source>All files</source>
@@ -1375,7 +1848,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Open database</source>
- <translation>Åben database</translation>
+ <translation>Åbn database</translation>
</message>
<message>
<source>CSV file</source>
@@ -1383,58 +1856,79 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Merge database</source>
- <translation>Flet database</translation>
+ <translation>Sammenlæg database</translation>
</message>
<message>
<source>Open KeePass 1 database</source>
- <translation>Åben KeePass 1 database</translation>
+ <translation>Åbn KeePass 1-database</translation>
</message>
<message>
<source>KeePass 1 database</source>
- <translation>KeePass 1 database</translation>
+ <translation>KeePass 1-database</translation>
</message>
<message>
<source>Export database to CSV file</source>
- <translation>Eksportér databasen til CSV-fil</translation>
+ <translation>Eksportér database til CSV-fil</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
- <translation>Kan ikke skrive til CSV-fil.</translation>
+ <translation>Skrivning af CSV-fil mislykkedes.</translation>
</message>
<message>
<source>Database creation error</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved oprettelse af database</translation>
</message>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
+ <translation>Den oprettede database har ingen nøgle eller KDF. Nægter at gemme den.
+Det er helt sikkert en fejl. Rapportér det venligst til udviklerne.</translation>
</message>
<message>
<source>Select CSV file</source>
- <translation type="unfinished"/>
+ <translation>Vælg CSV-fil</translation>
</message>
<message>
<source>New Database</source>
- <translation type="unfinished"/>
+ <translation>Ny database</translation>
</message>
<message>
<source>%1 [New Database]</source>
<comment>Database tab name modifier</comment>
- <translation type="unfinished"/>
+ <translation>%1 [Ny database]</translation>
</message>
<message>
<source>%1 [Locked]</source>
<comment>Database tab name modifier</comment>
- <translation type="unfinished"/>
+ <translation>%1 [Låst]</translation>
</message>
<message>
<source>%1 [Read-only]</source>
<comment>Database tab name modifier</comment>
+ <translation>%1 [Skrivebeskyttet]</translation>
+ </message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1442,7 +1936,7 @@ This is definitely a bug, please report it to the developers.</source>
<name>DatabaseWidget</name>
<message>
<source>Searching...</source>
- <translation>Søger...</translation>
+ <translation>Søger ...</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
@@ -1450,11 +1944,11 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
- <translation>Ønsker du virkelig at rykke post &quot;%1&quot; til skraldespanden?</translation>
+ <translation>Vil du virkelig flytte posten &quot;%1&quot; til papirkurven?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Vil du virkelig flytte %n post til papirkurven?</numerusform><numerusform>Vil du virkelig flytte %n poster til papirkurven?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1462,7 +1956,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to execute the following command?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</source>
- <translation>Er du sikker på at du vil udføre følgende kommando? &lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
+ <translation>Er du sikker på, at du vil udføre følgende kommando?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
</message>
<message>
<source>Remember my choice</source>
@@ -1470,11 +1964,11 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation>Ønsker du at slette gruppen &quot;%1&quot; permanent?</translation>
+ <translation>Vil du slette gruppen &quot;%1&quot; permanent?</translation>
</message>
<message>
<source>No current database.</source>
- <translation>Ingen database valgt</translation>
+ <translation>Ingen database valgt.</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
@@ -1494,59 +1988,57 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>The database file has changed. Do you want to load the changes?</source>
- <translation>Database-filen har ændret sig. Er du sikker på at du vil indlæse ændringerne? </translation>
+ <translation>Databasefilen har ændret sig. Er du sikker på, at du vil indlæse ændringerne?</translation>
</message>
<message>
<source>Merge Request</source>
- <translation>Fletteanmodning</translation>
+ <translation>Sammenlægningsanmodning</translation>
</message>
<message>
<source>The database file has changed and you have unsaved changes.
Do you want to merge your changes?</source>
- <translation>Database-filen har ændringer og du har ændringer som du ikke har gemt. Vil du kombinere dine ændringer med databasens? </translation>
+ <translation>Databasefilen har ændringer og du har ændringer som du ikke har gemt.
+Vil du sammenlægge dine ændringer med databasens?</translation>
</message>
<message>
<source>Empty recycle bin?</source>
- <translation>Tøm skraldespanden? </translation>
+ <translation>Tøm papirkurven?</translation>
</message>
<message>
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
- <translation>Er du sikker på at du vil permanent slette alt fra din skraldespand? </translation>
+ <translation>Er du sikker på, at du vil slette alt fra din papirkurv permanent?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Vil du virkelig slette %n post permanent?</numerusform><numerusform>Vil du virkelig slette %n poster permanent?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Slet post?</numerusform><numerusform>Slet poster?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Fil åbnet i skrivebeskyttet tilstand</translation>
+ <translation><numerusform>Flyt post til papirkurven?</numerusform><numerusform>Flyt poster til papirkurven?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
- <translation type="unfinished"/>
+ <translation>Lås database?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>Du er ved at redigere en post. Forkast ændringerne og lås alligevel?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation>&quot;%1&quot; blev ændret.
-Gem disse ændringer?</translation>
+Gem ændringerne?</translation>
</message>
<message>
<source>Database was modified.
Save changes?</source>
- <translation type="unfinished"/>
+ <translation>Databasen blev ændret.
+Gem ændringerne?</translation>
</message>
<message>
<source>Save changes?</source>
@@ -1555,7 +2047,8 @@ Save changes?</source>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke åbne den nye databasefil ved forsøg på automatisk genindlæsning.
+Fejl: %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
@@ -1568,13 +2061,8 @@ Disable safe saves and try again?</source>
Så sikre gem fra og prøv igen?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Passwords</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskoder</translation>
</message>
<message>
<source>Save database as</source>
@@ -1582,15 +2070,15 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>KeePass 2 Database</source>
- <translation>KeePass 2 Database</translation>
+ <translation>KeePass 2-database</translation>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>Erstat referencer til post?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Posten &quot;%1&quot; har %2 reference. Vil du overskrive referencerne med værdier, springe over posten eller slette alligevel?</numerusform><numerusform>Posten &quot;%1&quot; har %2 referencer. Vil du overskrive referencerne med værdier, springe over posten eller slette alligevel?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1598,22 +2086,30 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Flyt gruppe til papirkurv?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Vil du virkelig flytte gruppen &quot;%1&quot; til papirkurven?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation type="unfinished"/>
+ <translation>Sammenlægning af databasefiler lykkedes.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation type="unfinished"/>
+ <translation>Databasen blev ikke ændret af sammenlægningshandlingen.</translation>
</message>
<message>
<source>Shared group...</source>
+ <translation>Delt gruppe ...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Skrivning af databasen mislykkedes: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1633,7 +2129,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-Indsæt</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>Properties</source>
@@ -1645,11 +2141,11 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>SSH Agent</source>
- <translation>SSH Agent</translation>
+ <translation>SSH-agent</translation>
</message>
<message>
<source>n/a</source>
- <translation>Ikke aktuel</translation>
+ <translation>-</translation>
</message>
<message>
<source>(encrypted)</source>
@@ -1681,7 +2177,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
- <translation>Andre kodeord leveret.</translation>
+ <translation>Andre adgangskoder leveret.</translation>
</message>
<message>
<source>New attribute</source>
@@ -1689,7 +2185,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>Er du sikker på at du vil fjerne denne attribut? </translation>
+ <translation>Er du sikker på, at du vil fjerne denne attribut?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1697,19 +2193,19 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n uge</numerusform><numerusform>%n uger</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n måned</numerusform><numerusform>%n måneder</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
- <translation>Anvend genereret kodeord?</translation>
+ <translation>Anvend genereret adgangskode?</translation>
</message>
<message>
<source>Do you want to apply the generated password to this entry?</source>
- <translation>Vil du bruge det genererede kodeord i denne post?</translation>
+ <translation>Vil du bruge den genererede adgangskode i denne post?</translation>
</message>
<message>
<source>Entry updated successfully.</source>
@@ -1717,22 +2213,34 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Entry has unsaved changes</source>
- <translation type="unfinished"/>
+ <translation>Posten har ændringer som ikke er blevet gemt</translation>
</message>
<message>
<source>New attribute %1</source>
- <translation type="unfinished"/>
+ <translation>Ny attribut %1</translation>
</message>
<message>
<source>[PROTECTED] Press reveal to view or edit</source>
- <translation type="unfinished"/>
+ <translation>[BESKYTTET] Tryk på vis for at vise eller redigere</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n år</numerusform><numerusform>%n år</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
+ <translation>Bekræft fjernelse</translation>
+ </message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Browserintegritet</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1774,24 +2282,60 @@ Så sikre gem fra og prøv igen?</translation>
<source>Background Color:</source>
<translation>Baggrundsfarve:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
- <translation>Aktivér Auto-Indsæt for denne post</translation>
+ <translation>Aktivér autoskriv for denne post</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation>Arv standard Auto-Indsæt sekvens fra gruppen</translation>
+ <translation>Nedarv standard autoskriv-sekvens fra &amp;gruppen</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
- <translation>Brug brugerdefineret Auto-Indsæt sekvens:</translation>
+ <translation>&amp;Brug tilpasset autoskriv-sekvens:</translation>
</message>
<message>
<source>Window Associations</source>
- <translation>Vindue-associationer</translation>
+ <translation>Vinduesassocieringer</translation>
</message>
<message>
<source>+</source>
@@ -1809,6 +2353,77 @@ Så sikre gem fra og prøv igen?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Brug en specifik sekvens for denne associering:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generelt</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Tilføj</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Fjern</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Rediger</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1828,6 +2443,26 @@ Så sikre gem fra og prøv igen?</translation>
<source>Delete all</source>
<translation>Slet alle</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1837,7 +2472,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Password:</source>
- <translation>Kodeord:</translation>
+ <translation>Adgangskode:</translation>
</message>
<message>
<source>Repeat:</source>
@@ -1849,15 +2484,15 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Notes</source>
- <translation>Noter</translation>
+ <translation>Bemærkninger</translation>
</message>
<message>
<source>Presets</source>
- <translation>Predefinerede</translation>
+ <translation>Forudindstillinger</translation>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation>Klik på afkrydsningsfeltet for at vise notes-sektionen.</translation>
+ <translation>Klik på afkrydsningsfeltet for at vise bemærkninger-afsnittet.</translation>
</message>
<message>
<source>Username:</source>
@@ -1867,6 +2502,62 @@ Så sikre gem fra og prøv igen?</translation>
<source>Expires</source>
<translation>Udløber</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1880,7 +2571,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source> seconds</source>
- <translation>sekunder</translation>
+ <translation> sekunder</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -1888,7 +2579,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
- <translation>Fjern nøglen fra agenten når databasen er lukket/låst</translation>
+ <translation>Fjern nøglen fra agenten når databasen lukkes/låses</translation>
</message>
<message>
<source>Public key</source>
@@ -1896,7 +2587,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation>Tilføj nøglen til agenten når databasen er åben/låst op</translation>
+ <translation>Tilføj nøglen til agenten når databasen åbnes/låses op</translation>
</message>
<message>
<source>Comment</source>
@@ -1908,11 +2599,11 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>n/a</source>
- <translation>Ikke aktuel</translation>
+ <translation>-</translation>
</message>
<message>
<source>Copy to clipboard</source>
- <translation>Kopier til udklipsholder</translation>
+ <translation>Kopiér til udklipsholder</translation>
</message>
<message>
<source>Private key</source>
@@ -1925,7 +2616,7 @@ Så sikre gem fra og prøv igen?</translation>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Gennemse...</translation>
+ <translation>Gennemse ...</translation>
</message>
<message>
<source>Attachment</source>
@@ -1943,6 +2634,22 @@ Så sikre gem fra og prøv igen?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Kræv brugerbekræftigelse når denne nøgle bruges</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1968,7 +2675,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Enable</source>
- <translation>Aktiver</translation>
+ <translation>Aktivér</translation>
</message>
<message>
<source>Disable</source>
@@ -1976,7 +2683,11 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
- <translation>Arv fra forældregruppe (%1)</translation>
+ <translation>Nedarv fra forældregruppe (%1)</translation>
+ </message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Posten har ændringer som ikke er blevet gemt</translation>
</message>
</context>
<context>
@@ -1987,86 +2698,116 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Type:</source>
- <translation type="unfinished"/>
+ <translation>Type:</translation>
</message>
<message>
<source>Path:</source>
- <translation type="unfinished"/>
+ <translation>Sti:</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"/>
+ <translation> ...</translation>
</message>
<message>
<source>Password:</source>
- <translation>Kodeord:</translation>
+ <translation>Adgangskode:</translation>
</message>
<message>
<source>Inactive</source>
- <translation type="unfinished"/>
+ <translation>Inaktiv</translation>
</message>
<message>
- <source>Import from path</source>
- <translation type="unfinished"/>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare-beholder som ikke er underskrevet</translation>
</message>
<message>
- <source>Export to path</source>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare-beholder som er underskrevet</translation>
+ </message>
+ <message>
+ <source>Select import source</source>
+ <translation>Vælg importkilde</translation>
+ </message>
+ <message>
+ <source>Select export target</source>
+ <translation>Vælg eksportmål</translation>
+ </message>
+ <message>
+ <source>Select import/export file</source>
+ <translation>Vælg import-/eksportfil</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Ryd</translation>
+ </message>
+ <message>
+ <source>Import</source>
+ <translation>Importér</translation>
+ </message>
+ <message>
+ <source>Export</source>
+ <translation>Eksportér</translation>
+ </message>
+ <message>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
+ <source>%1 is already being imported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
+ <source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database import is disabled</source>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>Database export is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
+ <source>Sharing mode field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
+ <source>Path to share file field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
+ <source>Browser for share file</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Ryd</translation>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2078,7 +2819,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Notes</source>
- <translation>Noter</translation>
+ <translation>Bemærkninger</translation>
</message>
<message>
<source>Expires</source>
@@ -2090,34 +2831,62 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-Indsæt</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
- <translation>&amp;Brug standard Auto-Indsæt sekvens fra forældregruppe</translation>
+ <translation>&amp;Brug standard autoskriv-sekvens fra forældregruppe</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
- <translation>Definér standard Auto-Indsæt sekvens</translation>
+ <translation>Definér standard autoskriv-sekvens</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
<message>
<source>&amp;Use default icon</source>
- <translation>&amp;Brug standard-ikon</translation>
+ <translation>&amp;Brug standardikon</translation>
</message>
<message>
<source>Use custo&amp;m icon</source>
- <translation>Brug brugerbestemt ikon</translation>
+ <translation>Brug &amp;tilpasset ikon</translation>
</message>
<message>
<source>Add custom icon</source>
- <translation>Tilføj brugerbestemt ikon</translation>
+ <translation>Tilføj tilpasset ikon</translation>
</message>
<message>
<source>Delete custom icon</source>
- <translation>Slet brugerbestemt ikon</translation>
+ <translation>Slet tilpasset ikon</translation>
</message>
<message>
<source>Download favicon</source>
@@ -2136,44 +2905,68 @@ Så sikre gem fra og prøv igen?</translation>
<translation>Alle filer</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Brugervalgt ikon findes allerede</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Bekræft sletning</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
- <translation type="unfinished"/>
+ <translation>Vælg billede(r)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Det lykkedes at indlæse %1 af %n ikon</numerusform><numerusform>Det lykkedes at indlæse %1 af %n ikoner</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation type="unfinished"/>
+ <translation>Ingen ikoner blev indlæst</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n ikon findes allerede i databasen</numerusform><numerusform>%n ikoner findes allerede i databasen</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Følgende ikon mislykkedes:</numerusform><numerusform>Følgende ikoner mislykkedes:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Ikonet bruges af %n post og erstattes med standardikonet. Er du sikker på, at du vil slette det?</numerusform><numerusform>Ikonet bruges af %n poster og erstattes med standardikonet. Er du sikker på, at du vil slette det?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2196,7 +2989,7 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Plugin Data</source>
- <translation>Plugin data</translation>
+ <translation>Plugindata</translation>
</message>
<message>
<source>Remove</source>
@@ -2204,13 +2997,13 @@ Så sikre gem fra og prøv igen?</translation>
</message>
<message>
<source>Delete plugin data?</source>
- <translation>Slet plugin data?</translation>
+ <translation>Slet plugindata?</translation>
</message>
<message>
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
- <translation>Er du sikker på at du vil slette den valgte plugin data?
-Dette kan få det påvirkede plugin til at svigte.</translation>
+ <translation>Vil du virkelig slette den valgte plugindata?
+Det kan få de påvirkede plugins til at svigte.</translation>
</message>
<message>
<source>Key</source>
@@ -2220,12 +3013,36 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
<source>Value</source>
<translation>Værdi</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
<message>
<source>%1 - Clone</source>
- <translation type="unfinished"/>
+ <translation>%1 - Klon</translation>
</message>
</context>
<context>
@@ -2255,7 +3072,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Open</source>
- <translation>Åben</translation>
+ <translation>Åbn</translation>
</message>
<message>
<source>Save</source>
@@ -2267,7 +3084,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Er du sikker på, at du vil fjerne %n vedhæftning?</numerusform><numerusform>Er du sikker på, at du vil fjerne %n vedhæftninger?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2281,11 +3098,11 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation>Er du sikker på at du vil overskrive den eksisterende fil &quot;%1&quot; med denne vedhæftning?</translation>
+ <translation>Er du sikker på, at du vil overskrive den eksisterende fil &quot;%1&quot; med denne vedhæftning?</translation>
</message>
<message>
<source>Confirm overwrite</source>
- <translation>Bekræft overskrivningn</translation>
+ <translation>Bekræft overskrivning</translation>
</message>
<message>
<source>Unable to save attachments:
@@ -2307,12 +3124,34 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Confirm remove</source>
- <translation type="unfinished"/>
+ <translation>Bekræft fjernelse</translation>
</message>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Kan ikke åbne filen:
+%1</numerusform><numerusform>Kan ikke åbne filerne:
+%1</numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>Vedhæftninger</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2346,7 +3185,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
<message>
<source>Ref: </source>
<comment>Reference abbreviation</comment>
- <translation>Ref:</translation>
+ <translation>Ref: </translation>
</message>
<message>
<source>Group</source>
@@ -2370,11 +3209,11 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Password</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskode</translation>
</message>
<message>
<source>Notes</source>
- <translation>Noter</translation>
+ <translation>Bemærkninger</translation>
</message>
<message>
<source>Expires</source>
@@ -2398,20 +3237,16 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Yes</source>
- <translation type="unfinished"/>
+ <translation>Ja</translation>
</message>
<message>
<source>TOTP</source>
- <translation type="unfinished"/>
+ <translation>TOTP</translation>
</message>
</context>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generér TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>Luk</translation>
</message>
@@ -2425,7 +3260,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Password</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskode</translation>
</message>
<message>
<source>Expiration</source>
@@ -2445,11 +3280,11 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Notes</source>
- <translation>Noter</translation>
+ <translation>Bemærkninger</translation>
</message>
<message>
<source>Autotype</source>
- <translation>Auto-Indsæt</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>Window</source>
@@ -2461,7 +3296,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Searching</source>
- <translation>Søger</translation>
+ <translation>Søgning</translation>
</message>
<message>
<source>Search</source>
@@ -2482,7 +3317,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
- <translation type="unfinished"/>
+ <translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message>
<source>Enabled</source>
@@ -2494,8 +3329,16 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Share</source>
+ <translation>Del</translation>
+ </message>
+ <message>
+ <source>Display current TOTP value</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avanceret</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2509,7 +3352,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Hide Passwords</source>
- <translation>Skjul kodeord</translation>
+ <translation>Skjul adgangskoder</translation>
</message>
<message>
<source>Fit to window</source>
@@ -2521,7 +3364,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Reset to defaults</source>
- <translation>Nulstil til standard-indstillinger</translation>
+ <translation>Nulstil til standardindstillinger</translation>
</message>
<message>
<source>Attachments (icon)</source>
@@ -2529,15 +3372,37 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Skraldespand</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
- <translation type="unfinished"/>
+ <translation>[tom]</translation>
</message>
</context>
<context>
@@ -2548,7 +3413,59 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
- <translation>Kan ikke gemme besked-script filen!</translation>
+ <translation>Kan ikke gemme besked-script filen.</translation>
+ </message>
+</context>
+<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuller</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Luk</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2570,38 +3487,39 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>Kunne ikke udstede udfordring-svar.</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Forkert nøgle eller databasefil er korrupt.</translation>
+ <translation>Kunne ikke udstede udfordring/svar.</translation>
</message>
<message>
<source>missing database headers</source>
- <translation>Database headers mangler</translation>
+ <translation>mangler databaseheadere</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation type="unfinished"/>
+ <translation>Headeren matcher ikke hashen</translation>
</message>
<message>
<source>Invalid header id size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Ugyldig størrelse på gruppefelt</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation>Invalid størrelse i headerfelt</translation>
+ <translation>Ugyldig længde på headerfelt</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>Invalid størrelse i headerfelt</translation>
+ <translation>Ugyldig længde på headerdata</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>Kdbx3Writer</name>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>Kunne ikke udstede udfordring-svar.</translation>
+ <translation>Kunne ikke udstede udfordring/svar.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2612,7 +3530,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
<name>Kdbx4Reader</name>
<message>
<source>missing database headers</source>
- <translation>Database headers mangler</translation>
+ <translation>mangler databaseheadere</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2620,15 +3538,11 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Invalid header checksum size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Ugyldig størrelse på gruppefelt</translation>
</message>
<message>
<source>Header SHA256 mismatch</source>
- <translation>Header SHA256 stemmer ikke</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Forkert nøgle eller database-filen er korrupt. (HMAC mismatch)</translation>
+ <translation>Uoverensstemmelse i header SHA256</translation>
</message>
<message>
<source>Unknown cipher</source>
@@ -2636,15 +3550,15 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Invalid header id size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Ugyldig størrelse på gruppefelt</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation>Invalid størrelse i headerfelt</translation>
+ <translation>Ugyldig længde på headerfelt</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>Invalid størrelse i headerfelt</translation>
+ <translation>Ugyldig længde på headerdata</translation>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
@@ -2652,7 +3566,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
- <translation>Ikke understøtet nøgleafledningsfunktion (KDF) eller invalide parametre</translation>
+ <translation>Ikke understøttet nøgleafledningsfunktion (KDF) eller ugyldige parametre</translation>
</message>
<message>
<source>Legacy header fields found in KDBX4 file.</source>
@@ -2660,74 +3574,83 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Invalid inner header id size</source>
- <translation>Invalid størrelse i indre headerfelt id</translation>
+ <translation>Ugyldig størrelse på indre headerfelt-id</translation>
</message>
<message>
<source>Invalid inner header field length</source>
- <translation>Invalid størrelse i headerfelt</translation>
+ <translation>Ugyldig længde på indre headerfelt</translation>
</message>
<message>
<source>Invalid inner header binary size</source>
- <translation>Invalid størrelse i binær indre header</translation>
+ <translation>Ugyldig størrelse på binær indre header</translation>
</message>
<message>
<source>Unsupported KeePass variant map version.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Ikke understøttet KeePass variant version</translation>
+ <translation>Ikke understøttet KeePass variant version.</translation>
</message>
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på navn for variantkortets post</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig data på navn for variantkortets post</translation>
</message>
<message>
<source>Invalid variant map entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på værdi for variantkortets post</translation>
</message>
<message>
<source>Invalid variant map entry value data</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig data på værdi for variantkortets post</translation>
</message>
<message>
<source>Invalid variant map Bool entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på værdi for variantkortets Bool-post</translation>
</message>
<message>
<source>Invalid variant map Int32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på værdi for variantkortets Int32-post</translation>
</message>
<message>
<source>Invalid variant map UInt32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på værdi for variantkortets UInt32-post</translation>
</message>
<message>
<source>Invalid variant map Int64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på værdi for variantkortets Int64-post</translation>
</message>
<message>
<source>Invalid variant map UInt64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på værdi for variantkortets UInt64-post</translation>
</message>
<message>
<source>Invalid variant map entry type</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Ugyldig type på post for variantkort</translation>
</message>
<message>
<source>Invalid variant map field type size</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
+ <translation>Ugyldig størrelse på felttype for variantkort</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2735,12 +3658,12 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
<name>Kdbx4Writer</name>
<message>
<source>Invalid symmetric cipher algorithm.</source>
- <translation>Invalid symmetrisk ciffer algoritme</translation>
+ <translation>Ugyldig symmetrisk ciffer-algoritme.</translation>
</message>
<message>
<source>Invalid symmetric cipher IV size.</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation>Invalid størrelse for IV for symmetrisk ciffer</translation>
+ <translation>Ugyldig størrelse på IV for symmetrisk ciffer.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2749,7 +3672,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Kunne ikke serielisere KDF-parameternes variantkort</translation>
</message>
</context>
<context>
@@ -2760,7 +3683,7 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Invalid compression flags length</source>
- <translation>Invalid længde af komprimeringsflag</translation>
+ <translation>Ugyldig længde på komprimeringsflag</translation>
</message>
<message>
<source>Unsupported compression algorithm</source>
@@ -2768,57 +3691,57 @@ Dette kan få det påvirkede plugin til at svigte.</translation>
</message>
<message>
<source>Invalid master seed size</source>
- <translation>Invalid størrelse for master seed</translation>
+ <translation>Ugyldig størrelse på hovedfrø</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Invalid størrelse for transformerings-seed</translation>
+ <translation>Ugyldig størrelse på transformeringsfrø</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
- <translation>Invalidt antal af transformeringsrunder</translation>
+ <translation>Ugyldig antal af transformeringsrunder</translation>
</message>
<message>
<source>Invalid start bytes size</source>
- <translation>Invalid størrelse af start bytes</translation>
+ <translation>Ugyldig størrelse på start bytes</translation>
</message>
<message>
<source>Invalid random stream id size</source>
- <translation>Invalid størrelse af tilfældigt strøm id</translation>
+ <translation>Ugyldig størrelse på tilfældigt strøm id</translation>
</message>
<message>
<source>Invalid inner random stream cipher</source>
- <translation>Invalid ciffer for indre tilfældig strøm</translation>
+ <translation>Ugyldig ciffer for indre tilfældig strøm</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Dette er ikke en KeePass database.</translation>
+ <translation>Dette er ikke en KeePass-database.</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).
+ <translation>Den valgte fil er en gammel KeePass 1-databasefil (.kdb).
-Du kan importere den ved at klikke på Database &gt; &apos;Importér KeePass 1 database...&apos;.
+Du kan importere den ved at klikke på 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>
<message>
<source>Unsupported KeePass 2 database version.</source>
- <translation>Ikke understøttet KeePass 2 database version.</translation>
+ <translation>Ikke understøttet KeePass 2-database version.</translation>
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
- <translation type="unfinished"/>
+ <translation>Ugyldig længde på cifferets uuid: %1 (længde=%2)</translation>
</message>
<message>
<source>Unable to parse UUID: %1</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke fortolke uuid: %1</translation>
</message>
<message>
<source>Failed to read database file.</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke læse databasefil.</translation>
</message>
</context>
<context>
@@ -2833,11 +3756,11 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>Mangler icon uuid eller data</translation>
+ <translation>Mangler ikon-uuid eller -data</translation>
</message>
<message>
<source>Missing custom data key or value</source>
- <translation>Mangler brugervalgt data-nøgle eller -værdi</translation>
+ <translation>Mangler tilpasset datanøgle eller -værdi</translation>
</message>
<message>
<source>Multiple group elements</source>
@@ -2845,19 +3768,19 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
</message>
<message>
<source>Null group uuid</source>
- <translation>Tomt gruppe-uuid</translation>
+ <translation>Nul gruppe-uuid</translation>
</message>
<message>
<source>Invalid group icon number</source>
- <translation>Invalidt gruppeikonsnummer</translation>
+ <translation>Ugyldig gruppeikon-nummer</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
- <translation>Invalid Slå-Auto-Indsæt-Til værdi</translation>
+ <translation>Ugyldig EnableAutoType-værdi</translation>
</message>
<message>
<source>Invalid EnableSearching value</source>
- <translation>Invalid værdi for Slå-Søgning-Til</translation>
+ <translation>Ugyldig EnableSearching-værdi</translation>
</message>
<message>
<source>No group uuid found</source>
@@ -2865,19 +3788,19 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>Tomt Slet-Objekt uuid</translation>
+ <translation>Nul DeleteObject-uuid</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
- <translation>Mangler Slet-Objekt uuid eller tid</translation>
+ <translation>Mangler DeletedObject-uuid eller klokkeslæt</translation>
</message>
<message>
<source>Null entry uuid</source>
- <translation>Tomt post-uuid</translation>
+ <translation>Nul post-uuid</translation>
</message>
<message>
<source>Invalid entry icon number</source>
- <translation>Invalidt gruppeikonsnummer</translation>
+ <translation>Ugyldig postikon-nummer</translation>
</message>
<message>
<source>History element in history entry</source>
@@ -2893,7 +3816,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
</message>
<message>
<source>Duplicate custom attribute found</source>
- <translation>Fandt ens brugerdefineret attribut</translation>
+ <translation>Fandt ens tilpasset attribut</translation>
</message>
<message>
<source>Entry string key or value missing</source>
@@ -2909,31 +3832,31 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
</message>
<message>
<source>Auto-type association window or sequence missing</source>
- <translation>Auto-Indsæt associerings-vindue eller -sekvens mangler</translation>
+ <translation>Autoskriv associeringsvindue eller -sekvens mangler</translation>
</message>
<message>
<source>Invalid bool value</source>
- <translation>Invalid boolsk værdi</translation>
+ <translation>Ugyldig boolesk-værdi</translation>
</message>
<message>
<source>Invalid date time value</source>
- <translation>Invalid dato tid værdi</translation>
+ <translation>Ugyldig dato klokkeslæt-værdi</translation>
</message>
<message>
<source>Invalid color value</source>
- <translation>Invalid farveværdi</translation>
+ <translation>Ugyldig farve-værdi</translation>
</message>
<message>
<source>Invalid color rgb part</source>
- <translation>Invalid farve RGB del</translation>
+ <translation>Ugyldig farve RGB-del</translation>
</message>
<message>
<source>Invalid number value</source>
- <translation>Invalid tal-værdi</translation>
+ <translation>Ugyldig nummer-værdi</translation>
</message>
<message>
<source>Invalid uuid value</source>
- <translation>Invalid uuid værdi</translation>
+ <translation>Ugyldig uuid-værdi</translation>
</message>
<message>
<source>Unable to decompress binary</source>
@@ -2944,19 +3867,21 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
<source>XML error:
%1
Line %2, column %3</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved XML:
+%1
+Linje %2, kolonne %3</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importér KeePass1 database</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Kan ikke åbne databasen.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -2966,15 +3891,15 @@ Line %2, column %3</source>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Dette er ikke en KeePass database.</translation>
+ <translation>Dette er ikke en KeePass-database.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
- <translation>Ikke understøttet krypteringsalgoritme</translation>
+ <translation>Ikke understøttet krypteringsalgoritme.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
- <translation>KeePass database version ikke understøttet.</translation>
+ <translation>KeePass-databaseversion ikke understøttet.</translation>
</message>
<message>
<source>Unable to read encryption IV</source>
@@ -2983,23 +3908,23 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid number of groups</source>
- <translation>Invalidt antal grupper</translation>
+ <translation>Ugyldig antal grupper</translation>
</message>
<message>
<source>Invalid number of entries</source>
- <translation>Invalidt antal poster</translation>
+ <translation>Ugyldig antal poster</translation>
</message>
<message>
<source>Invalid content hash size</source>
- <translation>Invalid størrelse for indholds-hash</translation>
+ <translation>Ugyldig størrelse på indholdshash</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Invalid størrelse for transformerings-seed</translation>
+ <translation>Ugyldig størrelse på transformeringsfrø</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation>Invalidt antal transformationsfunder</translation>
+ <translation>Ugyldig antal runder for transformation</translation>
</message>
<message>
<source>Unable to construct group tree</source>
@@ -3014,56 +3939,52 @@ Line %2, column %3</source>
<translation>Kan ikke beregne hovednøgle</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Forkert nøgle eller databasefil er korrupt.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
- <translation>Nøgletransformering fejlede</translation>
+ <translation>Nøgletransformering mislykkedes</translation>
</message>
<message>
<source>Invalid group field type number</source>
- <translation>Invalidt gruppefeltstypenummer</translation>
+ <translation>Ugyldig gruppefeltstype-nummer</translation>
</message>
<message>
<source>Invalid group field size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Ugyldig størrelse på gruppefelt</translation>
</message>
<message>
<source>Read group field data doesn&apos;t match size</source>
- <translation>Læsegruppefelt data har ikke samme størrelse</translation>
+ <translation>Læsegruppefeltsdata har ikke samme størrelse</translation>
</message>
<message>
<source>Incorrect group id field size</source>
- <translation>Forkert størrelse af gruppe id felt</translation>
+ <translation>Forkert størrelse på gruppe id felt</translation>
</message>
<message>
<source>Incorrect group creation time field size</source>
- <translation>Forkert størrelse for gruppeoprettelsestidsfelt</translation>
+ <translation>Forkert størrelse på gruppeoprettelsestidsfelt</translation>
</message>
<message>
<source>Incorrect group modification time field size</source>
- <translation>Forkert størrelse for gruppemodifikationstidsfelt</translation>
+ <translation>Forkert størrelse på gruppemodifikationstidsfelt</translation>
</message>
<message>
<source>Incorrect group access time field size</source>
- <translation>Forkert størrelse for gruppetilgåelsestidsfelt</translation>
+ <translation>Forkert størrelse på gruppetilgåelsestidsfelt</translation>
</message>
<message>
<source>Incorrect group expiry time field size</source>
- <translation>Forkert størrelse for gruppeudløbstidsfelt</translation>
+ <translation>Forkert størrelse på gruppeudløbstidsfelt</translation>
</message>
<message>
<source>Incorrect group icon field size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Forkert størrelse på gruppefelt</translation>
</message>
<message>
<source>Incorrect group level field size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Forkert størrelse på gruppefelt</translation>
</message>
<message>
<source>Invalid group field type</source>
- <translation>Invalid type for gruppefelt</translation>
+ <translation>Ugyldig gruppefeltstype</translation>
</message>
<message>
<source>Missing group id or level</source>
@@ -3075,7 +3996,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid entry field size</source>
- <translation>Invalid størrelse for gruppefelt</translation>
+ <translation>Ugyldig størrelse på gruppefelt</translation>
</message>
<message>
<source>Read entry field data doesn&apos;t match size</source>
@@ -3083,69 +4004,86 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation>Invalid uuid værdi</translation>
+ <translation>Ugyldig uuid-værdi</translation>
</message>
<message>
<source>Invalid entry group id field size</source>
- <translation>Invalid størrelse for gruppe id felt</translation>
+ <translation>Ugyldig størrelse på gruppe id felt</translation>
</message>
<message>
<source>Invalid entry icon field size</source>
- <translation>Invalid størrelse for postikonsfelt</translation>
+ <translation>Ugyldig størrelse på postikonsfelt</translation>
</message>
<message>
<source>Invalid entry creation time field size</source>
- <translation>Invalid størrelse for postoprettelsestidsfelt</translation>
+ <translation>Ugyldig størrelse på postoprettelsestidsfelt</translation>
</message>
<message>
<source>Invalid entry modification time field size</source>
- <translation>Invalid størrelse for postmodifikationstidsfelt</translation>
+ <translation>Ugyldig størrelse på postmodifikationstidsfelt</translation>
</message>
<message>
<source>Invalid entry expiry time field size</source>
- <translation>Invalid størrelse for postudløbstidsfelt</translation>
+ <translation>Ugyldig størrelse på postudløbstidsfelt</translation>
</message>
<message>
<source>Invalid entry field type</source>
- <translation>Invalid post-felt-type</translation>
+ <translation>Ugyldig post-felt-type</translation>
</message>
<message>
<source>unable to seek to content position</source>
+ <translation>kan ikke søge til indholdets placering</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
+ <source>Inactive share %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
+ <source>Imported from %1</source>
+ <translation>Importerer fra %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
+ <source>Synchronized with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
+ <source>Import is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Export is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Inactive share</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3153,74 +4091,74 @@ Line %2, column %3</source>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation type="unfinished"/>
+ <translation>Nøglekomponent</translation>
</message>
<message>
<source>Key Component Description</source>
- <translation type="unfinished"/>
+ <translation>Beskrivelse for nøglekomponent</translation>
</message>
<message>
<source>Cancel</source>
- <translation>Afbryd</translation>
+ <translation>Annuller</translation>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation type="unfinished"/>
+ <translation>Nøglekomponenten er indstillet, klik for at ændre eller fjerne</translation>
</message>
<message>
<source>Add %1</source>
<comment>Add a key component</comment>
- <translation type="unfinished"/>
+ <translation>Tilføj %1</translation>
</message>
<message>
<source>Change %1</source>
<comment>Change a key component</comment>
- <translation type="unfinished"/>
+ <translation>Skift %1</translation>
</message>
<message>
<source>Remove %1</source>
<comment>Remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>Fjern %1</translation>
</message>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>%1 er indstillet. Klik for at ændre eller fjerne</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Gennemse</translation>
- </message>
- <message>
<source>Generate</source>
- <translation>Opret</translation>
+ <translation>Generér</translation>
</message>
<message>
<source>Key File</source>
- <translation type="unfinished"/>
+ <translation>Nøglefil</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Du kan tilføje en nøglefil med tilfældige bytes for yderligere sikkerhed.&lt;/p&gt;&lt;p&gt;Du skal holde den hemmelig og aldrig miste den, ellers vil du være låst ude!&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
- <translation>Forældet nøglefilformat</translation>
+ <translation>Udgået nøglefilformat</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Du bruger et udgået nøglefilformat, som muligvis ikke
+understøttes i fremtiden.
+
+Gå venligst til hovednøgleindstillingerne og generér en ny nøglefil.</translation>
</message>
<message>
<source>Error loading the key file '%1'
Message: %2</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved indlæsning af nøglefilen &apos;%1&apos;
+Meddelelse: %2</translation>
</message>
<message>
<source>Key files</source>
@@ -3232,20 +4170,57 @@ Message: %2</source>
</message>
<message>
<source>Create Key File...</source>
- <translation>Opret Nøglefil...</translation>
+ <translation>Opret nøglefil ...</translation>
</message>
<message>
<source>Error creating key file</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved oprettelse af nøglefil</translation>
</message>
<message>
<source>Unable to create key file: %1</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke oprette nøglefil: %1</translation>
</message>
<message>
<source>Select a key file</source>
<translation>Vælg en nøglefil</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Gennemse ...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3271,7 +4246,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Tools</source>
- <translation>&amp;Værktøj</translation>
+ <translation>&amp;Værktøjer</translation>
</message>
<message>
<source>&amp;Quit</source>
@@ -3283,7 +4258,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Open database...</source>
- <translation>&amp;Åben database..</translation>
+ <translation>&amp;Åbn database ...</translation>
</message>
<message>
<source>&amp;Save database</source>
@@ -3307,7 +4282,7 @@ Message: %2</source>
</message>
<message>
<source>Sa&amp;ve database as...</source>
- <translation>Gem database som</translation>
+ <translation>&amp;Gem database som ...</translation>
</message>
<message>
<source>Database settings</source>
@@ -3319,7 +4294,7 @@ Message: %2</source>
</message>
<message>
<source>Copy &amp;username</source>
- <translation>Kopier &amp;brugernavn</translation>
+ <translation>Kopiér &amp;brugernavn</translation>
</message>
<message>
<source>Copy username to clipboard</source>
@@ -3327,19 +4302,15 @@ Message: %2</source>
</message>
<message>
<source>Copy password to clipboard</source>
- <translation>Kopiér kodeord til udklipsholder</translation>
+ <translation>Kopiér adgangskode til udklipsholder</translation>
</message>
<message>
<source>&amp;Settings</source>
<translation>&amp;Indstillinger</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Kodeordsgenerator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation>%Lås databaser</translation>
+ <translation>&amp;Lås databaser</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -3347,7 +4318,7 @@ Message: %2</source>
</message>
<message>
<source>Copy title to clipboard</source>
- <translation>Kopier titel til udklipsholder</translation>
+ <translation>Kopiér titel til udklipsholder</translation>
</message>
<message>
<source>&amp;URL</source>
@@ -3355,23 +4326,23 @@ Message: %2</source>
</message>
<message>
<source>Copy URL to clipboard</source>
- <translation>&amp;Kopier URL til udklipsholder</translation>
+ <translation>Kopiér URL til udklipsholder</translation>
</message>
<message>
<source>&amp;Notes</source>
- <translation>&amp;Noter</translation>
+ <translation>&amp;Bemærkninger</translation>
</message>
<message>
<source>Copy notes to clipboard</source>
- <translation>Kopier noter til udklipsholder</translation>
+ <translation>Kopiér bemærkninger til udklipsholder</translation>
</message>
<message>
<source>&amp;Export to CSV file...</source>
- <translation>&amp;Eksporter til CSV-fil...</translation>
+ <translation>&amp;Eksportér til CSV-fil ...</translation>
</message>
<message>
<source>Set up TOTP...</source>
- <translation>Indstil TOTP...</translation>
+ <translation>Opsæt TOTP ...</translation>
</message>
<message>
<source>Copy &amp;TOTP</source>
@@ -3379,7 +4350,7 @@ Message: %2</source>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
- <translation>Tøm skraldespand</translation>
+ <translation>&amp;Tøm papirkurven</translation>
</message>
<message>
<source>Clear history</source>
@@ -3410,141 +4381,203 @@ Message: %2</source>
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
<translation>ADVARSEL: Du bruger en ustabil udgave af KeePassXC!
-Der er høj risiko for korruption, sørg for at have en backup af dine databaser.
+Der er høj risiko for korruption, sørg for at have en sikkerhedskopi af dine databaser.
Denne version er ikke beregnet til at blive brugt i produktion.</translation>
</message>
<message>
<source>&amp;Donate</source>
- <translation type="unfinished"/>
+ <translation>&amp;Donér</translation>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation type="unfinished"/>
+ <translation>Rapportér en &amp;fejl</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
- <translation type="unfinished"/>
+ <translation>ADVARSEL: Din Qt-version kan få KeePassXC til at holde op med at virke ved brug af skærmtastatur!
+Vi anbefaler at du i bruger det AppImage som findes på vores downloadside.</translation>
</message>
<message>
<source>&amp;Import</source>
- <translation type="unfinished"/>
+ <translation>&amp;Importér</translation>
</message>
<message>
<source>Copy att&amp;ribute...</source>
- <translation type="unfinished"/>
+ <translation>Kopiér a&amp;ttribut ...</translation>
</message>
<message>
<source>TOTP...</source>
- <translation type="unfinished"/>
+ <translation>TOTP ...</translation>
</message>
<message>
<source>&amp;New database...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ny database ...</translation>
</message>
<message>
<source>Create a new database</source>
- <translation type="unfinished"/>
+ <translation>Opret en ny database</translation>
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation type="unfinished"/>
+ <translation>Sammenlæg &amp;fra database ...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
- <translation type="unfinished"/>
+ <translation>Sammenlæg fra en anden KDBX-database</translation>
</message>
<message>
<source>&amp;New entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ny post</translation>
</message>
<message>
<source>Add a new entry</source>
- <translation type="unfinished"/>
+ <translation>Tilføj en ny post</translation>
</message>
<message>
<source>&amp;Edit entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Rediger post</translation>
</message>
<message>
<source>View or edit entry</source>
- <translation type="unfinished"/>
+ <translation>Vis eller rediger post</translation>
</message>
<message>
<source>&amp;New group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ny gruppe</translation>
</message>
<message>
<source>Add a new group</source>
- <translation type="unfinished"/>
+ <translation>Tilføj en ny gruppe</translation>
</message>
<message>
<source>Change master &amp;key...</source>
- <translation type="unfinished"/>
+ <translation>Skift &amp;hovednøgle ...</translation>
</message>
<message>
<source>&amp;Database settings...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Databaseindstillinger ...</translation>
</message>
<message>
<source>Copy &amp;password</source>
- <translation type="unfinished"/>
+ <translation>Kopiér adgangsk&amp;ode</translation>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Udfør &amp;autoskriv</translation>
</message>
<message>
<source>Open &amp;URL</source>
- <translation type="unfinished"/>
+ <translation>Åbn &amp;URL</translation>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation type="unfinished"/>
+ <translation>KeePass 1-database ...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
- <translation type="unfinished"/>
+ <translation>Importér en KeePass 1-database</translation>
</message>
<message>
<source>CSV file...</source>
- <translation type="unfinished"/>
+ <translation>CSV-fil ...</translation>
</message>
<message>
<source>Import a CSV file</source>
- <translation type="unfinished"/>
+ <translation>Importér en CSV-fil</translation>
</message>
<message>
<source>Show TOTP...</source>
- <translation type="unfinished"/>
+ <translation>Vis TOTP ...</translation>
</message>
<message>
<source>Show TOTP QR Code...</source>
+ <translation>Vis TOTP QR-kode ...</translation>
+ </message>
+ <message>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <translation>BEMÆRK: Du bruger en præudgivelsesversion af KeePassXC!
+Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produktionsbrug.</translation>
+ </message>
+ <message>
+ <source>Check for updates on startup?</source>
+ <translation>Søg efter opdateringer ved opstart?</translation>
+ </message>
+ <message>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
+ <translation>Skal KeePassXC søge efter opdateringer ved opstart?</translation>
+ </message>
+ <message>
+ <source>You can always check for updates manually from the application menu.</source>
+ <translation>Du kan altid søge efter opdateringer manuelt fra programmenuen.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for Updates...</source>
+ <source>&amp;Check for Updates...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Share entry</source>
+ <source>Downlo&amp;ad all favicons</source>
<translation type="unfinished"/>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Sort &amp;A-Z</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>Sort &amp;Z-A</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>&amp;Password Generator</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>Download favicon</source>
+ <translation>Download favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3552,58 +4585,66 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Opretter manglende %1 [%2]</translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Flytter %1 [%2]</translation>
</message>
<message>
<source>Overwriting %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Overskriver %1 [%2]</translation>
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation type="unfinished"/>
+ <translation>gammel post sammenlagt fra databasen &quot;%1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Tilføjer sikkerhedskopi til ældre mål %1 [%2]</translation>
</message>
<message>
<source>Adding backup for older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Tilføjer sikkerhedskopi til ældre kilde %1 [%2]</translation>
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Genanvender ældre målpost oven på nyere kilde %1 [%2]</translation>
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Genanvender ældre kildepost oven på nyere mål %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Synkroniserer fra nyere kilde %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Synkroniserer fra ældre kilde %1 [%2]</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sletter barnet %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sletter forælderløse %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
- <translation type="unfinished"/>
+ <translation>Ændrede slettet objekter</translation>
</message>
<message>
<source>Adding missing icon %1</source>
+ <translation>Tilføjer manglende ikon %1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3611,7 +4652,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation type="unfinished"/>
+ <translation>Opret en ny KeePassXC-database ...</translation>
</message>
<message>
<source>Root</source>
@@ -3623,55 +4664,121 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizardPage</name>
<message>
<source>WizardPage</source>
- <translation type="unfinished"/>
+ <translation>Assistentside</translation>
</message>
<message>
<source>En&amp;cryption Settings</source>
- <translation type="unfinished"/>
+ <translation>&amp;Krypteringsindstillinger</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Her kan du justere databasens krypteringsindstillinger. Bare rolig, du kan ændre dem senere i databaseindstillingerne.</translation>
</message>
<message>
<source>Advanced Settings</source>
- <translation type="unfinished"/>
+ <translation>Avancerede indstillinger</translation>
</message>
<message>
<source>Simple Settings</source>
- <translation type="unfinished"/>
+ <translation>Simple indstillinger</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageEncryption</name>
<message>
<source>Encryption Settings</source>
- <translation type="unfinished"/>
+ <translation>Krypteringsindstillinger</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Her kan du justere databasens krypteringsindstillinger. Bare rolig, du kan ændre dem senere i databaseindstillingerne.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMasterKey</name>
<message>
<source>Database Master Key</source>
- <translation type="unfinished"/>
+ <translation>Hovednøgle til database</translation>
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation type="unfinished"/>
+ <translation>En hovednøgle til at beskytte din database, som kun kendes af dig.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMetaData</name>
<message>
<source>General Database Information</source>
- <translation type="unfinished"/>
+ <translation>Generel information om database</translation>
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
+ <translation>Udfyld venligst det navn som skal vises og en valgfri beskrivelse til din nye database:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3679,15 +4786,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
- <translation>Invalid nøglefil, forventede en OpenSSH nøgle</translation>
+ <translation>Ugyldig nøglefil, forventede en OpenSSH nøgle</translation>
</message>
<message>
<source>PEM boundary mismatch</source>
- <translation>PEM grænse-mismatch</translation>
+ <translation>Uoverensstemmelse i PEM-grænse</translation>
</message>
<message>
<source>Base64 decoding failed</source>
- <translation>Base64 afkodning fejlede</translation>
+ <translation>Base64-afkodning mislykkedes</translation>
</message>
<message>
<source>Key file way too small.</source>
@@ -3695,7 +4802,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Key file magic header id invalid</source>
- <translation>Nøglefil magic i header er invalid</translation>
+ <translation>Nøglefil magic i header er ugyldig</translation>
</message>
<message>
<source>Found zero keys</source>
@@ -3719,15 +4826,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
- <translation>Kodefrase er nødvendig for at dekryptere denne nøgle </translation>
+ <translation>Adgangssætning er nødvendig for at dekryptere denne nøgle</translation>
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation>Nøgleafledning fejlede, er nøglefilen korrupt? </translation>
+ <translation>Nøgleafledning mislykkedes, er nøglefilen korrupt?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation>Dekryptering fejlede, forkert kodefrase? </translation>
+ <translation>Dekryptering mislykkedes, forkert adgangssætning?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
@@ -3751,7 +4858,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation>Privat nøgle sluttede uventet under skrivnig</translation>
+ <translation>Privat nøgle sluttede uventet under skrivning</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
@@ -3775,29 +4882,56 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
- <translation>Indtast kodeord</translation>
+ <translation>Indtast adgangskode:</translation>
</message>
<message>
<source>Confirm password:</source>
- <translation type="unfinished"/>
+ <translation>Bekræft adgangskode:</translation>
</message>
<message>
<source>Password</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskode</translation>
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;En adgangskode er den primære metode til at sikre din database.&lt;/p&gt;&lt;p&gt;Gode adgangskoder er lange og unikke. KeePassXC kan generere en for dig.&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
- <translation type="unfinished"/>
+ <translation>Adgangskoderne er ikke ens.</translation>
</message>
<message>
<source>Generate master password</source>
+ <translation>Generér hovedadgangskode</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3809,7 +4943,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Password:</source>
- <translation>Kodeord:</translation>
+ <translation>Adgangskode:</translation>
</message>
<message>
<source>strength</source>
@@ -3818,31 +4952,19 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>entropy</source>
- <translation>entropi:</translation>
+ <translation>entropi</translation>
</message>
<message>
<source>Password</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskode</translation>
</message>
<message>
<source>Character Types</source>
<translation>Tegntyper</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Store Bogstaver</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Små Bogstaver</translation>
- </message>
- <message>
<source>Numbers</source>
- <translation>Numre</translation>
- </message>
- <message>
- <source>Special Characters</source>
- <translation>Specialtegn</translation>
+ <translation>Tal</translation>
</message>
<message>
<source>Extended ASCII</source>
@@ -3850,11 +4972,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Exclude look-alike characters</source>
- <translation>Udeluk lool-alike tegn</translation>
+ <translation>Udeluk tegn som ligner hinanden</translation>
</message>
<message>
<source>Pick characters from every group</source>
- <translation>Vælg tegn fra alle grupper:</translation>
+ <translation>Vælg tegn fra alle grupper</translation>
</message>
<message>
<source>&amp;Length:</source>
@@ -3862,7 +4984,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passphrase</source>
- <translation>Nøgleord sætning/frase:</translation>
+ <translation>Adgangssætning</translation>
</message>
<message>
<source>Wordlist:</source>
@@ -3870,11 +4992,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Word Separator:</source>
- <translation>Ord separator:</translation>
+ <translation>Ordseparator:</translation>
</message>
<message>
<source>Copy</source>
- <translation>Kopier</translation>
+ <translation>Kopiér</translation>
</message>
<message>
<source>Accept</source>
@@ -3886,57 +5008,49 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Entropy: %1 bit</source>
- <translation>Entropy: %1 bit</translation>
+ <translation>Entropi: %1 bit</translation>
</message>
<message>
<source>Password Quality: %1</source>
- <translation>Kodeord kvalitet: %1</translation>
+ <translation>Kvaliteten af adgangskoden: %1</translation>
</message>
<message>
<source>Poor</source>
<comment>Password quality</comment>
- <translation>Dårligt</translation>
+ <translation>Dårlig</translation>
</message>
<message>
<source>Weak</source>
<comment>Password quality</comment>
- <translation>Svagt</translation>
+ <translation>Svag</translation>
</message>
<message>
<source>Good</source>
<comment>Password quality</comment>
- <translation>Godt</translation>
+ <translation>God</translation>
</message>
<message>
<source>Excellent</source>
<comment>Password quality</comment>
- <translation>Udmærket</translation>
+ <translation>Fremragende</translation>
</message>
<message>
<source>ExtendedASCII</source>
- <translation type="unfinished"/>
+ <translation>UdvidetASCII</translation>
</message>
<message>
<source>Switch to advanced mode</source>
- <translation type="unfinished"/>
+ <translation>Skift til avanceret tilstand</translation>
</message>
<message>
<source>Advanced</source>
<translation>Avanceret</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3946,86 +5060,146 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Braces</source>
- <translation type="unfinished"/>
+ <translation>Parenteser</translation>
</message>
<message>
<source>{[(</source>
- <translation type="unfinished"/>
+ <translation>{[(</translation>
</message>
<message>
<source>Punctuation</source>
- <translation type="unfinished"/>
+ <translation>Tegnsætning</translation>
</message>
<message>
<source>.,:;</source>
- <translation type="unfinished"/>
+ <translation>.,:;</translation>
</message>
<message>
<source>Quotes</source>
- <translation type="unfinished"/>
+ <translation>Citationstegn</translation>
</message>
<message>
<source>&quot; &apos;</source>
+ <translation>&quot; &apos;</translation>
+ </message>
+ <message>
+ <source>&lt;*+!?=</source>
+ <translation>&lt;*+!?=</translation>
+ </message>
+ <message>
+ <source>\_|-/</source>
+ <translation>\_|-/</translation>
+ </message>
+ <message>
+ <source>Logograms</source>
+ <translation>Logogrammer</translation>
+ </message>
+ <message>
+ <source>#$%&amp;&amp;@^`~</source>
+ <translation>#$%&amp;&amp;@^`~</translation>
+ </message>
+ <message>
+ <source>Switch to simple mode</source>
+ <translation>Skift til simpel tilstand</translation>
+ </message>
+ <message>
+ <source>Simple</source>
+ <translation>Simpel</translation>
+ </message>
+ <message>
+ <source>Character set to exclude from generated password</source>
+ <translation>Tegnsæt som skal medtages fra generede adgangskode</translation>
+ </message>
+ <message>
+ <source>Do not include:</source>
+ <translation>Medtag ikke:</translation>
+ </message>
+ <message>
+ <source>Add non-hex letters to &quot;do not include&quot; list</source>
+ <translation>Tilføj tegn som ikke er hex i &quot;medtag ikke&quot;-liste</translation>
+ </message>
+ <message>
+ <source>Hex</source>
+ <translation>Hex</translation>
+ </message>
+ <message>
+ <source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
+ <translation>Udeluk tegnene: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
+ </message>
+ <message>
+ <source>Word Co&amp;unt:</source>
+ <translation>&amp;Ordtælling:</translation>
+ </message>
+ <message>
+ <source>Regenerate</source>
+ <translation>Regenerér</translation>
+ </message>
+ <message>
+ <source>Generated password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Math</source>
+ <source>Upper-case letters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&lt;*+!?=</source>
+ <source>Lower-case letters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Dashes</source>
+ <source>Special characters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>\_|-/</source>
+ <source>Math Symbols</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Logograms</source>
+ <source>Dashes and Slashes</source>
<translation type="unfinished"/>
</message>
<message>
- <source>#$%&amp;&amp;@^`~</source>
+ <source>Excluded characters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Switch to simple mode</source>
+ <source>Hex Passwords</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Simple</source>
+ <source>Password length</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Character set to exclude from generated password</source>
+ <source>Word Case:</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do not include:</source>
+ <source>Regenerate password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Add non-hex letters to &quot;do not include&quot; list</source>
+ <source>Copy password</source>
+ <translation>Kopiér kodeord</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Hex</source>
+ <source>lower case</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
+ <source>UPPER CASE</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Word Co&amp;unt:</source>
+ <source>Title Case</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Regenerate</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4033,13 +5207,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QApplication</name>
<message>
<source>KeeShare</source>
- <translation type="unfinished"/>
+ <translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4047,7 +5218,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QMessageBox</name>
<message>
<source>Overwrite</source>
- <translation type="unfinished"/>
+ <translation>Overskriv</translation>
</message>
<message>
<source>Delete</source>
@@ -4055,11 +5226,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation type="unfinished"/>
+ <translation>Flyt</translation>
</message>
<message>
<source>Empty</source>
- <translation type="unfinished"/>
+ <translation>Tøm</translation>
</message>
<message>
<source>Remove</source>
@@ -4067,7 +5238,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Skip</source>
- <translation type="unfinished"/>
+ <translation>Spring over</translation>
</message>
<message>
<source>Disable</source>
@@ -4075,6 +5246,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Merge</source>
+ <translation>Sammenlæg</translation>
+ </message>
+ <message>
+ <source>Continue</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4098,11 +5273,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Action cancelled or denied</source>
- <translation>Handling afbrudt eller nægtet</translation>
+ <translation>Handlingen blev annulleret eller nægtet</translation>
</message>
<message>
<source>KeePassXC association failed, try again</source>
- <translation>KeePassXC associering fejlede, prøv igen</translation>
+ <translation>KeePassXC-associering mislykkedes, prøv igen</translation>
</message>
<message>
<source>Encryption key is not recognized</source>
@@ -4138,7 +5313,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Key file of the database.</source>
- <translation>Databasens nøglefil</translation>
+ <translation>Databasens nøglefil.</translation>
</message>
<message>
<source>path</source>
@@ -4162,15 +5337,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Prompt for the entry&apos;s password.</source>
- <translation>Spørg om postens kodeord.</translation>
+ <translation>Spørg om postens adgangskode.</translation>
</message>
<message>
<source>Generate a password for the entry.</source>
- <translation>Generér et kodeord for posten.</translation>
- </message>
- <message>
- <source>Length for the generated password.</source>
- <translation>Længde af genereret kodeord.</translation>
+ <translation>Generér en adgangskode for posten.</translation>
</message>
<message>
<source>length</source>
@@ -4182,7 +5353,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
- <translation>Kopiér en posts kodeord til udklipsholder.</translation>
+ <translation>Kopiér adgangskoden for post til udklipsholder.</translation>
</message>
<message>
<source>Path of the entry to clip.</source>
@@ -4211,34 +5382,23 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Estimate the entropy of a password.</source>
- <translation>Estimat for entropi af et kodeord.</translation>
+ <translation>Estimat for entropi af en adgangskode.</translation>
</message>
<message>
<source>Password for which to estimate the entropy.</source>
- <translation>Koderd, som entropi skal estimeres for.</translation>
+ <translation>Adgangskode, som entropi skal estimeres for.</translation>
</message>
<message>
<source>Perform advanced analysis on the password.</source>
- <translation>Udfør advanceret analyse af kodeordet.</translation>
- </message>
- <message>
- <source>Extract and print the content of a database.</source>
- <translation>Dekomprimer og print indeholdet af en database.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Sti til databasen, som skal dekomprimeres</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Indsæt kodeord for at låse %1 op:</translation>
+ <translation>Udfør avanceret analyse af adgangskoden.</translation>
</message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation>ADVARSEL: Du benytter et forældet nøglefilsformat, som muligvis ikke vil blive understøttet i fremtiden.
+ <translation>ADVARSEL: Du bruger et udgået nøglefilformat, som muligvis
+ikke understøttes i fremtiden.
Overvej at generere en ny nøglefil.</translation>
</message>
@@ -4258,11 +5418,11 @@ Tilgængelige kommandoer:
</message>
<message>
<source>List database entries.</source>
- <translation>List poster i databasen.</translation>
+ <translation>Vis poster i databasen.</translation>
</message>
<message>
<source>Path of the group to list. Default is /</source>
- <translation>Sti til gruppen, som skal listes. Standard er /</translation>
+ <translation>Sti til gruppen, som skal vises. Standard er /</translation>
</message>
<message>
<source>Find entries quickly.</source>
@@ -4270,31 +5430,27 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Search term.</source>
- <translation>Søgeudtryk.</translation>
+ <translation>Søgefrase.</translation>
</message>
<message>
<source>Merge two databases.</source>
- <translation>Kombiner to databaser.</translation>
- </message>
- <message>
- <source>Path of the database to merge into.</source>
- <translation>Sti til databasen, som der skal kombineres ind i.</translation>
+ <translation>Sammenlæg to databaser.</translation>
</message>
<message>
<source>Path of the database to merge from.</source>
- <translation>Sti til databasen, som der skal kombineres fra.</translation>
+ <translation>Sti til databasen, som skal sammenlægges fra.</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation>Brug samme legitimationsoplysninger til begge databasefiler.</translation>
+ <translation>Brug de samme loginoplysninger til begge databasefiler.</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
- <translation>Nøglefil for databasen, som der skal kombineres fra.</translation>
+ <translation>Nøglefil for databasen, som der skal sammenlægges fra.</translation>
</message>
<message>
<source>Show an entry&apos;s information.</source>
- <translation>Vis en posts information.</translation>
+ <translation>Vis information for en post.</translation>
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
@@ -4310,7 +5466,7 @@ Tilgængelige kommandoer:
</message>
<message>
<source>NULL device</source>
- <translation>NULL enhed</translation>
+ <translation>NULL-enhed</translation>
</message>
<message>
<source>error reading from device</source>
@@ -4318,11 +5474,11 @@ Tilgængelige kommandoer:
</message>
<message>
<source>malformed string</source>
- <translation>Misdannet streng</translation>
+ <translation>forkert udformet streng</translation>
</message>
<message>
<source>missing closing quote</source>
- <translation>Mangler afsluttende kvoteringstegn</translation>
+ <translation>mangler afsluttende kvoteringstegn</translation>
</message>
<message>
<source>Group</source>
@@ -4338,11 +5494,11 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Password</source>
- <translation>Kodeord</translation>
+ <translation>Adgangskode</translation>
</message>
<message>
<source>Notes</source>
- <translation>Noter</translation>
+ <translation>Bemærkninger</translation>
</message>
<message>
<source>Last Modified</source>
@@ -4354,11 +5510,7 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Browser Integration</source>
- <translation>Browser-integration</translation>
- </message>
- <message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Udfordring-Svar - Slot %2 - %3</translation>
+ <translation>Browserintegritet</translation>
</message>
<message>
<source>Press</source>
@@ -4370,81 +5522,77 @@ Tilgængelige kommandoer:
</message>
<message>
<source>SSH Agent</source>
- <translation>SSH Agent</translation>
+ <translation>SSH-agent</translation>
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
- <translation>Generer en tilfældig diceware nøglefrase.</translation>
+ <translation>Generér en ny tilfældig diceware-adgangssætning.</translation>
</message>
<message>
<source>Word count for the diceware passphrase.</source>
- <translation>Antal af ord for diceware nøglefrase.</translation>
+ <translation>Ordtælling for diceware-adgangssætning.</translation>
</message>
<message>
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
- <translation>Ordliste for diceware generator.
+ <translation>Ordliste for diceware-generator.
[Standard: EFF Engelsk]</translation>
</message>
<message>
<source>Generate a new random password.</source>
- <translation>Generér et nyt tilfædligt kodeord.</translation>
- </message>
- <message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
+ <translation>Generér en ny tilfældig adgangskode.</translation>
</message>
<message>
<source>Could not create entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke oprette post med stien %1.</translation>
</message>
<message>
<source>Enter password for new entry: </source>
- <translation type="unfinished"/>
+ <translation>Indtast adgangskode til ny post: </translation>
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke skrive databasen %1.</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Det lykkedes at tilføje posten %1.</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Kopiér den nuværende TOTP til udklipsholderen.</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation type="unfinished"/>
+ <translation>Ugyldig timeout-værdi %1.</translation>
</message>
<message>
<source>Entry %1 not found.</source>
- <translation type="unfinished"/>
+ <translation>Posten %1 blev ikke fundet.</translation>
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
- <translation type="unfinished"/>
+ <translation>Posten med stien %1 har ikke opsat nogen TOTP.</translation>
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>Postens nuværende TOTP kopieret til udklipsholderen!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>Postens adgangskode kopieret til udklipsholderen!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Rydder udklipsholderen om %1 sekund ...</numerusform><numerusform>Rydder udklipsholderen om %1 sekunder ...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
- <translation type="unfinished"/>
+ <translation>Udklipsholder ryddet!</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation type="unfinished"/>
+ <translation>Gør adgangskodeprompt og andre sekundære outputs stille.</translation>
</message>
<message>
<source>count</source>
@@ -4452,243 +5600,218 @@ Tilgængelige kommandoer:
<translation>antal</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke finde post med stien %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Ændre ikke nogen felter for posten %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
- <translation type="unfinished"/>
+ <translation>Indtast ny adgangskode for posten: </translation>
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Skrivning af databasen mislykkedes: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Det lykkedes at redigere posten %1.</translation>
</message>
<message>
<source>Length %1</source>
- <translation type="unfinished"/>
+ <translation>Længde %1</translation>
</message>
<message>
<source>Entropy %1</source>
- <translation type="unfinished"/>
+ <translation>Entropi %1</translation>
</message>
<message>
<source>Log10 %1</source>
- <translation type="unfinished"/>
+ <translation>Log10 %1</translation>
</message>
<message>
<source>Multi-word extra bits %1</source>
- <translation type="unfinished"/>
+ <translation>Ekstra bits for multiord %1</translation>
</message>
<message>
<source>Type: Bruteforce</source>
- <translation type="unfinished"/>
+ <translation>Type: Bruteforce</translation>
</message>
<message>
<source>Type: Dictionary</source>
- <translation type="unfinished"/>
+ <translation>Type: Ordbog</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation type="unfinished"/>
+ <translation>Type: Ordbog+leet</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation type="unfinished"/>
+ <translation>Type: Brugerord</translation>
</message>
<message>
<source>Type: User+Leet</source>
- <translation type="unfinished"/>
+ <translation>Type: Bruger ord+leet</translation>
</message>
<message>
<source>Type: Repeated</source>
- <translation type="unfinished"/>
+ <translation>Type: Gentaget</translation>
</message>
<message>
<source>Type: Sequence</source>
- <translation type="unfinished"/>
+ <translation>Type: Sekvens</translation>
</message>
<message>
<source>Type: Spatial</source>
- <translation type="unfinished"/>
+ <translation>Type: Rumlig</translation>
</message>
<message>
<source>Type: Date</source>
- <translation type="unfinished"/>
+ <translation>Type: Dato</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Bruteforce(gentaget)</translation>
</message>
<message>
<source>Type: Dictionary(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Ordbog(gentaget)</translation>
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Ordbog+leet(gentaget)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Brugerord(gentaget)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Bruger ord+leet(gentaget)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Gentaget(gentaget)</translation>
</message>
<message>
<source>Type: Sequence(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Sekvens(gentaget)</translation>
</message>
<message>
<source>Type: Spatial(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Rumlig(gentaget)</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Type: Dato(gentaget)</translation>
</message>
<message>
<source>Type: Unknown%1</source>
- <translation type="unfinished"/>
+ <translation>Type: Ukendt%1</translation>
</message>
<message>
<source>Entropy %1 (%2)</source>
- <translation type="unfinished"/>
+ <translation>Entropi %1 (%2)</translation>
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation type="unfinished"/>
+ <translation>*** Længde på adgangskode (%1) != summen af længden på delene (%2) ***</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke indlæse nøglefilen %1: %2</translation>
</message>
<message>
<source>Length of the generated password</source>
- <translation type="unfinished"/>
+ <translation>Længde på den genereret adgangskode</translation>
</message>
<message>
<source>Use lowercase characters</source>
- <translation type="unfinished"/>
+ <translation>Brug tegn med små bogstaver</translation>
</message>
<message>
<source>Use uppercase characters</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
+ <translation>Brug tegn med store bogstaver</translation>
</message>
<message>
<source>Use special characters</source>
- <translation type="unfinished"/>
+ <translation>Brug specialtegn</translation>
</message>
<message>
<source>Use extended ASCII</source>
- <translation type="unfinished"/>
+ <translation>Brug udvidet ASCII</translation>
</message>
<message>
<source>Exclude character set</source>
- <translation type="unfinished"/>
+ <translation>Udeluk tegnsæt</translation>
</message>
<message>
<source>chars</source>
- <translation type="unfinished"/>
+ <translation>tegn</translation>
</message>
<message>
<source>Exclude similar looking characters</source>
- <translation type="unfinished"/>
+ <translation>Udeluk tegn som ligner hinanden</translation>
</message>
<message>
<source>Include characters from every selected group</source>
- <translation type="unfinished"/>
+ <translation>Medtag tegn fra hver valgte gruppe</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
- <translation type="unfinished"/>
+ <translation>Vis elementerne i gruppen rekursivt.</translation>
</message>
<message>
<source>Cannot find group %1.</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke finde gruppen %1.</translation>
</message>
<message>
<source>Error reading merge file:
%1</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved læsning af sammenlægningsfil:
+%1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke gemme database til filen : %1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke gemme database til filen: %1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Det lykkedes at genbruge posten %1.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Det lykkedes at slette posten %1.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
- <translation type="unfinished"/>
+ <translation>Vis postens nuværende TOTP.</translation>
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
- <translation type="unfinished"/>
+ <translation>FEJL: ukendt attribut %1.</translation>
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation type="unfinished"/>
+ <translation>Der er ikke angivet noget program til manipulering af udklipsholderen</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke starte programmet %1</translation>
</message>
<message>
<source>file empty</source>
- <translation type="unfinished"/>
+ <translation>filen er tom</translation>
</message>
<message>
<source>%1: (row, col) %2,%3</source>
- <translation type="unfinished"/>
+ <translation>%1: (række, kolonne) %2,%3</translation>
</message>
<message>
<source>AES: 256-bit</source>
@@ -4704,7 +5827,7 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Argon2 (KDBX 4 – recommended)</source>
- <translation>Argon2 (KDBX 4 – anbefalet)</translation>
+ <translation>Argon2 (KDBX 4 – anbefales)</translation>
</message>
<message>
<source>AES-KDF (KDBX 4)</source>
@@ -4717,60 +5840,52 @@ Tilgængelige kommandoer:
<message>
<source>Invalid Settings</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>Ugyldige indstillinger</translation>
</message>
<message>
<source>Invalid Key</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>Ugyldig nøgle</translation>
</message>
<message>
<source>Message encryption failed.</source>
- <translation type="unfinished"/>
+ <translation>Kryptering af meddelelse mislykkedes.</translation>
</message>
<message>
<source>No groups found</source>
- <translation type="unfinished"/>
+ <translation>Fandt ingen grupper</translation>
</message>
<message>
<source>Create a new database.</source>
- <translation type="unfinished"/>
+ <translation>Opret en ny database.</translation>
</message>
<message>
<source>File %1 already exists.</source>
- <translation type="unfinished"/>
+ <translation>Filen %1 findes allerede.</translation>
</message>
<message>
<source>Loading the key file failed</source>
- <translation type="unfinished"/>
+ <translation>Indlæsning af nøglefilen mislykkedes</translation>
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation type="unfinished"/>
+ <translation>Der er ikke indstillet nogen nøgle. Afbryder oprettelse af database.</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke gemme databasen: %1.</translation>
</message>
<message>
<source>Successfully created new database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
+ <translation>Oprettelse af ny database lykkedes.</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
+ <translation>Oprettelse af nøglefilen %1 mislykkedes: %2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>Fjern en post fra databasen.</translation>
+ <translation>Indlæsning af nøglefilen %1 mislykkedes: %2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4778,23 +5893,23 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
- <translation>Eksisterende enkelt-instans låsefil er invalid. Starter ny instans.</translation>
+ <translation>Eksisterende én-instans låsefil er ugyldig. Starter ny instans.</translation>
</message>
<message>
<source>The lock file could not be created. Single-instance mode disabled.</source>
- <translation>Låsefil kunne ikke oprettes. Enkelt-instans-tilstand slået fra.</translation>
+ <translation>Låsefil kunne ikke oprettes. Én-instans-tilstand slået fra.</translation>
</message>
<message>
<source>KeePassXC - cross-platform password manager</source>
- <translation>KeePassXC - password manager til flere platforme</translation>
+ <translation>KeePassXC - adgangskodehåndtering på tværs af platforme</translation>
</message>
<message>
<source>filenames of the password databases to open (*.kdbx)</source>
- <translation>Filnavne på de kodeordsdatabaser som skal åbnes (*.kdbx)</translation>
+ <translation>filnavne på de adgangskodedatabaser som skal åbnes (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
- <translation>sti til brugerdefineret indstillingsfil</translation>
+ <translation>sti til tilpasset indstillingsfil</translation>
</message>
<message>
<source>key file of the database</source>
@@ -4802,7 +5917,7 @@ Tilgængelige kommandoer:
</message>
<message>
<source>read password of the database from stdin</source>
- <translation>Læs kodeord til databasen fra stdin</translation>
+ <translation>læs adgangskode til databasen fra stdin</translation>
</message>
<message>
<source>Parent window handle</source>
@@ -4822,10 +5937,334 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Database password: </source>
- <translation type="unfinished"/>
+ <translation>Adgangskode for database: </translation>
</message>
<message>
<source>Cannot create new group</source>
+ <translation>Kan ikke oprette ny gruppe</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revision: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribution: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operativsystem: %1
+CPU-arkitektur: %2
+Kerne: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Autoskriv</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Aktiverede udvidelser:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Databasen blev ikke ændret af sammenlægningshandlingen.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4833,23 +6272,23 @@ Tilgængelige kommandoer:
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
- <translation>Intern zlib-fejl ved komprimering:</translation>
+ <translation>Intern zlib-fejl ved komprimering: </translation>
</message>
<message>
<source>Error writing to underlying device: </source>
- <translation>Fejl ved skrivning til enhed:</translation>
+ <translation>Fejl ved skrivning til enhed: </translation>
</message>
<message>
<source>Error opening underlying device: </source>
- <translation>Fejl ved åbning fra enhed:</translation>
+ <translation>Fejl ved åbning fra enhed: </translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
- <translation>Fejl ved læsning af data fra underliggende enhed:</translation>
+ <translation>Fejl ved læsning af data fra underliggende enhed: </translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
- <translation>Intern zlib-fejl ved dekomprimering:</translation>
+ <translation>Intern zlib-fejl ved dekomprimering: </translation>
</message>
</context>
<context>
@@ -4860,97 +6299,97 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Internal zlib error: </source>
- <translation>Intern zlib fejl:</translation>
+ <translation>Intern zlib-fejl: </translation>
</message>
</context>
<context>
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation type="unfinished"/>
+ <translation>Forbindelse til agent mislykkedes.</translation>
</message>
<message>
<source>Agent protocol error.</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved agentens protokol.</translation>
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation type="unfinished"/>
+ <translation>Der kører ikke nogen agent. Kan ikke tilføje identitet.</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation type="unfinished"/>
+ <translation>Der kører ikke nogen agent. Kan ikke fjerne identitet.</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
- <translation type="unfinished"/>
+ <translation>Agenten nægter identiteten. Mulige årsager inkluderer:</translation>
</message>
<message>
<source>The key has already been added.</source>
- <translation type="unfinished"/>
+ <translation>Nøglen er allerede blevet tilføjet.</translation>
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>Begrænset livstid understøttes ikke af agenten (tjek indstillingerne).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>En bekræftelsesanmodning understøttes ikke af agenten (tjek indstillingerne).</translation>
</message>
</context>
<context>
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Søg i hjælp</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>Søgefraser er som følger: [modifiers][felt:][&quot;]frase[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>Hver søgefrase skal matche (dvs. logisk OG)</translation>
</message>
<message>
<source>Modifiers</source>
- <translation type="unfinished"/>
+ <translation>Modifiers</translation>
</message>
<message>
<source>exclude term from results</source>
- <translation type="unfinished"/>
+ <translation>udeluk frase fra resultater</translation>
</message>
<message>
<source>match term exactly</source>
- <translation type="unfinished"/>
+ <translation>match frase præcist</translation>
</message>
<message>
<source>use regex in term</source>
- <translation type="unfinished"/>
+ <translation>brug regulært udtryk i frase</translation>
</message>
<message>
<source>Fields</source>
- <translation type="unfinished"/>
+ <translation>Felter</translation>
</message>
<message>
<source>Term Wildcards</source>
- <translation type="unfinished"/>
+ <translation>Jokertegn i frase</translation>
</message>
<message>
<source>match anything</source>
- <translation type="unfinished"/>
+ <translation>match alt</translation>
</message>
<message>
<source>match one</source>
- <translation type="unfinished"/>
+ <translation>match én</translation>
</message>
<message>
<source>logical OR</source>
- <translation type="unfinished"/>
+ <translation>logisk ELLER</translation>
</message>
<message>
<source>Examples</source>
- <translation type="unfinished"/>
+ <translation>Eksempler</translation>
</message>
</context>
<context>
@@ -4969,47 +6408,134 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Søg i hjælp</translation>
</message>
<message>
<source>Search (%1)...</source>
<comment>Search placeholder text, %1 is the keyboard shortcut</comment>
- <translation type="unfinished"/>
+ <translation>Søg (%1) ...</translation>
</message>
<message>
<source>Case sensitive</source>
- <translation>Versalfølsom</translation>
+ <translation>Der skelnes mellem store og små bogstaver</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generelt</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Gruppe</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Databaseindstillinger</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Lås database op</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Lås database</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
- <translation type="unfinished"/>
+ <translation>Aktivering</translation>
</message>
<message>
<source>Allow export</source>
- <translation type="unfinished"/>
+ <translation>Tillad eksport</translation>
</message>
<message>
<source>Allow import</source>
- <translation type="unfinished"/>
+ <translation>Tillad import</translation>
</message>
<message>
<source>Own certificate</source>
- <translation type="unfinished"/>
+ <translation>Eget certifikat</translation>
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>Fingeraftryk:</translation>
</message>
<message>
<source>Certificate:</source>
- <translation type="unfinished"/>
+ <translation>Certifikat:</translation>
</message>
<message>
<source>Signer</source>
- <translation type="unfinished"/>
+ <translation>Underskriver</translation>
</message>
<message>
<source>Key:</source>
@@ -5017,7 +6543,7 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Generate</source>
- <translation>Opret</translation>
+ <translation>Generér</translation>
</message>
<message>
<source>Import</source>
@@ -5025,23 +6551,23 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Export</source>
- <translation type="unfinished"/>
+ <translation>Eksportér</translation>
</message>
<message>
<source>Imported certificates</source>
- <translation type="unfinished"/>
+ <translation>Importerede certifikater</translation>
</message>
<message>
<source>Trust</source>
- <translation type="unfinished"/>
+ <translation>Giv troværdighed</translation>
</message>
<message>
<source>Ask</source>
- <translation type="unfinished"/>
+ <translation>Spørg</translation>
</message>
<message>
<source>Untrust</source>
- <translation type="unfinished"/>
+ <translation>Fjern troværdighed</translation>
</message>
<message>
<source>Remove</source>
@@ -5049,11 +6575,11 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Path</source>
- <translation type="unfinished"/>
+ <translation>Sti</translation>
</message>
<message>
<source>Status</source>
- <translation type="unfinished"/>
+ <translation>Status</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -5061,28 +6587,28 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Certificate</source>
- <translation type="unfinished"/>
+ <translation>Certifikat</translation>
</message>
<message>
<source>Trusted</source>
- <translation type="unfinished"/>
+ <translation>Troværdig</translation>
</message>
<message>
<source>Untrusted</source>
- <translation type="unfinished"/>
+ <translation>Ikke troværdig</translation>
</message>
<message>
<source>Unknown</source>
- <translation type="unfinished"/>
+ <translation>Ukendt</translation>
</message>
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation type="unfinished"/>
+ <translation>nøgle.deling</translation>
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>KeeShare-nøglefil</translation>
</message>
<message>
<source>All files</source>
@@ -5090,169 +6616,227 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Select path</source>
- <translation type="unfinished"/>
+ <translation>Vælg sti</translation>
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>Eksporterer ændret certifikat</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation type="unfinished"/>
+ <translation>Det eksporterede certifikat er ikke det samme som det der er i brug. Vil du eksportere det nuværende certifikat?</translation>
</message>
<message>
<source>Signer:</source>
- <translation type="unfinished"/>
+ <translation>Underskriver:</translation>
</message>
-</context>
-<context>
- <name>ShareObserver</name>
<message>
- <source>Import from container without signature</source>
+ <source>Allow KeeShare imports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Allow KeeShare exports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Only show warnings and errors</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
- <translation type="unfinished"/>
+ <source>Key</source>
+ <translation>Nøgle</translation>
</message>
<message>
- <source>Never</source>
- <translation>Aldrig</translation>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Always</source>
+ <source>Generate new certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Just this time</source>
+ <source>Import existing certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Export own certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Known shares</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Imported from %1</source>
+ <source>Trust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Signed share container are not supported - import prevented</source>
+ <source>Ask whether to trust the selected certificate every time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File is not readable</source>
+ <source>Untrust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid sharing container</source>
+ <source>Remove selected certificate</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareExport</name>
<message>
- <source>Untrusted import prevented</source>
- <translation type="unfinished"/>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Overskrivning af delingsbeholder som er underskrevet understøttes ikke - eksport forhindret</translation>
</message>
<message>
- <source>Successful signed import</source>
- <translation type="unfinished"/>
+ <source>Could not write export container (%1)</source>
+ <translation>Kunne ikke skrive eksportbeholderen (%1)</translation>
</message>
<message>
- <source>Unexpected error</source>
- <translation type="unfinished"/>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Kunne ikke indlejre underskrift: Kunne ikke åbne fil til skrivning (%1)</translation>
</message>
<message>
- <source>Unsigned share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Kunne ikke indlejre underskrift: Kunne ikke skrive fil (%1)</translation>
</message>
<message>
- <source>Successful unsigned import</source>
- <translation type="unfinished"/>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Kunne ikke indlejre database: Kunne ikke åbne fil til skrivning (%1)</translation>
</message>
<message>
- <source>File does not exist</source>
- <translation type="unfinished"/>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Kunne ikke indlejre database: Kunne ikke skrive fil (%1)</translation>
</message>
<message>
- <source>Unknown share container type</source>
- <translation type="unfinished"/>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Overskrivning af delingsbeholder som ikke er underskrevet understøttes ikke - eksport forhindret</translation>
</message>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Could not write export container</source>
+ <translation>Kunne ikke skrive eksportbeholderen</translation>
</message>
<message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
+ <source>Unexpected export error occurred</source>
+ <translation>Der opstod en uventet fejl ved eksport</translation>
</message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Import from container without signature</source>
+ <translation>Importér fra beholder uden underskrift</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation type="unfinished"/>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <translation>Vi kan ikke bekræfte kilden på den delte beholder da den ikke er underskrevet. Vil du virkelig impotere fra %1?</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation type="unfinished"/>
+ <source>Import from container with certificate</source>
+ <translation>Importér fra beholder med underskrift</translation>
</message>
<message>
- <source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Skal %1 være troværdig med fingeraftrykket %2 fra %3?</translation>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <source>Not this time</source>
+ <translation>Ikke denne gang</translation>
</message>
<message>
- <source>Export to %1</source>
- <translation type="unfinished"/>
+ <source>Never</source>
+ <translation>Aldrig</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
+ <source>Always</source>
+ <translation>Altid</translation>
</message>
<message>
- <source>Multiple import source path to %1 in %2</source>
- <translation type="unfinished"/>
+ <source>Just this time</source>
+ <translation>Kun denne gang</translation>
</message>
<message>
- <source>Conflicting export target path %1 in %2</source>
- <translation type="unfinished"/>
+ <source>Signed share container are not supported - import prevented</source>
+ <translation>Delingsbeholder som er underskrevet understøttes ikke - import forhindret</translation>
</message>
<message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
+ <source>File is not readable</source>
+ <translation>Filen kan ikke læses</translation>
</message>
<message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <source>Invalid sharing container</source>
+ <translation>Ugyldig delingsbeholder</translation>
</message>
<message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
+ <source>Untrusted import prevented</source>
+ <translation>Utroværdig import forhindret</translation>
</message>
<message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <source>Successful signed import</source>
+ <translation>Underskriver import lykkedes</translation>
+ </message>
+ <message>
+ <source>Unexpected error</source>
+ <translation>Uventet fejl</translation>
+ </message>
+ <message>
+ <source>Unsigned share container are not supported - import prevented</source>
+ <translation>Delingsbeholder som ikke er underskrevet understøttes ikke - import forhindret</translation>
+ </message>
+ <message>
+ <source>Successful unsigned import</source>
+ <translation>Ikke-underskriver import lykkedes</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>Filen findes ikke</translation>
+ </message>
+ <message>
+ <source>Unknown share container type</source>
+ <translation>Ukendt type delingsbeholder</translation>
+ </message>
+</context>
+<context>
+ <name>ShareObserver</name>
+ <message>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import fra %1 mislykkedes (%2)</translation>
+ </message>
+ <message>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import fra %1 lykkedes (%2)</translation>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importerer fra %1</translation>
+ </message>
+ <message>
+ <source>Export to %1 failed (%2)</source>
+ <translation>Eksportér til %1 mislykkedes (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1 successful (%2)</source>
+ <translation>Eksportér til %1 lykkedes (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1</source>
+ <translation>Eksportér til %1</translation>
+ </message>
+ <message>
+ <source>Multiple import source path to %1 in %2</source>
+ <translation>Flere importkildestier %1 i %2</translation>
+ </message>
+ <message>
+ <source>Conflicting export target path %1 in %2</source>
+ <translation>Konflikt ved eksportmålets sti %1 i %2</translation>
</message>
</context>
<context>
<name>TotpDialog</name>
<message>
<source>Timed Password</source>
- <translation>Tidsbaseret kodeord</translation>
+ <translation>Tidsbaseret adgangskode</translation>
</message>
<message>
<source>000000</source>
@@ -5260,31 +6844,31 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Copy</source>
- <translation>Kopier</translation>
+ <translation>Kopiér</translation>
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Udløber om &lt;b&gt;%n&lt;/b&gt; sekund</numerusform><numerusform>Udløber om &lt;b&gt;%n&lt;/b&gt; sekunder</numerusform></translation>
</message>
</context>
<context>
<name>TotpExportSettingsDialog</name>
<message>
<source>Copy</source>
- <translation>Kopier</translation>
+ <translation>Kopiér</translation>
</message>
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>BEMÆRK: TOTP-indstillingerne er tilpasset og virker måske ikke med andre autentifikatorere.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation type="unfinished"/>
+ <translation>Der opstod en fejl ved oprettelse af QR-koden.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation type="unfinished"/>
+ <translation>Lukker om %1 sekunder.</translation>
</message>
</context>
<context>
@@ -5294,24 +6878,20 @@ Tilgængelige kommandoer:
<translation>Opsæt TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Nøgle:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
- <translation>Standard RFC 6238 token indstillinger</translation>
+ <translation>Standard RFC 6238-token indstillinger</translation>
</message>
<message>
<source>Steam token settings</source>
- <translation>Steam token indstillinger</translation>
+ <translation>Steam-token indstillinger</translation>
</message>
<message>
<source>Use custom settings</source>
- <translation>Brug brugerdefinerede indstillinger</translation>
+ <translation>Brug tilpasset indstillinger</translation>
</message>
<message>
<source>Custom Settings</source>
- <translation type="unfinished"/>
+ <translation>Tilpasset indstillinger</translation>
</message>
<message>
<source>Time step:</source>
@@ -5320,34 +6900,63 @@ Tilgængelige kommandoer:
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>sek</translation>
+ <translation> sek</translation>
</message>
<message>
<source>Code size:</source>
<translation>Kodestørrelse:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 cifre</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritme:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source>Confirm Remove TOTP Settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 cifre</translation>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation type="unfinished"/>
+ <translation>Søger efter opdateringer</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation type="unfinished"/>
+ <translation>Søger efter opdateringer ...</translation>
</message>
<message>
<source>Close</source>
@@ -5355,46 +6964,46 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Update Error!</source>
- <translation type="unfinished"/>
+ <translation>Fejl ved opdatering!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation type="unfinished"/>
+ <translation>Der opstod en fejl ved indhentning af opdateringsinformation.</translation>
</message>
<message>
<source>Please try again later.</source>
- <translation type="unfinished"/>
+ <translation>Prøv venligst igen senere.</translation>
</message>
<message>
<source>Software Update</source>
- <translation type="unfinished"/>
+ <translation>Softwareopdatering</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation type="unfinished"/>
+ <translation>Der findes en ny version af KeePassXC!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 er tilgængelig nu — du har %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation type="unfinished"/>
+ <translation>Download den på keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation type="unfinished"/>
+ <translation>Du er opdateret!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 er den seneste version</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
- <translation>Begynd at gemme dinne kodeord sikkert i en KeePassXC database</translation>
+ <translation>Gem dine adgangskoder sikkert i en KeePassXC-database</translation>
</message>
<message>
<source>Create new database</source>
@@ -5402,7 +7011,7 @@ Tilgængelige kommandoer:
</message>
<message>
<source>Open existing database</source>
- <translation>Åben en eksisterende database</translation>
+ <translation>Åbn en eksisterende database</translation>
</message>
<message>
<source>Import from KeePass 1</source>
@@ -5420,6 +7029,14 @@ Tilgængelige kommandoer:
<source>Welcome to KeePassXC %1</source>
<translation>Velkommen til KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5429,18 +7046,26 @@ Tilgængelige kommandoer:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation type="unfinished"/>
+ <translation>Udfordring/svar med YubiKey</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Hvis du ejer en &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, så kan du bruge den for yderligere sikkerhed.&lt;/p&gt;&lt;p&gt;YubiKey kræver at en af dets pladser er programmet som &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1-udfordring/svar&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation type="unfinished"/>
+ <translation>Der er ikke registreret nogen YubiKey. Sørg venligst for at den er sat i.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
+ <translation>Der er ikke indsat nogen YubiKey.</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
<translation type="unfinished"/>
</message>
</context>
diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts
index fa0746f73..2ab08729b 100644
--- a/share/translations/keepassx_de.ts
+++ b/share/translations/keepassx_de.ts
@@ -50,7 +50,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>SSH Agent aktivieren (Neustart erforderlich)</translation>
+ <translation>SSH-Agent aktivieren (Neustart erforderlich)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@@ -73,7 +73,7 @@
</message>
<message>
<source>Access error for config file %1</source>
- <translation>Zugriffsfehler für Konfigurations-Datei %1</translation>
+ <translation>Zugriffsfehler für die Konfigurationsdatei %1</translation>
</message>
<message>
<source>Icon only</source>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Stil beibehalten</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Einstellungen zurück setzten?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Wollen Sie die Einstellungen für Allgemein und Sicherheit auf die Werkseinstellungen zurück stellen?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,24 +119,12 @@
<translation>Nur eine einzige KeePassXC-Instanz starten</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Letzte Datenbanken merken</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Letzte Schlüsseldateien und Sicherheits-Dongles merken</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Letzte Datenbank beim Start laden</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Fenster beim Programmstart minimieren</translation>
</message>
<message>
<source>File Management</source>
- <translation>Datei-Management</translation>
+ <translation>Dateimanagement</translation>
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
@@ -156,17 +152,13 @@
</message>
<message>
<source>Entry Management</source>
- <translation>Eintrags-Management</translation>
+ <translation>Eintragsmanagement</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
<translation>Gruppensymbol für das Erstellen neuer Einträge verwenden</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimieren beim Kopieren in die Zwischenablage</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Eintrag in Vorschau-Panel verstecken</translation>
</message>
@@ -192,11 +184,7 @@
</message>
<message>
<source>Hide window to system tray when minimized</source>
- <translation>Fenster verstecken, wenn minimiert</translation>
- </message>
- <message>
- <source>Language</source>
- <translation>Sprache</translation>
+ <translation>Fenster verstecken wenn minimiert</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -229,23 +217,104 @@
</message>
<message>
<source>Auto-Type start delay</source>
- <translation>Auto-Type Startverzögerung</translation>
+ <translation>Startverzögerung für Auto-Type</translation>
+ </message>
+ <message>
+ <source>Movable toolbar</source>
+ <translation>Bewegbare Werkzeugleiste</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Beim Programmstart nach Updates suchen</translation>
+ <source>Remember previously used databases</source>
+ <translation>Zuletzt verwendete Datenbanken merken</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Auch nach neuen Vorabversionen suchen</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Beim Start zuletzt verwendete Datenbanken öffnen</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Bewegbare Werkzeugleiste</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Datenbankschlüsseldateien und Sicherheits-Dongles merken</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Bei Anwendungsstart einmal pro Woche auf Updates überprüfen</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Bei der Update-Überprüfung Beta-Versionen einbeziehen</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Schaltflächenstil:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Sprache:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(zum Aktivieren Programm neu starten)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Nach Entsperrung der Datenbank Fenster minimieren</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimieren beim Öffnen einer URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Beim Kopieren in die Zwischenablage Fenster verstecken</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimieren</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>In den Hintergrund verschieben</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Timeout beim Herunterladen des Favicon:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Timeout beim Herunterladen von Webseitensymbol in Sekunden</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sek</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Schaltflächenstil der Werkzeugliste</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Nutze Monospace-Schriftart für Notizen</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Sprachauswahl</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Zurück setzen auf Werkseinstellungen</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Globaler Auto-Type Kurzbefehl</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Knopfstil</translation>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Auto-Type Zeicheneingabeverzögerung in Millisekunden</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Auto-Type Startverzögerung in Millisekunden</translation>
</message>
</context>
<context>
@@ -293,11 +362,11 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>Datenbank nach Auto-Type automatisch wieder sperren</translation>
+ <translation>Datenbank nach Auto-Type automatisch wieder sperren.</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>Keine erneute Passworteingabe verlangen, wenn das Passwort sichtbar ist</translation>
+ <translation>Keine erneute Passworteingabe verlangen, wenn das Passwort sichtbar ist.</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
@@ -313,15 +382,36 @@
</message>
<message>
<source>Hide entry notes by default</source>
- <translation>Eintragsnotizen standardmäßig verstecken</translation>
+ <translation>Eintrags-Notizen standardmäßig verstecken</translation>
</message>
<message>
<source>Privacy</source>
<translation>Datenschutz</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>DuckDuckGo als Ersatz für das Herunterladen von Website-Symbolen verwenden</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Nutze DuckDuckGo Service zum Herunterladen der Webseitensymbole</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Zwischenablage löschen nach ... Sekunden</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Touch ID-Inaktivitäts-Reset</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Dauer der Datenbanksperre in Sekunden</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Lösche die Suchabfrage danach</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>&amp;Benutzernamen kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Passwort kopieren</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Wählen Sie einen Eintrag für Auto-Type:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Suche…</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 hat Zugriff auf Passwörter für folgende Einträge angefordert.
Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Zugriff erlauben</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Zugriff ablehnen</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -443,7 +556,7 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
<translation>Du hast mehrere Datenbanken geöffnet.
-Bitte wähle die richtige Datenbank zum Speichern der Anmeldedaten.</translation>
+Bitte wähle die richtige Datenbank zum speichern der Anmeldedaten.</translation>
</message>
</context>
<context>
@@ -457,10 +570,6 @@ Bitte wähle die richtige Datenbank zum Speichern der Anmeldedaten.</translation
<translation>Dies ist notwendig, um mit KeePassXC-Browser auf Ihre Datenbank zuzugreifen</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>KeePassXC-Browser-Integration aktivieren</translation>
- </message>
- <message>
<source>General</source>
<translation>Allgemein</translation>
</message>
@@ -534,10 +643,6 @@ Bitte wähle die richtige Datenbank zum Speichern der Anmeldedaten.</translation
<translation>Niemals fragen, bevor Anmeldedaten a&amp;ktualisiert werden.</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Nur die ausgewählte Datenbank muss mit dem Client verbunden sein.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Suc&amp;he in allen geöffneten Datenbanken nach passenden Anmeldedaten</translation>
@@ -593,10 +698,6 @@ Bitte wähle die richtige Datenbank zum Speichern der Anmeldedaten.</translation
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Achtung&lt;/b&gt;, die KeePassXC-Proxy Anwendung wurde nicht gefunden!&lt;br /&gt;Bitte überprüfen Sie den KeePassXC-Ordner oder bestätigen Sie den benutzerdefinierten Ort in den erweiterten Einstellungen.&lt;br /&gt;Die Browseranbindung wird nicht funktionieren, wenn das Proxyprogramm nicht eingebunden ist.&lt;br /&gt;Vermuteter Pfad:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Ausführbare Dateien</translation>
</message>
@@ -621,6 +722,50 @@ Bitte wähle die richtige Datenbank zum Speichern der Anmeldedaten.</translation
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser wird für die Funktion der Browserintegration benötigt. &lt;br /&gt;Laden Sie es für %1 und %2. %3 herunter.</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Gibt abgelaufene Anmeldeinformationen zurück. String [expired] wird dem Titel hinzugefügt.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Erlaubt die Rückgabe abgelaufener Anmeldeinformationen</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Browserintegration aktivieren</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Browser, die als Snaps installiert sind, werden derzeit nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Alle Datenbanken, die mit der Erweiterung verbunden sind, geben übereinstimmende Anmeldeinformationen zurück.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Zeige kein Popup, das die Migration von älteren KeePassHTTP-Einstellungen vorschlägt.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Nicht zur Migration der KeePassHTTP-Einstellungen auffordern.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Benutzerdefiniertes Proxystandortfeld</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Browser für benutzerdefinierte Proxydatei</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Achtung&lt;/b&gt;, die keepassxc-proxy-Anwendung wurde nicht gefunden!&lt;br&gt;Bitte überprüfen Sie das KeePassXC Installationsverzeichnis oder bestätigen Sie den benutzerdefinierten Pfad in erweiterten Optionen.&lt;br&gt;Browser-Integration WIRD NICHT ohne die Proxy-Anwendung funktionieren.&lt;br&gt;Erwarteter Pfad: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -666,29 +811,29 @@ Möchten Sie diesen überschreiben?</translation>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation>Attribute werden in zusätzliche Eigenschaften umgewandelt...</translation>
+ <translation>Eigenschaften werden in Plugin-Daten umgewandelt...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation>KeePassXC: KeePassHTTP-Attribute wurden umgewandelt</translation>
+ <translation>KeepassXC: KeePassHTTP-Eigenschaften wurden umgewandelt</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation>%1 Einträge wurden erfolgreich umgewandelt
-%2 Schlüssel zu zusätzlichen Eigenschaften verschoben.</translation>
+ <translation>Eigenschaften von %1 Einträgen wurden erfolgreich umgewandelt.
+%2 Schlüssel zu Plugin-Daten verschoben.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>%1 Einträge wurden erfolgreich umgewandelt</numerusform><numerusform>%1 Einträge wurden erfolgreich umgewandelt</numerusform></translation>
+ <translation><numerusform>%n Schlüssel wurde erfolgreich zu Plugin-Daten verschoben.</numerusform><numerusform>%n Schlüssel wurden erfolgreich zu Plugin-Daten verschoben.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation>KeePassXC: Keine KeePassHTTP-Einträge gefunden</translation>
+ <translation>KeePassXC: Kein Eintrag mit KeePassHTTP-Eigenschaften gefunden!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation>Die aktive Datenbank enthält keinen Eintrag mit KeePassHTTP Einstellungen.</translation>
+ <translation>Die aktive Datenbank enthält keinen Eintrag mit KeePassHTTP-Eigenschaften.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Dies ist notwendig, um Ihre aktuellen Browserverbindungen aufrechtzuerhalten.
Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Diese Warnungen nicht mehr anzeigen</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
<translation>Erster Eintrag enthält Feldnamen</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Anzahl an zu überspringenden Kopfzeilen</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Verwende „\“ als Maskierungs-Zeichen</translation>
</message>
@@ -818,13 +963,29 @@ Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[zusätzlich %n Nachricht(en) übersprungen]</numerusform><numerusform>[zusätzlich %n Nachricht(en) übersprungen]</numerusform></translation>
+ <translation><numerusform>[%n weitere Nachricht übersprungen]</numerusform><numerusform>[%n weitere Nachrichten übersprungen]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
<translation>CSV-Import: Fehler beim Schreiben: %1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Textqualifizierung</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Feldtrennung</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Anzahl der zu verwerfenden Kopfzeilen</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV-Importvorschau</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -839,11 +1000,11 @@ Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n Byte(s)</numerusform><numerusform>%n Byte(s)</numerusform></translation>
+ <translation><numerusform>%n Byte</numerusform><numerusform>%n Bytes</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n Zeile(n)</numerusform><numerusform>%n Zeile(n)</numerusform></translation>
+ <translation><numerusform>%n Zeile</numerusform><numerusform>%n Zeilen</numerusform></translation>
</message>
</context>
<context>
@@ -866,10 +1027,6 @@ Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
<translation>Fehler beim Öffnen der Datenbank: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Speichern der Datenbank fehlgeschlagen, der Name fehlt</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Datei ist schreibgeschützt</translation>
</message>
@@ -877,6 +1034,28 @@ Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Schlüssel nicht umgewandelt. Dies ist ein Fehler, bitte melden Sie ihn den Entwicklern!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Sicherungsdatenbank bei %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Konnte nicht gespeichert werden, da die Datenbank nicht auf eine gültige Datei hinweist.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Konnte nicht gespeichert werden, da die Datenbank schreibgeschützt ist.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Die Datenbankdatei hat Änderungen die noch nicht gemergt wurden.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Papierkorb</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -888,30 +1067,14 @@ Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Master-Passwort eingeben</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Schlüsseldatei:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Passwort:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Durchsuchen</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Neu laden</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Challenge-Response</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Veraltetes Schlüsseldatei-Format</translation>
</message>
@@ -941,20 +1104,100 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl
<translation>Schlüsseldatei auswählen</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID zum schnellen Entsperren</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Fehler beim Öffnen der Schlüsseldatei: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Öffnen der Datenbank nicht möglich:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Slot auswählen...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Schlüsseldatei kann nicht geöffnet werden:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>KeePassXC Datenbank entsperren</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Passwort eingeben:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Passwortfeld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Passwort-Sichtbarkeit umschalten</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Geben Sie zusätzliche Anmeldeinformationen ein:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Schlüsseldateiauswahl</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardwareschlüssel-Slot-Auswahl</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Suchen nach Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Durchsuchen ...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Aktualisieren von Hardwaretoken</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Hardwareschlüssel:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Sie können einen Hardwaresicherheitsschlüssel wie &lt;strong&gt;YubiKey&lt;/strong&gt; oder &lt;strong&gt;OnlyKey&lt;/strong&gt; mit Slots, die für HMAC-SHA1 konfiguriert sind, verwenden.&lt;/p&gt;
+ &lt;p&gt;Klicken Sie hier, um weitere Informationen zu erhalten...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Hilfe zu Hardwareschlüssel</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID für Quick Unlock</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Löschen</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Schlüsseldatei löschen</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Datei auswählen …</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Entsperren fehlgeschlagen und kein Passwort angegeben</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Das Entsperren der Datenbank ist fehlgeschlagen und Sie haben kein Passwort eingegeben.
+Möchten Sie es stattdessen mit einem &quot;leeren&quot; Passwort versuchen?
+
+Um zu verhindern, dass dieser Fehler auftritt, müssen Sie zu &quot;Datenbankeinstellungen / Sicherheit&quot; gehen und Ihr Passwort zurücksetzen.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Wiederholen mit leerem Passwort</translation>
</message>
</context>
<context>
@@ -1007,7 +1250,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation>KeePassHTTP-Einstellungen zu KeePassXC-Browser übertragen.</translation>
+ <translation>KeePassHTTP-Eigenschaften zu KeePassXC-Browser-Plugin-Daten übertragen</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1089,7 +1332,7 @@ Zugriffserlaubnisse zu allen Einträgen werden gelöscht.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Zugriffsberechtigungen für %n Eintrag/Einträge erfolgreich gelöscht.</numerusform><numerusform>Zugriffsberechtigungen für %n Eintrag/Einträge erfolgreich gelöscht.</numerusform></translation>
+ <translation><numerusform>Berechtigungen aus %n Eintrag erfolgreich entfernt.</numerusform><numerusform>Berechtigungen aus %n Einträgen erfolgreich entfernt.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1101,13 +1344,21 @@ Zugriffserlaubnisse zu allen Einträgen werden gelöscht.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation>KeePassHTTP-Einstellungen zu KeePassXC-Browser übertragen.</translation>
+ <translation>KeePassHTTP-Eigenschaften zu Plugin-Daten übertragen</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
- <translation>Sollen alle Einstellungen der veralteten Browserintegrationn zur aktuellen Version migriert werden?
-Das ist nötig um das Browser-Plugin kompatibel zu halten.</translation>
+ <translation>Sollen alle Einstellungen der veralteten Browserintegration zur aktuellen Version migriert werden?
+Das ist nötig, um das Browser-Plugin kompatibel zu halten.</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Gespeicherte Browserschlüssel</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Entferne ausgewählte Schlüssel</translation>
</message>
</context>
<context>
@@ -1154,7 +1405,7 @@ Das ist nötig um das Browser-Plugin kompatibel zu halten.</translation>
</message>
<message>
<source>Change</source>
- <translation>Veränderunge</translation>
+ <translation>Ändern</translation>
</message>
<message>
<source>100 ms</source>
@@ -1239,7 +1490,7 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>Thread(s)</numerusform><numerusform>Thread(s)</numerusform></translation>
+ <translation><numerusform>Thread</numerusform><numerusform> Threads</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1251,6 +1502,57 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Vorhandene Entschlüsselungszeit ändern</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Entschlüsselungszeit in Sekunden</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Datenbankformat</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Verschlüsselungsalgorithmus</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Funktion zur Schlüsselableitung</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Transformationsrunden</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Speicherbelegung</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Parallelität</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Offengelegte Einträge</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Diese Datenbank nicht o&amp;ffenlegen</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Einträge &amp;unter dieser Gruppe offenlegen:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Aktivieren Sie den fd.o Secret Service, um auf diese Einstellungen zuzugreifen.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1284,7 +1586,7 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken
</message>
<message>
<source> MiB</source>
- <translation> MiB</translation>
+ <translation>MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1298,6 +1600,40 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken
<source>Enable &amp;compression (recommended)</source>
<translation>&amp;Kompression aktivieren (empfohlen)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Namensfeld der Datenbank</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Beschreibungsfeld der Datenbank</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Standardbenutzernamen-Feld</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Maximale Anzahl von Chronik-Elementen pro Eintrag</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Maximale Größe des Verlaufs pro Eintrag</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Papierkorb leeren</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Wollen Sie den aktuellen Papierkorb mit allen Inhalten leeren?
+Dieser Vorgang ist nicht umkehrbar!</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(alt)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1319,7 +1655,7 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken
</message>
<message>
<source>Last Signer</source>
- <translation>Letzte Unteschrift</translation>
+ <translation>Letzter Unterzeichner</translation>
</message>
<message>
<source>Certificates</source>
@@ -1365,6 +1701,10 @@ Soll tatsächlich ohne Passwort fortgefahren werden?</translation>
<source>Failed to change master key</source>
<translation>Ändern des Hauptschlüssels gescheitert</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Ohne Passwort fortsetzen</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1376,6 +1716,129 @@ Soll tatsächlich ohne Passwort fortgefahren werden?</translation>
<source>Description:</source>
<translation>Beschreibung:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Namensfeld der Datenbank</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Beschreibungsfeld der Datenbank</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statistiken</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Fahren Sie für weitere Informationen mit der Maus über die Zeilen mit Fehlersymbolen.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Wert</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Name der Datenbank</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Beschreibung</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Standort</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Zuletzt gespeichert</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Nicht gespeicherte Änderungen</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>ja</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>nein</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Die Datenbank wurde geändert, aber die Änderungen wurden noch nicht auf dem Datenträger gespeichert.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Anzahl der Gruppen</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Anzahl der Einträge</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Anzahl der abgelaufenen Einträge</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Die Datenbank enthält abgelaufene Einträge.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Eindeutige Passwörter</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Nicht eindeutige Kennwörter</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Mehr als 10 % der Kennwörter werden wiederverwendet. Verwenden Sie nach Möglichkeit eindeutige Kennwörter.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Maximale Wiederverwendung des Kennworts</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Einige Kennwörter werden mehr als dreimal verwendet. Verwenden Sie nach Möglichkeit eindeutige Kennwörter.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Anzahl der kurzen Kennwörter</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Empfohlene minimale Kennwortlänge beträgt mindestens 8 Zeichen.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Anzahl schwacher Kennwörter</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Empfehlen Sie die Verwendung langer, randomisierter Kennwörter mit der Bewertung &quot;gut&quot; oder &quot;hervorragend&quot;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Durchschnittliche Kennwortlänge</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 Zeichen</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Die durchschnittliche Kennwortlänge beträgt weniger als zehn Zeichen. Längere Kennwörter bieten mehr Sicherheit.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1426,10 +1889,6 @@ This is definitely a bug, please report it to the developers.</source>
Das ist definitiv ein Fehler, teile das bitte den Entwicklern mit.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Die Datenbankdatei existiert nicht oder ist nicht zugreifbar.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>CSV-Datei auswählen</translation>
</message>
@@ -1452,6 +1911,30 @@ Das ist definitiv ein Fehler, teile das bitte den Entwicklern mit.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Schreibgeschützt]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Fehler beim Öffnen von %1. Es ist entweder nicht vorhanden oder nicht zugänglich.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Datenbank in HTML-Datei exportieren</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML-Datei</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Fehler beim Schreiben der HTML-Datei.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Bestätigung exportieren</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Sie sind dabei, Ihre Datenbank in eine unverschlüsselte Datei zu exportieren. Dadurch bleiben Ihre Passwörter und sensiblen Informationen anfällig! Möchten Sie den Vorgang wirklich fortsetzen?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1469,7 +1952,7 @@ Das ist definitiv ein Fehler, teile das bitte den Entwicklern mit.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Möchten Sie wirklich %n Eintrag aus dem Papierkorb löschen?</numerusform><numerusform>Möchten Sie wirklich %n Einträge aus dem Papierkorb löschen?</numerusform></translation>
+ <translation><numerusform>Wollen Sie wirklich %n Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Wollen Sie wirklich %n Einträge in den Papierkorb verschieben?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1531,19 +2014,15 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Sollen tatsächlich %n Einträge gelöscht werden?</numerusform><numerusform>Sollen tatsächlich %n Einträge gelöscht werden?</numerusform></translation>
+ <translation><numerusform>Möchten Sie wirklich %n Eintrag für immer löschen?</numerusform><numerusform>Möchten Sie wirklich %n Einträge für immer löschen?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Eintrag/Einträge löschen?</numerusform><numerusform>Eintrag/Einträge löschen?</numerusform></translation>
+ <translation><numerusform>Eintrag löschen?</numerusform><numerusform>Einträge löschen?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Eintrag/Einträge in den Papierkorb verschieben?</numerusform><numerusform>Eintrag/Einträge in den Papierkorb verschieben?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Datei ist schreibgeschützt</translation>
+ <translation><numerusform>Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Einträge in den Papierkorb verschieben?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1587,12 +2066,6 @@ Disable safe saves and try again?</source>
Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Schreiben der Datenbank fehlgeschlagen.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Passwörter</translation>
</message>
@@ -1610,7 +2083,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>Eintrag &quot;%1&quot; hat %2 Referenz(en). Sollen die Referenzen mit den Werten überschrieben, der Eintrag überprungen oder trotzdem gelöscht werden?</numerusform><numerusform>Eintrag &quot;%1&quot; hat %2 Referenz(en). Sollen die Referenzen mit den Werten überschrieben, der Eintrag überprungen oder trotzdem gelöscht werden?</numerusform></translation>
+ <translation><numerusform>Eintrag &quot;%1&quot; hat %2 Referenz. Möchten Sie die Referenz mit einem Wert überschreiben, diesen Eintrag überspringen oder trotzdem löschen?</numerusform><numerusform>Eintrag &quot;%1&quot; hat %2 Referenzen. Möchten Sie die Referenzen mit Werten überschreiben, diesen Eintrag überspringen oder trotzdem löschen?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1636,6 +2109,14 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Shared group...</source>
<translation>Gemeinsame Gruppe...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Schreiben der Datenbank fehlgeschlagen: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Diese Datenbank wird im schreibgeschützten Modus geöffnet. Autosave ist deaktiviert.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1677,15 +2158,15 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>Select private key</source>
- <translation>Privatschlüssel auswählen</translation>
+ <translation>Privaten Schlüssel auswählen</translation>
</message>
<message>
<source>File too large to be a private key</source>
- <translation>Datei zu groß, um ein Privatschlüssel zu sein</translation>
+ <translation>Datei ist zu groß, um ein privater Schlüssel zu sein</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>Privatschlüssel konnte nicht geöffnet werden</translation>
+ <translation>Privater Schlüssel konnte nicht geöffnet werden</translation>
</message>
<message>
<source>Entry history</source>
@@ -1709,7 +2190,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>Sind Sie sicher, dass Sie dieses Attribut entfernen möchten?</translation>
+ <translation>Sind Sie sicher, dass Sie diese Eigenschaft entfernen möchten?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1721,7 +2202,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n Monat</numerusform><numerusform>%n Monate</numerusform></translation>
+ <translation><numerusform>%n Monat</numerusform><numerusform>%n Monaten</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1749,12 +2230,24 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n Jahre</numerusform><numerusform>%n Jahre</numerusform></translation>
+ <translation><numerusform>%n Jahr</numerusform><numerusform>%n Jahre</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Löschen bestätigen</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Browser-Integration</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;leere URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Möchten Sie diese URL wirklich entfernen?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1788,11 +2281,47 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>Foreground Color:</source>
- <translation>Textfarbe</translation>
+ <translation>Textfarbe:</translation>
</message>
<message>
<source>Background Color:</source>
- <translation>Hintergrundfarbe</translation>
+ <translation>Hintergrundfarbe:</translation>
+ </message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Eigenschaftsauswahl</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Eigenschaftswert</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Hinzufügen einer neuen Eigenschaft</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Ausgewählte Eigenschaft entfernen</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Namen der Eigenschaft bearbeiten</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Schutz der Eigenschaft umschalten</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Eine geschützte Eigenschaft anzeigen</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Auswahl der Vordergrundfarbe</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Auswahl der Hintergrundfarbe</translation>
</message>
</context>
<context>
@@ -1829,6 +2358,77 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Spezielle Auto-Type-Sequenz für dieses Fenster verwenden:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Benutzerdefinierte Auto-Type-Sequenz</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Auto-Type-Hilfe-Webseite öffnen</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Bestehende Fenster-Einstellungen</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Neue Fenster-Einstellung hinzufügen</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Ausgewählte Fenster-Einstellung entfernen</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Sie können einen Asterisk (*) benutzen, um die Auswahl auf alles auszuweiten</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Titel der Fenster-Einstellung festlegen</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Sie können einen Asterisk benutzen, um die Auswahl auf alles auszuweiten</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Benutzerdefinierte Auto-Type-Sequenz für dieses Fenster</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Diese Einstellungen beeinflussen das Verhalten des Eintrags mit der Browser-Erweiterung.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allgemein</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Auto-Submit für diesen Eintrag überspringen</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Diesen Eintrag vor der Browsererweiterung verstecken</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Zusätzliche URL&apos;s</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Hinzufügen</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Entfernen</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Bearbeiten</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1848,6 +2448,26 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Delete all</source>
<translation>Alle löschen</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Auswahl des Eintrags-Verlaufs</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Eintrag zum ausgewählten Verlaufszustand anzeigen</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Eintrag aus ausgewähltem Verlaufszustand wiederherstellen</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Ausgewählten Verlaufszustand löschen</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Lösche die gesamte Chronik</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1887,6 +2507,62 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Expires</source>
<translation>Verfällt</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>URL-Feld</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Lade Favicon für URL herunter</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Wiederhole Passwortfeld</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Passwortgenerator umschalten</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Passwortfeld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Passwort-Sichtbarkeit umschalten</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Notizen-Sichtbarkeit umschalten</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Ablaufdatums-Feld</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Ablaufdatums-Vorgaben</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Ablaufdatums-Vorgaben</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Notizen-Feld</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Titel-Feld</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Benutzernamen-Feld</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Ablaufdatum umschalten</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1932,11 +2608,11 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>Copy to clipboard</source>
- <translation>In Zwischenablage kopieren</translation>
+ <translation>In die Zwischenablage kopieren</translation>
</message>
<message>
<source>Private key</source>
- <translation>Privatschlüssel</translation>
+ <translation>Privater Schlüssel</translation>
</message>
<message>
<source>External file</source>
@@ -1963,6 +2639,22 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Verlange Benutzer-Bestätigung, wenn Schlüssel verwendet wird.</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Schlüssel von Agent nach angegebenen Sekunden entfernen</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Browser für die Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Externe Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Wähle Anhang</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1998,6 +2690,10 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Von der übergeordneten Gruppe (%1) erben</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Eintrag enthält nicht gespeicherte Änderungen</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2026,68 +2722,99 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<translation>Inaktiv</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Aus Pfad importieren</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare unbestätigter Container</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>In Pfad exportieren</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare bestätigter Container</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Mit Pfad synchronisieren</translation>
+ <source>Select import source</source>
+ <translation>Importquelle wählen</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Diese KeePassXC-Version unterstützt das gewählte Teilen nicht. Bitte benutze Version %1.</translation>
+ <source>Select export target</source>
+ <translation>Exportziel wählen</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Teilen der Datenbank deaktiviert</translation>
+ <source>Select import/export file</source>
+ <translation>Datei für Import/Export wählen</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Export der Datenbank deaktiviert</translation>
+ <source>Clear</source>
+ <translation>Löschen</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Import einer Datenbank deaktiviert</translation>
+ <source>Import</source>
+ <translation>Importieren</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare unbestätigter Container</translation>
+ <source>Export</source>
+ <translation>Export</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare bestätigter Container</translation>
+ <source>Synchronize</source>
+ <translation>Synchronisieren</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Importquelle wählen</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Ihre Version von KeePassXC unterstützt das Teilen dieses Containertyps nicht.
+Unterstützte Erweiterungen sind: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Exportziel wählen</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 wird bereits von dieser Datenbank exportiert.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Wähle Datei für Import/Export</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 wird bereits von dieser Datenbank importiert.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Löschen</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 wird von verschiedenen Gruppen in dieser Datenbank importiert und exportiert.</translation>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare is derzeit deaktiviert. Sie können den Import/Export in den Anwendungseinstellungen aktivieren.</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Der Export von Datenbanken ist in den Anwendungseinstellungen deaktiviert.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Der Import von Datenbanken ist in den Anwendungseinstellungen deaktiviert.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Freigabemodus-Feld</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Feld für Pfad der Freigabe-Datei</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Browser für Freigabe-Datei</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Passwortfeld</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Der Exportcontainer %1 wird bereits referenziert.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Passwort-Sichtbarkeit umschalten</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Der Importcontainer %1 ist bereits importiert.</translation>
+ <source>Toggle password generator</source>
+ <translation>Passwortgenerator umschalten</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Der Container %1 wird von unterschiedlichen Gruppen importiert und exportiert.</translation>
+ <source>Clear fields</source>
+ <translation>Felder leeren</translation>
</message>
</context>
<context>
@@ -2120,6 +2847,34 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Standard-Auto-Type-Se&amp;quenz setzen</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Namens-Feld</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Notiz-Feld</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Ablaufdatum umschalten</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Auto-Type umschalten hierfür und für Untergruppen</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Ablaufdatums-Feld</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Suche umschalten hierfür und für Untergruppen</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Standard-Auto-Type-Sequenz-Feld</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2156,28 +2911,16 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<translation>Alle Dateien</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Es gibt bereits ein eigenes Symbol </translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Löschen bestätigen</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Benutzerdefiniertes Symbol erfolgreich heruntergeladen</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Tipp: Sie können DuckDuckGo als Ersatz unter Werkzeuge&gt;Einstellungen&gt;Sicherheit aktivieren</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Bild(er) auswählen</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>%1 von %n Symbol(en) erfolgreiche heruntergeladen</numerusform><numerusform>%1 von %n Symbol(en) erfolgreiche heruntergeladen</numerusform></translation>
+ <translation><numerusform>Erfolgreich %1 von %n Symbol geladen</numerusform><numerusform>Erfolgreich %1 von %n Symbolen geladen</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2185,16 +2928,52 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n Symbol(e) gibt es bereits in der Datenbank</numerusform><numerusform>%n Symbol(e) gibt es bereits in der Datenbank</numerusform></translation>
+ <translation><numerusform>%n Symbol gibt es bereits in der Datenbank</numerusform><numerusform>%n Symbole gibt es bereits in der Datenbank</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>Das Laden der folgenden Symbole ist fehlgeschlagen:</numerusform><numerusform>Das Laden der folgenden Symbole ist fehlgeschlagen:</numerusform></translation>
+ <translation><numerusform>Das folgende Symbol ist fehlgeschlagen:</numerusform><numerusform>Die folgenden Symbole sind fehlgeschlagen:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Dieses Symbol wird von %n Eintrag benutzt und wird mit dem Standardsymbol ersetzt. Sind Sie sicher, dass es gelöscht werden soll?</numerusform><numerusform>Dieses Symbol wird von %n Einträgen benutzt und wird mit dem Standardsymbol ersetzt. Sind Sie sicher, dass es gelöscht werden soll?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Sie können den DuckDuckGo-Webseitensymbol-Dienst unter Werkzeuge -&gt; Einstellungen -&gt; Sicherheit aktivieren</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Lade Favicon für URL herunter</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Ausgewähltes Symbol auf Untergruppen und Einträge anwenden</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Symbol anwenden &amp;auf ...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Nur hierauf anwenden</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Auch auf Untergruppen anwenden</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Auch auf Untereinträge anwenden</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Auch auf alle Kinder anwenden</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Bestehendes Symbol ausgewählt.</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2240,6 +3019,30 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<source>Value</source>
<translation>Wert</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Erstellungs-Zeitpunkt</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Änderungs-Zeitpunkt</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Zugriffs-Zeitpunkt</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Einzigartige ID</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Plugin-Daten</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Ausgewählte Plugin-Daten entfernen</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2275,7 +3078,7 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
</message>
<message>
<source>Open</source>
- <translation>Offen</translation>
+ <translation>Öffnen</translation>
</message>
<message>
<source>Save</source>
@@ -2287,7 +3090,7 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Sind Sie sicher, dass Sie einen Anhang löschen möchten?</numerusform><numerusform>Sind Sie sicher, dass Sie %n Anhänge löschen möchten?</numerusform></translation>
+ <translation><numerusform>Sind Sie sicher, dass Sie %n Anhang löschen möchten?</numerusform><numerusform>Sind Sie sicher, dass Sie %n Anhänge löschen möchten?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2332,10 +3135,30 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Öffnen der Datei(en) nicht möglich:
-%1</numerusform><numerusform>Öffnen der Datei(en) nicht möglich:
+ <translation><numerusform>Datei kann nicht geöffnet werden:
+%1</numerusform><numerusform>Dateien können nicht geöffnet werden:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Anhänge</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Neuen Anhang hinzufügen</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Neuen Anhang enfernen</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Ausgewählten Anhang öffnen</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Ausgewählten Anhang auf Festplatte speichern</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2430,10 +3253,6 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>TOTP-Token generieren</translation>
- </message>
- <message>
<source>Close</source>
<translation>Schließen</translation>
</message>
@@ -2459,7 +3278,7 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
</message>
<message>
<source>Attributes</source>
- <translation>Attribute</translation>
+ <translation>Eigenschaften</translation>
</message>
<message>
<source>Attachments</source>
@@ -2518,6 +3337,14 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<source>Share</source>
<translation>Teilen</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Wert des aktuellen Einmalpassworts anzeigen (TOTP)</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Fortgeschritten</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2551,11 +3378,33 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Papierkorb</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Eintrag &quot;%1&quot; aus Datenbank &quot;%2&quot; wurde von %3 verwendet</translation>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Registration des DBus-Service auf %1 fehlgeschlagen: es läuft bereits ein anderer Secret Service.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n Eintrag wurde von %1 verwendet</numerusform><numerusform>%n Einträge wurden von %1 verwendet</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo Secret Service: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2574,6 +3423,59 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Favicons herunterladen</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Probleme beim Herunterladen der Symbole?
+Sie können den DuckDuckGo-Webseitensymbol-Service im Sicherheits-Abschnitt der Anwendungseinstellungen aktivieren.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Bitte warten Sie, die Einträge werden geladen...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Lade herunter...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Existiert bereits</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Download fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Lade Favicons (%1/%2) herunter...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2595,10 +3497,6 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<translation>Fehler beim Ausführen des Challenge-Response-Verfahrens</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Falscher Schlüssel oder die Datenbank ist beschädigt.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>fehlende Datenbank-Header</translation>
</message>
@@ -2618,6 +3516,12 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<source>Invalid header data length</source>
<translation>Ungültige Header-Datenlänge</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Ungültige Anmeldedaten wurden angegeben, bitte versuchen Sie es noch einmal.
+Falls dies wiederholt passiert, dann könnte Ihre Datenbank beschädigt sein.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2649,10 +3553,6 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<translation>Ungültige SHA256-Prüfsumme für Header</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Falscher Schlüssel oder Datei ist beschädigt (ungültiger HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Unbekannter Verschlüsselungsalgorithmus</translation>
</message>
@@ -2752,6 +3652,16 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Falsche Feldgröße für Variant-Map-Feldtyp</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Ungültige Anmeldedaten wurden angegeben, bitte versuchen Sie es noch einmal.
+Falls dies wiederholt passiert, dann könnte Ihre Datenbank beschädigt sein.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC nicht übereinstimmend)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2859,11 +3769,11 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann
</message>
<message>
<source>Missing custom data key or value</source>
- <translation>Fehlender benutzerdefinierter Datenschlüssel oder -wert</translation>
+ <translation>Fehlender Plugin-Daten-Schlüssel oder -wert</translation>
</message>
<message>
<source>Multiple group elements</source>
- <translation>Mehrere Gruppen-Elemente</translation>
+ <translation>Mehrere Gruppenelemente</translation>
</message>
<message>
<source>Null group uuid</source>
@@ -2915,7 +3825,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann
</message>
<message>
<source>Duplicate custom attribute found</source>
- <translation>Doppelte Benutzerattribut gefunden</translation>
+ <translation>Doppelte benutzerdefinierte Eigenschaft gefunden</translation>
</message>
<message>
<source>Entry string key or value missing</source>
@@ -2974,13 +3884,13 @@ Zeile %2, Spalte %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>KeePass 1 Datenbank importieren</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Öffnen der Datenbank ist nicht möglich.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importiere KeePass1-Datenbank</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3038,10 +3948,6 @@ Zeile %2, Spalte %3</translation>
<translation>Berechnung des Master-Passworts gescheitert</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Falscher Schlüssel oder die Datenbank ist beschädigt.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Schlüssel-Transformation fehlgeschlagen</translation>
</message>
@@ -3137,40 +4043,58 @@ Zeile %2, Spalte %3</translation>
<source>unable to seek to content position</source>
<translation>Kann nicht zur Inhaltsposition spulen</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Ungültige Anmeldedaten wurden angegeben, bitte versuchen Sie es noch einmal.
+Falls dies wiederholt passiert, dann könnte Ihre Datenbank beschädigt sein.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Deaktiviertes Teilen</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Ungültige Freigabe-Referenz</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Import von</translation>
+ <source>Inactive share %1</source>
+ <translation>Inaktive Freigabe %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Export nach</translation>
+ <source>Imported from %1</source>
+ <translation>Importiert aus %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchronisieren mit</translation>
+ <source>Exported to %1</source>
+ <translation>Exportiert nach %1</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Freigabe %1 deaktiviert</translation>
+ <source>Synchronized with %1</source>
+ <translation>Synchronisiert mit %1</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Von Freigabe %1 importieren</translation>
+ <source>Import is disabled in settings</source>
+ <translation>Der Import ist in den Einstellungen deaktiviert</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Zu Freigabe %1 exportieren</translation>
+ <source>Export is disabled in settings</source>
+ <translation>Der Export ist in den Einstellungen deaktiviert</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Mit Freigabe %1 synchronisieren</translation>
+ <source>Inactive share</source>
+ <translation>Inaktive Freigabe</translation>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation>Importiert von</translation>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation>Exportiert nach</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>Synchronisiert mit</translation>
</message>
</context>
<context>
@@ -3215,10 +4139,6 @@ Zeile %2, Spalte %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Durchsuchen</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generieren</translation>
</message>
@@ -3273,6 +4193,44 @@ Fehler: %2</translation>
<source>Select a key file</source>
<translation>Schlüsseldatei auswählen</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Schlüsseldateiauswahl</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Suchen nach Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Durchsuchen ...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Generiere eine neue Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Hinweis: Benutzen Sie keine veränderbare Datei, da dies die Entschlüsselung verhindern wird!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Ungültige Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Sie können nicht die aktuelle Datenbank als ihre eigene Schlüsseldatei wählen. Bitte wählen Sie eine andere Datei oder generieren Sie eine neue Schlüsseldatei.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Verdächtige Schlüsseldatei</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Die gewählte Schlüsseldatei sieht aus wie eine Passwort-Datenbank-Datei. Eine Schlüsseldatei muss eine statische Datei sein, die sich niemals ändert, sonst verlieren Sie für immer den Zugriff auf Ihre Datenbank.
+Wollen Sie wirklich mit dieser Datei fortfahren?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3361,12 +4319,8 @@ Fehler: %2</translation>
<translation>&amp;Einstellungen</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Passwortgenerator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation>Datenbank &amp;sperren</translation>
+ <translation>Datenbanken &amp;sperren</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -3414,7 +4368,7 @@ Fehler: %2</translation>
</message>
<message>
<source>Access error for config file %1</source>
- <translation>Zugriffsfehler für Konfigurations-Datei %1</translation>
+ <translation>Zugriffsfehler für die Konfigurationsdatei %1</translation>
</message>
<message>
<source>Settings</source>
@@ -3451,8 +4405,8 @@ Diese Version ist nicht für den Produktiveinsatz gedacht.</translation>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
- <translation>WARNUNG: Deine Qt-Version könnte KeePassXC mit einer Bildschirmtastatur zu abstürzen bringen!
-Wir empfehlen die Verwendung des verfügbaren App-Images auf unserer Downloadseite.</translation>
+ <translation>WARNUNG: Deine Qt Version könnte KeePassXC mit einer Bildschirmtastatur zu abstürzen bringen!
+Wir empfehlen dir die Verwendung des auf unserer Downloadseite verfügbaren AppImage.</translation>
</message>
<message>
<source>&amp;Import</source>
@@ -3508,7 +4462,7 @@ Wir empfehlen die Verwendung des verfügbaren App-Images auf unserer Downloadsei
</message>
<message>
<source>Change master &amp;key...</source>
- <translation>Hauptschlüssel ändern ...</translation>
+ <translation>Hauptschlüssel ändern...</translation>
</message>
<message>
<source>&amp;Database settings...</source>
@@ -3551,14 +4505,6 @@ Wir empfehlen die Verwendung des verfügbaren App-Images auf unserer Downloadsei
<translation>TOTP QR-Code anzeigen...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Suche nach Updates…</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Eintrag teilen</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>WARNUNG: Sie verwenden eine Vorabversion von KeePassXC!
@@ -3576,6 +4522,74 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<source>You can always check for updates manually from the application menu.</source>
<translation>Es kann auch immer manuell im Menü nach Updates gesucht werden.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Export</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Suche nach Aktualisierungen...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>&amp;Alle Favicons herunterladen</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Sortiere &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Sortiere &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Passwortgenerator</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Favicon herunterladen</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Exportiere in HTML-Datei...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password-Tresor...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importiere einen 1Password-Tresor</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Erste Schritte</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>PDF-Anleitung für Erste Schritte öffnen</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>&amp;Onlinehilfe...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Besuche Online-Dokumentation (öffnet Browser)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>&amp;Benutzerhandbuch</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Öffne PDF des Benutzerhandbuchs</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Tastenkombinationen</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3635,6 +4649,14 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<source>Adding missing icon %1</source>
<translation>Fehlendes Symbol hinzufügen %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Plugin-Daten %1 entfernt [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Plugin-Daten %1 werden hinzugefügt [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3675,7 +4697,7 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<name>NewDatabaseWizardPageEncryption</name>
<message>
<source>Encryption Settings</source>
- <translation>Verschlüsselungseinstellung</translation>
+ <translation>Verschlüsselungseinstellungen</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
@@ -3705,6 +4727,73 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>Ungültiges OpData01, enthält keinen Header</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Konnte nicht alle IV-Bytes lesen, wollte 16, aber bekam %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Kann Cipher für opdata01 nicht initialisieren: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Kann nicht alle HMAC-Signatur-Bytes lesen</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>Fehlerhaftes OpData01 aufgrund von fehlgeschlagenem HMAC</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Kann clearText nicht direkt verarbeiten</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>%1 Bytes Klartext erwartet, %2 gefunden</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Gelesene Datenbank ergab keine Instanz
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Ordner .opvault muss existieren</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>Ordner .opvault muss lesbar sein</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Ordner .opvault/default muss existieren</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Ordner .opvault/default muss lesbar sein</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>MasterKey: %1 konnte nicht entschlüsselt werden</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>MasterKey: %1 konnte nicht abgeleitet werden</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3736,11 +4825,11 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation>Korrupte Schlüsseldatei, Lesen des Privatschlüssels fehlgeschlagen</translation>
+ <translation>Korrupte Schlüsseldatei, Lesen des Privaten Schlüssels fehlgeschlagen</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation>Keine Privatschlüssel-Nutzdaten zum Entschlüsseln</translation>
+ <translation>Keine private Schlüsselsignatur zum Entschlüsseln</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
@@ -3760,11 +4849,11 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation>Unerwartetes EOF beim Lesen des öffentlichen Schlüssels</translation>
+ <translation>Unerwartetes Dateiende beim Lesen des öffentlichen Schlüssels</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation>Unerwartetes EOF beim Lesen des Privatschlüssels</translation>
+ <translation>Unerwartetes Dateiende beim Lesen des privaten Schlüssels</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
@@ -3772,15 +4861,15 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation>Unerwartetes EOF beim Schreiben des öffentlichen Schlüssels</translation>
+ <translation>Unerwartetes Dateiende beim Schreiben des öffentlichen Schlüssels</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
- <translation>Privatschlüssel konnte nicht geschrieben werden, da er leer ist</translation>
+ <translation>Privater Schlüssel kann nicht geschrieben werden, da er leer ist</translation>
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation>Unerwartetes EOF beim Schreiben des Privatschlüssels</translation>
+ <translation>Unerwartetes Dateiende beim Schreiben des privaten Schlüssels</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
@@ -3804,6 +4893,17 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Passwörter stimmen nicht überein</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Passwörter stimmen überein</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3819,7 +4919,7 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ein Passwort ist die primäre Methode, Ihre Datenbank abzusichern.&lt;/p&gt;&lt;p&gt;Gute Passwörter sind lang und einzigartig. KeePassXC kann eins für Sie generieren.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ein Passwort ist die primäre Methode, Ihre Datenbank abzusichern.&lt;/p&gt;&lt;p&gt;Gute Passwörter sind lang und einzigartig. KeepassXC kann eins für Sie generieren.&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
@@ -3829,6 +4929,22 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<source>Generate master password</source>
<translation>Masterpasswort erzeugen.</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Passwortfeld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Passwort-Sichtbarkeit umschalten</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Wiederhole Passwortfeld</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Passwortgenerator umschalten</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3858,22 +4974,10 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<translation>Zeichenarten</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Großbuchstaben</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Kleinbuchstaben</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Zahlen</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Sonderzeichen</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Erweitertes ASCII</translation>
</message>
@@ -3954,18 +5058,10 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<translation>Fortgeschritten</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Großbuchstaben A bis F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Kleinbuchstaben a bis f</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3998,18 +5094,10 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<translation>&quot;&apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Mathematik</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Striche</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4057,6 +5145,74 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<source>Regenerate</source>
<translation>Neu erzeugen</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Generiertes Passwort</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Großbuchstaben</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Kleinbuchstaben</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Sonderzeichen</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Mathematische Symbole</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Bindezeichen und Schrägstriche</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Ausgenommene Zeichen</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Hexadezimale Passwörter</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Passwortlänge</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Groß-/Kleinschreibung:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Erzeuge Passwort erneut</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Passwort kopieren</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Akzeptiere Passwort</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>kleinbuchstaben</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>GROẞBUCHSTABEN</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Anfangsbuchstaben Groß</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Passwort-Sichtbarkeit umschalten</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4064,12 +5220,9 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Auswählen</translation>
+ <source>Statistics</source>
+ <translation>Statistiken</translation>
</message>
</context>
<context>
@@ -4106,6 +5259,10 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<source>Merge</source>
<translation>Zusammenführen</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Fortsetzen</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4198,10 +5355,6 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<translation>Passwort für den Eintrag generieren.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Länge des generierten Passworts.</translation>
- </message>
- <message>
<source>length</source>
<translation>Länge</translation>
</message>
@@ -4251,18 +5404,6 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
<translation>Fortgeschrittene Analyse des Passworts ausführen.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Inhalt der Datenbank extrahieren und anzeigen.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Pfad der zu extrahierenden Datenbank.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Passwort eingeben, um %1 zu entsperren:</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4306,10 +5447,6 @@ Verfügbare Kommandos:
<translation>Zwei Datenbanken zusammenführen</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Pfad der Datenbank, in die zusammengeführt werden soll.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Pfad der Datenbank aus der zusammengeführt werden soll.</translation>
</message>
@@ -4327,11 +5464,11 @@ Verfügbare Kommandos:
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
- <translation>Namen der anzuzeigenden Attribute. Diese Option kann mehr als einmal angegeben werden, wobei jedes Attribut in einer eigenen Zeile in der gegebenen Reihenfolge angegeben wird. Wenn keine Attribute angegeben sind, wird eine Zusammenfassung der Standardattribute gegeben.</translation>
+ <translation>Namen der anzuzeigenden Eigenschaften. Diese Option kann mehr als einmal angegeben werden, wobei jede Eigenschaft in einer eigenen Zeile in der gegebenen Reihenfolge angegeben wird. Wenn keine Eigenschaften angegeben sind, wird eine Zusammenfassung der Standardeigenschaften gegeben.</translation>
</message>
<message>
<source>attribute</source>
- <translation>Attribute</translation>
+ <translation>Eigenschaft</translation>
</message>
<message>
<source>Name of the entry to show.</source>
@@ -4386,10 +5523,6 @@ Verfügbare Kommandos:
<translation>Browser-Integration</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Challenge-Response - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Aktiver Button</translation>
</message>
@@ -4420,10 +5553,6 @@ Verfügbare Kommandos:
<translation>Neues zufälliges Passwort erzeugen.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Ungültiger Wert für Passwortlänge %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Eintrag mit dem Pfad %1 kann nicht erstellt werden.</translation>
</message>
@@ -4465,7 +5594,7 @@ Verfügbare Kommandos:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Zwischenablage wird in %1 Sekunde(n) geleert…</numerusform><numerusform>Zwischenablage wird in %1 Sekunde(n) geleert…</numerusform></translation>
+ <translation><numerusform>Löschen der Zwischenablage in %1 Sekunde...</numerusform><numerusform>Löschen der Zwischenablage in %1 Sekunden...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4481,10 +5610,6 @@ Verfügbare Kommandos:
<translation>Anzahl</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Ungültiger Wert für Passwortlänge: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Eintrag mit dem Pfad %1 nicht gefunden.</translation>
</message>
@@ -4609,26 +5734,6 @@ Verfügbare Kommandos:
<translation>Schlüsseldatei %1 konnte nicht geladen werden: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Datei %1 existiert nicht.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Öffnen der Datei %1 nicht möglich.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Fehler beim Öffnen der Datenbank:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Fehler beim Lesen der Datenbank:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Länge des erzeugten Passworts</translation>
</message>
@@ -4641,10 +5746,6 @@ Verfügbare Kommandos:
<translation>Großbuchstaben verwenden</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Ziffern verwenden.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Sonderzeichen verwenden</translation>
</message>
@@ -4692,7 +5793,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation>Eintrag %1 erfolgreich in Papierkorb verschoben</translation>
+ <translation>Eintrag %1 erfolgreich in Papierkorb verschoben.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
@@ -4704,7 +5805,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
- <translation>FEHLER: Unbekanntes Attribute %1</translation>
+ <translation>FEHLER: Unbekannte Eigenschaft %1.</translation>
</message>
<message>
<source>No program defined for clipboard manipulation</source>
@@ -4789,10 +5890,6 @@ Verfügbare Kommandos:
<translation>Datenbank erfolgreiche erstellt.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Passwort zur Datenbankverschlüsselung eingeben (Enter drücken, um es leer zu lassen):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Schlüsseldatei %1 konnte nicht erstellt werden: %2</translation>
</message>
@@ -4801,10 +5898,6 @@ Verfügbare Kommandos:
<translation>Schlüsseldatei %1 konnte geladen werden: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Eintrag aus der Datenbank entfernen</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Pfad des zu entfernenden Eintrags.</translation>
</message>
@@ -4860,6 +5953,330 @@ Verfügbare Kommandos:
<source>Cannot create new group</source>
<translation>Neue Gruppe kann nicht erstellt werden</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Passwort-Schlüssel für die Datenbank deaktivieren.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Zeigt Informationen zur Fehlerbehebung an.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Passwort-Schlüssel für die Quell-Datenbank der Zusammenführung deaktivieren.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Version %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Build Typ: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revision: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribution: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Diagnosemodus ist deaktiviert.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Diagnosemodus ist aktiviert.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Betriebssystem: %1
+CPU-Architektur: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Auto-Type</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (bestätigtes und unbestätigtes Teilen)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (nur bestätigtes Teilen)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (nur unbestätigtes Teilen)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Keine</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Aktivierte Erweiterungen:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Kryptographische Bibliotheken:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Kann nicht Passwort und Meldung gleichzeitig generieren!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Fügt der Datenbank eine neue Gruppe hinzu.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Pfad der hinzuzufügenden Gruppe.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Gruppe %1 existiert bereits!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Gruppe %1 nicht gefunden.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Gruppe %1 erfolgreich hinzugefügt.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Überprüfen, ob irgenwelche Passwörter in öffentlichen Datenlecks vorkommen. FILENAME muss der der Pfad der Datei sein, die SHA-1-Hashes der Passwörter im HIBP-Format enthält, wie zu finden unter https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>DATEINAME</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Passw‭örter auf Schwächen und Probleme prüfen.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>HIBP-Datei %1 konnte nicht geöffnet werden: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Werte Datenbank-Einträge gegen HIBP-Datei aus, dies wird eine Weile dauern...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Die aktuell geöffnete Datenbank schließen.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Diese Hilfe anzeigen.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Yubikey-Slot. der für die Verschlüsselung der Datenbank verwendet wird.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>Slot</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Ungültige Wortanzahl %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>Die Wortliste ist zu kurz (&lt; 1000 Einträge)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Verlasse interaktiven Modus.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Zu benutzendes Format für den Export. Mögliche Optionen sind xml oder csv. Standard ist xml.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Exportiert den Inhalt einer Datenbank in die Standardausgabe im angegebenen Format.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Fehler beim Exportieren der Datenbank nach XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Nicht unterstütztes Format %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Benutze Zahlen</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Ungültige Passwortlänge %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Hilfe zu diesem Befehl anzeigen.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Verfügbare Befehle:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Die Inhalte einer XML-Datenbank importieren.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Pfad des XML-Datenbank-Exports.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Pfad zur neuen Datenbank.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Fehler beim Importieren des XML-Datenbank-Exports %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Datenbank erfolgreich importiert.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Unbekannter Befehl %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Wandelt Ausgabe in einzelne Zeilen um.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Nur die bei der Zusammenführung erkannten Änderungen ausgeben.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Yubikey-Slot für die zweite Datenbank.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>Erfolgreich %1 nach %2 zusammengeführt.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Datenbank wurde beim Zusammenführen nicht geändert.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Verschiebt einen Eintrag in eine neue Gruppe.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Pfad des zu verschiebenden Eintrags.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Pfad der Zielgruppe.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Konnte keine Gruppe mit Pfad %1 finden.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>Eintrag ist bereits in Gruppe %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Erfolgreich Eintrag %1 in Gruppe %2 verschoben.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Eine Datenbank öffnen.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Pfad der zu entfernenden Gruppe.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Kann Root-Gruppe nicht aus Datenbank entfernen.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Gruppe %1 erfolgreich in Papierkorb verschoben.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Gruppe %1 erfolgreich gelöscht.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Fehler beim Öffnen der Datenbank-Datei %1: nicht gefunden</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Fehler beim Öffnen der Datenbank-Datei %1: keine normale Datei</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Fehler beim Öffnen der Datenbank-Datei %1: nicht lesbar</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Passwort eingeben, um %1 zu entsperren:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Ungültiger YubiKey-Slot %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Bitte berühren Sie den Knopf auf Ihrem YubiKey, um %1 zu entsperren</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Passwort eingeben, um Datenbank zu verschlüsseln (optional):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>HIBP-Datei, Zeile %1: Parse-Fehler</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Secret-Service-Integration</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Benutzername</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Challenge-Response - Slot %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Passwort für &apos;%1&apos; wurde %2 Mal in Datenlecks gefunden!</numerusform><numerusform>Passwort für &apos;%1&apos; wurde %2 Mal in Datenlecks gefunden!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Ungültiger Passwortgenerator nach Anwendung aller Optionen</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5014,6 +6431,93 @@ Verfügbare Kommandos:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Optionen</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>KeepassXC-Freedesktop.org-Secret-Service-Integration aktivieren</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allgemein</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Benachrichtigung anzeigen, wenn Anmeldedaten angefragt werden</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wenn der Papierkorb für diese Datenbank aktiviert ist, werden Einträge direkt in den Papierkorb verschoben. Ansonsten werden sie ohne Nachfragen gelöscht.&lt;/p&gt;&lt;p&gt;Sie erhalten eine Meldung, wenn irgendwelche Einträge von anderen referenziert werden.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Nicht bestätigen, wenn Einträge von Clients gelöscht werden.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Offengelegte Datenbankgruppen:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Gruppe</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Verwalten</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Authorisierung</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Diese Anwendungen sind derzeit verbunden:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Anwendung</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Trennen</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Datenbank-Einstellungen</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Datenbank-Einstellungen editieren</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Datenbank entsperren</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Datenbank entsperren, um mehr Informationen anzuzeigen</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Datenbank sperren</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Entsperren, um anzuzeigen</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Keine</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5041,7 +6545,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Signer</source>
- <translation>Unterzeichner:</translation>
+ <translation>Unterzeichner</translation>
</message>
<message>
<source>Key:</source>
@@ -5136,9 +6640,100 @@ Verfügbare Kommandos:
<source>Signer:</source>
<translation>Unterzeichner:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Erlaube KeeShare-Importe</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Erlaube KeeShare-Exporte</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Nur Warnungen und Fehler anzeigen</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Schlüssel</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Unterzeichner-Namens-Feld</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Neues Zertifikat generieren</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Existierendes Zertifikat importieren</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Eigenes Zertifikat exportieren</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Bekannte Freigaben</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Ausgewähltem Zertifikat vertrauen</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Jedes Mal nach Vertrauen für dieses Zertifikat fragen</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Ausgewähltem Zertifikat nicht vertrauen</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Ausgewähltes Zertifikat entfernen</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Überschreiben von signierten geteilten Containern nicht unterstützt - Export verhindert</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Export-Container (%1) kann nicht gespeichert werden</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Signatur konnte nicht eingebunden werden: Zum Schreiben konnte die Datei (%1) nicht geöffnet werden </translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Signatur konnte nicht eingebunden werden: Datei konnte nicht geschrieben werden (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Datenbank konnte nicht eingebunden werden: Zum Schreiben konnte die Datei (%1) nicht geöffnet werden </translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Datenbank konnte nicht eingebunden werden: Datei konnte nicht geschrieben werden (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Überschreiben von nicht signierten geteilten Containern nicht unterstützt - Export verhindert</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Export-Container kann nicht gespeichert werden</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Unerwarteter Fehler ist aufgetreten</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Von Container ohne Signatur importieren</translation>
@@ -5152,12 +6747,16 @@ Verfügbare Kommandos:
<translation>Von Container mit Zertifikat importieren</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Möchten Sie %1 mit dem Fingerabdruck %2 von %3 vertrauen? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Nicht diesmal</translation>
</message>
<message>
<source>Never</source>
- <translation>Niemals</translation>
+ <translation>Nie</translation>
</message>
<message>
<source>Always</source>
@@ -5168,24 +6767,12 @@ Verfügbare Kommandos:
<translation>Nur diesmal</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Import von %1 fehlgeschlagen (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Import von %1 erfolgreich (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importiert aus %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Unterzeichnete geteilte Container werden nicht unterstützt - Import verhindert</translation>
</message>
<message>
<source>File is not readable</source>
- <translation>Datei ist nicht lesbar.</translation>
+ <translation>Datei ist nicht lesbar</translation>
</message>
<message>
<source>Invalid sharing container</source>
@@ -5205,11 +6792,11 @@ Verfügbare Kommandos:
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation>Nicht unterzeichnete geteilte Container werden nicht unterstützt - Import verhindert</translation>
+ <translation>Nicht signierte geteilte Container werden nicht unterstützt - Import verhindert</translation>
</message>
<message>
<source>Successful unsigned import</source>
- <translation>Erfolgreich unterzeichneter Import</translation>
+ <translation>Erfolgreich signierter Import</translation>
</message>
<message>
<source>File does not exist</source>
@@ -5219,25 +6806,20 @@ Verfügbare Kommandos:
<source>Unknown share container type</source>
<translation>Unbekannter geteilter Containertyp</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Überschreiben von unterzeichneten geteilten Containern nicht unterstützt - Export verhindert</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Export-Container (%1) kann nicht gespeichert werden</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Überschreiben von nicht unterzeichneten geteilten Containern nicht unterstützt - Export verhindert</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import von %1 fehlgeschlagen (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Export-Container kann nicht gespeichert werden</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import von %1 erfolgreich (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Unerwarteter Fehler ist aufgetreten</translation>
+ <source>Imported from %1</source>
+ <translation>Importiert aus %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5252,10 +6834,6 @@ Verfügbare Kommandos:
<translation>Export nach %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Möchten Sie %1 mit dem Fingerabdruck %2 von %3 vertrauen? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Multipler Import-Quellpfad zu %1 in %2</translation>
</message>
@@ -5263,22 +6841,6 @@ Verfügbare Kommandos:
<source>Conflicting export target path %1 in %2</source>
<translation>Konflikt beim Export-Zielpfad %1 in %2 </translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Signatur konnte nicht eingebunden werden: Zum Schreiben konnte die Datei (%1) nicht geöffnet werden </translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Signatur konnte nicht eingebunden werden: Datei konnte nicht geschrieben werden (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Datenbank konnte nicht eingebunden werden: Zum Schreiben konnte die Datei (%1) nicht geöffnet werden </translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Datenbank konnte nicht eingebunden werden: Datei konnte nicht geschrieben werden (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5296,7 +6858,7 @@ Verfügbare Kommandos:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Läuft in &lt;b&gt;%n&lt;/b&gt; Sekunde(n) ab</numerusform><numerusform>Läuft in &lt;b&gt;%n&lt;/b&gt; Sekunde(n) ab</numerusform></translation>
+ <translation><numerusform>Verfällt in &lt;b&gt;%n&lt;/b&gt; Sekunde</numerusform><numerusform>Verfällt in &lt;b&gt;%n&lt;/b&gt; Sekunden</numerusform></translation>
</message>
</context>
<context>
@@ -5326,10 +6888,6 @@ Verfügbare Kommandos:
<translation>TOTP einrichten</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Schlüssel:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>RFC 6238-Token-Standardeinstellungen</translation>
</message>
@@ -5359,16 +6917,45 @@ Verfügbare Kommandos:
<translation>Code-Länge:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 Ziffern</translation>
+ <source>Secret Key:</source>
+ <translation>Geheimer Schlüssel:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>Der geheime Schlüssel muss im Base32-Format vorliegen.</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Feld für geheimen Schlüssel</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algorithmus:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Zeitschritt-Feld</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 Nummern</translation>
+ <source> digits</source>
+ <translation>Ziffern</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 Ziffern</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>Ungültiges Einmalpasswort (TOTP)</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Sie haben einen ungültigen geheimen Schlüssel angegeben. Der Schlüssel muss im Base32-Format sein. Beispiel: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Bestätigen Sie die Löschung der TOTP-Einstellungen</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Möchten Sie die TOTP-Einstellungen für diesen Eintrag wirklich löschen?</translation>
</message>
</context>
<context>
@@ -5415,7 +7002,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation>Version aktuell</translation>
+ <translation>Version aktuel</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
@@ -5452,6 +7039,14 @@ Verfügbare Kommandos:
<source>Welcome to KeePassXC %1</source>
<translation>Willkommen in KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Von 1Password importieren</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Kürzlich verwendete Datenbank öffnen</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5475,5 +7070,13 @@ Verfügbare Kommandos:
<source>No YubiKey inserted.</source>
<translation>Kein YubiKey angeschlossen.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Aktualisieren von Hardwaretoken</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardwareschlüssel-Slot-Auswahl</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts
index 3579db200..d63560972 100644
--- a/share/translations/keepassx_en.ts
+++ b/share/translations/keepassx_en.ts
@@ -97,6 +97,14 @@
<source>Follow style</source>
<translation>Follow style</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -153,10 +161,6 @@
<translation>Use group icon on entry creation</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimize when copying to clipboard</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Hide the entry preview panel</translation>
</message>
@@ -253,6 +257,67 @@
<source>(restart program to activate)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation type="unfinished"> sec</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
@@ -329,6 +394,27 @@
<source>Use DuckDuckGo service to download website icons</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation type="unfinished"> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>AutoType</name>
@@ -396,6 +482,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation type="unfinished">Copy &amp;username</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation type="unfinished">Copy &amp;password</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -405,6 +502,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Select entry to Auto-Type:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -430,6 +531,14 @@ Please select whether you want to allow access.</source>
<translation>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -463,10 +572,6 @@ Please select the correct database for saving credentials.</translation>
<translation>This is required for accessing your databases with KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Enable KeepassXC browser integration</translation>
- </message>
- <message>
<source>General</source>
<translation>General</translation>
</message>
@@ -540,10 +645,6 @@ Please select the correct database for saving credentials.</translation>
<translation>Never ask before &amp;updating credentials</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Only the selected database has to be connected with a client.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Searc&amp;h in all opened databases for matching credentials</translation>
@@ -599,10 +700,6 @@ Please select the correct database for saving credentials.</translation>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Executable Files</translation>
</message>
@@ -639,6 +736,38 @@ Please select the correct database for saving credentials.</translation>
<source>&amp;Allow returning expired credentials.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -647,16 +776,6 @@ Please select the correct database for saving credentials.</translation>
<translation>KeePassXC: New key association request</translation>
</message>
<message>
- <source>You have received an association request for the above key.
-
-If you would like to allow it access to your KeePassXC database,
-give it a unique name to identify and accept it.</source>
- <translation>You have received an association request for the above key.
-
-If you would like to allow it access to your KeePassXC database,
-give it a unique name to identify and accept it.</translation>
- </message>
- <message>
<source>Save and allow access</source>
<translation>Save and allow access</translation>
</message>
@@ -731,6 +850,18 @@ This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation type="unfinished">Don&apos;t show this warning again</translation>
+ </message>
+ <message>
+ <source>You have received an association request for the following database:
+%1
+
+Give the connection a unique name or ID, for example:
+chrome-laptop.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -790,10 +921,6 @@ Would you like to migrate your existing settings now?</source>
<translation>First record has field names</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Number of headers line to discard</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Consider &apos;\&apos; an escape character</translation>
</message>
@@ -846,6 +973,22 @@ Would you like to migrate your existing settings now?</source>
<translation>CSV import: writer has errors:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -896,10 +1039,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Error while reading the database: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Could not save, database has no file name.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>File cannot be written as it is opened in read-only mode.</translation>
</message>
@@ -912,6 +1051,22 @@ Would you like to migrate your existing settings now?</source>
Backup database located at %2</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation type="unfinished">Recycle Bin</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -923,30 +1078,14 @@ Backup database located at %2</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Enter master key</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Key File:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Password:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Browse</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Refresh</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Challenge Response:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Legacy key file format</translation>
</message>
@@ -977,10 +1116,6 @@ Please consider generating a new key file.</translation>
<translation>Select key file</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID for quick unlock</translation>
- </message>
- <message>
<source>Failed to open key file: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -988,6 +1123,90 @@ Please consider generating a new key file.</translation>
<source>Select slot...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation type="unfinished">Browse...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Clear</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseSettingWidgetMetaData</name>
@@ -1147,6 +1366,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1301,6 +1528,57 @@ If you keep this number, your database may be too easy to crack!</translation>
<numerusform>%1 s</numerusform>
</translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1348,6 +1626,39 @@ If you keep this number, your database may be too easy to crack!</translation>
<source>Enable &amp;compression (recommended)</source>
<translation>Enable &amp;compression (recommended)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1415,6 +1726,10 @@ Are you sure you want to continue without a password?</translation>
<source>Failed to change master key</source>
<translation>Failed to change master key</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1426,6 +1741,129 @@ Are you sure you want to continue without a password?</translation>
<source>Description:</source>
<translation>Description:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Name</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Value</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1502,6 +1940,26 @@ This is definitely a bug, please report it to the developers.</translation>
<source>Failed to open %1. It either does not exist or is not accessible.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1604,10 +2062,6 @@ Do you want to merge your changes?</translation>
</translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>File opened in read only mode.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Lock Database?</translation>
</message>
@@ -1698,6 +2152,10 @@ Disable safe saves and try again?</translation>
<source>Writing the database failed: %1</source>
<translation type="unfinished">Writing the database failed: %1</translation>
</message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1826,6 +2284,18 @@ Disable safe saves and try again?</translation>
<source>Confirm Removal</source>
<translation>Confirm Removal</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation type="unfinished">Browser Integration</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1865,6 +2335,42 @@ Disable safe saves and try again?</translation>
<source>Background Color:</source>
<translation>Background Color:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1901,11 +2407,74 @@ Disable safe saves and try again?</translation>
<translation>Use a specific sequence for this association:</translation>
</message>
<message>
- <source>Open AutoType help webpage</source>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>AutoType help button</source>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">General</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished">Add</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished">Remove</translation>
+ </message>
+ <message>
+ <source>Edit</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1927,6 +2496,26 @@ Disable safe saves and try again?</translation>
<source>Delete all</source>
<translation>Delete all</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1966,6 +2555,62 @@ Disable safe saves and try again?</translation>
<source>Expires</source>
<translation>Expires</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -2042,6 +2687,22 @@ Disable safe saves and try again?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Require user confirmation when this key is used</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -2174,6 +2835,34 @@ Supported extensions are: %1.</source>
<source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@@ -2205,6 +2894,34 @@ Supported extensions are: %1.</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Set default Auto-Type se&amp;quence</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2241,18 +2958,10 @@ Supported extensions are: %1.</source>
<translation>All files</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Custom icon already exists</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirm Delete</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Custom icon successfully downloaded</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Select Image(s)</translation>
</message>
@@ -2292,6 +3001,38 @@ Supported extensions are: %1.</source>
<source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2337,6 +3078,30 @@ This may cause the affected plugins to malfunction.</translation>
<source>Value</source>
<translation>Value</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2439,6 +3204,26 @@ This may cause the affected plugins to malfunction.</translation>
%1</numerusform>
</translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation type="unfinished">Attachments</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2533,10 +3318,6 @@ This may cause the affected plugins to malfunction.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generate TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>Close</translation>
</message>
@@ -2621,6 +3402,14 @@ This may cause the affected plugins to malfunction.</translation>
<source>Share</source>
<translation>Share</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation type="unfinished">Advanced</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2654,11 +3443,36 @@ This may cause the affected plugins to malfunction.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Recycle Bin</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2677,6 +3491,58 @@ This may cause the affected plugins to malfunction.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancel</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">Close</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation type="unfinished">URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished">Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -3083,13 +3949,13 @@ Line %2, column %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Import KeePass1 database</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Unable to open the database.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3337,10 +4203,6 @@ If this reoccurs, then your database file may be corrupt.</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Browse</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generate</translation>
</message>
@@ -3396,6 +4258,43 @@ Message: %2</translation>
<source>Select a key file</source>
<translation>Select a key file</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation type="unfinished">Browse...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3484,10 +4383,6 @@ Message: %2</translation>
<translation>&amp;Settings</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Password Generator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Lock databases</translation>
</message>
@@ -3674,14 +4569,6 @@ We recommend you use the AppImage available on our downloads page.</translation>
<translation>Show TOTP QR Code...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Check for Updates...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Share entry</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOTE: You are using a pre-release version of KeePassXC!
@@ -3699,6 +4586,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>You can always check for updates manually from the application menu.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation type="unfinished">Download favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3836,6 +4791,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3935,6 +4956,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3960,6 +4992,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Generate master password</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3989,22 +5037,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Character Types</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Upper Case Letters</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Lower Case Letters</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Numbers</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Special Characters</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Extended ASCII</translation>
</message>
@@ -4085,18 +5121,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Advanced</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Upper Case Letters A to F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Lower Case Letters A to F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4129,18 +5157,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Math</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Dashes</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4188,6 +5208,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>Regenerate</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4195,12 +5283,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Select</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -4237,6 +5322,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>Merge</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4329,10 +5418,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Generate a password for the entry.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Length for the generated password.</translation>
- </message>
- <message>
<source>length</source>
<translation>length</translation>
</message>
@@ -4382,18 +5467,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Perform advanced analysis on the password.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extract and print the content of a database.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Path of the database to extract.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Insert password to unlock %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4438,10 +5511,6 @@ Available commands:
<translation>Merge two databases.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Path of the database to merge into.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Path of the database to merge from.</translation>
</message>
@@ -4518,10 +5587,6 @@ Available commands:
<translation>Browser Integration</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Challenge Response - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Press</translation>
</message>
@@ -4552,10 +5617,6 @@ Available commands:
<translation>Generate a new random password.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Invalid value for password length %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Could not create entry with path %1.</translation>
</message>
@@ -4616,10 +5677,6 @@ Available commands:
<translation>count</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Invalid value for password length: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Could not find entry with path %1.</translation>
</message>
@@ -4744,26 +5801,6 @@ Available commands:
<translation>Failed to load key file %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>File %1 does not exist.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Unable to open file %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Error while reading the database:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Error while parsing the database:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Length of the generated password</translation>
</message>
@@ -4776,10 +5813,6 @@ Available commands:
<translation>Use uppercase characters</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Use numbers.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Use special characters</translation>
</message>
@@ -4924,10 +5957,6 @@ Available commands:
<translation>Successfully created new database.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Insert password to encrypt database (Press enter to leave blank): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Creating KeyFile %1 failed: %2</translation>
</message>
@@ -4936,10 +5965,6 @@ Available commands:
<translation>Loading KeyFile %1 failed: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Remove an entry from the database.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Path of the entry to remove.</translation>
</message>
@@ -5073,6 +6098,253 @@ Kernel: %3 %4</source>
<source>Cryptographic libraries:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation type="unfinished">Database was not modified by merge operation.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5227,6 +6499,93 @@ Kernel: %3 %4</source>
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">General</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="unfinished">Group</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation type="unfinished">Database settings</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5349,108 +6708,186 @@ Kernel: %3 %4</source>
<source>Signer:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation type="unfinished">Key</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation type="unfinished">Overwriting signed share container is not supported - export prevented</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation type="unfinished">Could not write export container (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation type="unfinished">Overwriting unsigned share container is not supported - export prevented</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation type="unfinished">Could not write export container</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation type="unfinished">Unexpected export error occurred</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
- <translation>Import from container without signature</translation>
+ <translation type="unfinished">Import from container without signature</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
- <translation>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</translation>
+ <translation type="unfinished">We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</translation>
</message>
<message>
<source>Import from container with certificate</source>
- <translation>Import from container with certificate</translation>
+ <translation type="unfinished">Import from container with certificate</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation type="unfinished">Do you want to trust %1 with the fingerprint of %2 from %3? {1 ?} {2 ?}</translation>
</message>
<message>
<source>Not this time</source>
- <translation>Not this time</translation>
+ <translation type="unfinished">Not this time</translation>
</message>
<message>
<source>Never</source>
- <translation>Never</translation>
+ <translation type="unfinished">Never</translation>
</message>
<message>
<source>Always</source>
- <translation>Always</translation>
+ <translation type="unfinished">Always</translation>
</message>
<message>
<source>Just this time</source>
- <translation>Just this time</translation>
- </message>
- <message>
- <source>Import from %1 failed (%2)</source>
- <translation>Import from %1 failed (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Import from %1 successful (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Imported from %1</translation>
+ <translation type="unfinished">Just this time</translation>
</message>
<message>
<source>Signed share container are not supported - import prevented</source>
- <translation>Signed share container are not supported - import prevented</translation>
+ <translation type="unfinished">Signed share container are not supported - import prevented</translation>
</message>
<message>
<source>File is not readable</source>
- <translation>File is not readable</translation>
+ <translation type="unfinished">File is not readable</translation>
</message>
<message>
<source>Invalid sharing container</source>
- <translation>Invalid sharing container</translation>
+ <translation type="unfinished">Invalid sharing container</translation>
</message>
<message>
<source>Untrusted import prevented</source>
- <translation>Untrusted import prevented</translation>
+ <translation type="unfinished">Untrusted import prevented</translation>
</message>
<message>
<source>Successful signed import</source>
- <translation>Successful signed import</translation>
+ <translation type="unfinished">Successful signed import</translation>
</message>
<message>
<source>Unexpected error</source>
- <translation>Unexpected error</translation>
+ <translation type="unfinished">Unexpected error</translation>
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation>Unsigned share container are not supported - import prevented</translation>
+ <translation type="unfinished">Unsigned share container are not supported - import prevented</translation>
</message>
<message>
<source>Successful unsigned import</source>
- <translation>Successful unsigned import</translation>
+ <translation type="unfinished">Successful unsigned import</translation>
</message>
<message>
<source>File does not exist</source>
- <translation>File does not exist</translation>
+ <translation type="unfinished">File does not exist</translation>
</message>
<message>
<source>Unknown share container type</source>
- <translation>Unknown share container type</translation>
- </message>
- <message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Overwriting signed share container is not supported - export prevented</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Could not write export container (%1)</translation>
+ <translation type="unfinished">Unknown share container type</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Overwriting unsigned share container is not supported - export prevented</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import from %1 failed (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Could not write export container</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import from %1 successful (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Unexpected export error occurred</translation>
+ <source>Imported from %1</source>
+ <translation>Imported from %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5465,10 +6902,6 @@ Kernel: %3 %4</source>
<translation>Export to %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished">Do you want to trust %1 with the fingerprint of %2 from %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"></translation>
</message>
@@ -5476,22 +6909,6 @@ Kernel: %3 %4</source>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5542,10 +6959,6 @@ Kernel: %3 %4</source>
<translation>Setup TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Key:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Default RFC 6238 token settings</translation>
</message>
@@ -5575,16 +6988,45 @@ Kernel: %3 %4</source>
<translation>Code size:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 digits</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 digits</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 digits</translation>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -5668,6 +7110,14 @@ Kernel: %3 %4</source>
<source>Welcome to KeePassXC %1</source>
<translation>Welcome to KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5691,5 +7141,13 @@ Kernel: %3 %4</source>
<source>No YubiKey inserted.</source>
<translation>No YubiKey inserted.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
diff --git a/share/translations/keepassx_en_GB.ts b/share/translations/keepassx_en_GB.ts
index 1918b2855..f2c108d4c 100644
--- a/share/translations/keepassx_en_GB.ts
+++ b/share/translations/keepassx_en_GB.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Follow style</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Start only a single instance of KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Remember last databases</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Remember last key files and security dongles</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Load previous databases on startup</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimise window at application startup</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Use group icon on entry creation</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimise when copying to clipboard</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Hide the entry preview panel</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Hide window to system tray when minimised</translation>
</message>
<message>
- <source>Language</source>
- <translation>Language</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Auto-Type</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Auto-Type start delay</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Check for updates at application startup</translation>
+ <source>Movable toolbar</source>
+ <translation>Movable toolbar</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Include pre-releases when checking for updates</translation>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Movable toolbar</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Button style</translation>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sec</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Privacy</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Use DuckDuckGo as fallback for downloading website icons</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copy &amp;username</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Select entry to Auto-Type:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Search...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Please select the correct database for saving credentials.</translation>
<translation>This is required for accessing your databases with KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Enable KeePassXC browser integration</translation>
- </message>
- <message>
<source>General</source>
<translation>General</translation>
</message>
@@ -534,10 +643,6 @@ Please select the correct database for saving credentials.</translation>
<translation>Never ask before &amp;updating credentials</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Only the selected database has to be connected with a client.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Searc&amp;h in all opened databases for matching credentials</translation>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</translation>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Executable Files</translation>
</message>
@@ -611,14 +712,58 @@ Please select the correct database for saving credentials.</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation type="unfinished"/>
+ <translation>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation type="unfinished"/>
+ <translation>Please see special instructions for browser extension use below</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
+ <translation>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -675,11 +820,12 @@ Do you want to overwrite it?</translation>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>Successfully converted attributes from %1 entry(s).
+Moved %2 keys to custom data.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>Successfully moved %n key to custom data.</numerusform><numerusform>Successfully moved %n keys to custom data.</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -695,19 +841,27 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Create a new group</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation type="unfinished"/>
+ <translation>A request for creating a new group &quot;%1&quot; has been received.
+Do you want to create this group?
+</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation type="unfinished"/>
+ <translation>Your KeePassXC-Browser settings need to be moved into the database settings.
+This is necessary to maintain your current browser connections.
+Would you like to migrate your existing settings now?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Don&apos;t show this warning again</translation>
</message>
</context>
<context>
@@ -768,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>First record has field names</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Number of headers line to discard</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Consider &apos;\&apos; an escape character</translation>
</message>
@@ -813,7 +963,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n more message skipped]</numerusform><numerusform>[%n more messages skipped]</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -821,12 +971,28 @@ Would you like to migrate your existing settings now?</source>
<translation>CSV import: writer has errors:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n column</numerusform><numerusform>%n columns</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -835,11 +1001,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte</numerusform><numerusform>%n bytes</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n row</numerusform><numerusform>%n rows</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -862,17 +1028,34 @@ Would you like to migrate your existing settings now?</source>
<translation>Error while reading the database: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Could not save, database has no file name.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>File cannot be written as it is opened in read-only mode.</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <translation>Key not transformed. This is a bug, please report it to the developers!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Recycle Bin</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -884,30 +1067,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Enter master key</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Key File:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Password:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Browse</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Refresh</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Challenge Response:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Legacy key file format</translation>
</message>
@@ -938,20 +1105,96 @@ Please consider generating a new key file.</translation>
<translation>Select key file</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID for quick unlock</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Unable to open the database:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Can&apos;t open key file:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Browse...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Clear</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1060,7 +1303,7 @@ This may prevent connection to the browser plugin.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Successfully removed %n encryption key from KeePassXC settings.</numerusform><numerusform>Successfully removed %n encryption keys from KeePassXC settings.</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1086,7 +1329,7 @@ Permissions to access entries will be revoked.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Successfully removed permissions from %n entry.</numerusform><numerusform>Successfully removed permissions from %n entries.</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1106,6 +1349,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1231,22 +1482,73 @@ If you keep this number, your database may be too easy to crack!</translation>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform> thread</numerusform><numerusform> threads</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1295,6 +1597,39 @@ If you keep this number, your database may be too easy to crack!</translation>
<source>Enable &amp;compression (recommended)</source>
<translation>Enable &amp;compression (recommended)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1362,6 +1697,10 @@ Are you sure you want to continue without a password?</translation>
<source>Failed to change master key</source>
<translation>Failed to change master key</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1373,6 +1712,129 @@ Are you sure you want to continue without a password?</translation>
<source>Description:</source>
<translation>Description:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Value</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1423,10 +1885,6 @@ This is definitely a bug, please report it to the developers.</source>
This is definitely a bug, please report it to the developers.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>The database file does not exist or is not accessible.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Select CSV file</translation>
</message>
@@ -1449,6 +1907,30 @@ This is definitely a bug, please report it to the developers.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Read-only]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1466,7 +1948,7 @@ This is definitely a bug, please report it to the developers.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Do you really want to move %n entry to the recycle bin?</numerusform><numerusform>Do you really want to move %n entries to the recycle bin?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1528,19 +2010,15 @@ Do you want to merge your changes?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Do you really want to delete %n entry for good?</numerusform><numerusform>Do you really want to delete %n entries for good?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Delete entry?</numerusform><numerusform>Delete entries?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Move entry to recycle bin?</numerusform><numerusform>Move entries to recycle bin?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>File opened in read only mode.</translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1583,12 +2061,6 @@ Disable safe saves and try again?</source>
Disable safe saves and try again?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Writing the database failed.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Passwords</translation>
</message>
@@ -1606,7 +2078,7 @@ Disable safe saves and try again?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>Entry &quot;%1&quot; has %2 reference. Do you want to overwrite references with values, skip this entry, or delete anyway?</numerusform><numerusform>Entry &quot;%1&quot; has %2 references. Do you want to overwrite references with values, skip this entry, or delete anyway?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1630,6 +2102,14 @@ Disable safe saves and try again?</translation>
</message>
<message>
<source>Shared group...</source>
+ <translation>Shared group...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1713,11 +2193,11 @@ Disable safe saves and try again?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n week</numerusform><numerusform>%n weeks</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n month</numerusform><numerusform>%n months</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1745,12 +2225,24 @@ Disable safe saves and try again?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n year</numerusform><numerusform>%n years</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Confirm Removal</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Browser Integration</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1790,6 +2282,42 @@ Disable safe saves and try again?</translation>
<source>Background Color:</source>
<translation>Background Colour:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1825,6 +2353,77 @@ Disable safe saves and try again?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Use a specific sequence for this association:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Add</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remove</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1844,6 +2443,26 @@ Disable safe saves and try again?</translation>
<source>Delete all</source>
<translation>Delete all</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1883,6 +2502,62 @@ Disable safe saves and try again?</translation>
<source>Expires</source>
<translation>Expires</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1959,6 +2634,22 @@ Disable safe saves and try again?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Require user confirmation when this key is used</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1994,6 +2685,10 @@ Disable safe saves and try again?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Inherit from parent group (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Entry has unsaved changes</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2022,67 +2717,97 @@ Disable safe saves and try again?</translation>
<translation>Inactive</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Import from path</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare unsigned container</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Export to path</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare signed container</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchronize with path</translation>
+ <source>Select import source</source>
+ <translation>Select import source</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Your KeePassXC version does not support sharing your container type. Please use %1.</translation>
+ <source>Select export target</source>
+ <translation>Select export target</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Database sharing is disabled</translation>
+ <source>Select import/export file</source>
+ <translation>Select import/export file</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Database export is disabled</translation>
+ <source>Clear</source>
+ <translation>Clear</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Database import is disabled</translation>
+ <source>Import</source>
+ <translation>Import</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare unsigned container</translation>
+ <source>Export</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare signed container</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Select import source</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Select export target</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Select import/export file</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Clear</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Database export is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2116,6 +2841,34 @@ Disable safe saves and try again?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Set default Auto-Type se&amp;quence</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2152,28 +2905,16 @@ Disable safe saves and try again?</translation>
<translation>All files</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Custom icon already exists</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirm Delete</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Custom icon successfully downloaded</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Select Image(s)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Successfully loaded %1 of %n icon</numerusform><numerusform>Successfully loaded %1 of %n icons</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2181,15 +2922,51 @@ Disable safe saves and try again?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n icon already exist in the database</numerusform><numerusform>%n icons already exist in the database</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>The following icon failed:</numerusform><numerusform>The following icons failed:</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>This icon is used by %n entry, and will be replaced by the default icon. Are you sure you want to delete it?</numerusform><numerusform>This icon is used by %n entries, and will be replaced by the default icon. Are you sure you want to delete it?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2236,6 +3013,30 @@ This may cause the affected plugins to malfunction.</translation>
<source>Value</source>
<translation>Value</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2283,7 +3084,7 @@ This may cause the affected plugins to malfunction.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Are you sure you want to remove %n attachment?</numerusform><numerusform>Are you sure you want to remove %n attachments?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2328,9 +3129,27 @@ This may cause the affected plugins to malfunction.</translation>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Unable to open file:
-%1</numerusform><numerusform>Unable to open files:
-%1</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>Attachments</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2426,10 +3245,6 @@ This may cause the affected plugins to malfunction.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generate TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>Close</translation>
</message>
@@ -2514,6 +3329,14 @@ This may cause the affected plugins to malfunction.</translation>
<source>Share</source>
<translation>Share</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Advanced</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2547,11 +3370,33 @@ This may cause the affected plugins to malfunction.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Recycle Bin</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2570,6 +3415,58 @@ This may cause the affected plugins to malfunction.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Close</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2591,10 +3488,6 @@ This may cause the affected plugins to malfunction.</translation>
<translation>Unable to issue challenge-response.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Wrong key or database file is corrupt.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>missing database headers</translation>
</message>
@@ -2614,6 +3507,11 @@ This may cause the affected plugins to malfunction.</translation>
<source>Invalid header data length</source>
<translation>Invalid header data length</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2645,10 +3543,6 @@ This may cause the affected plugins to malfunction.</translation>
<translation>Header SHA256 mismatch</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Wrong key or database file is corrupt. (HMAC mismatch)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Unknown cipher</translation>
</message>
@@ -2748,6 +3642,15 @@ This may cause the affected plugins to malfunction.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Invalid variant map field type size</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2968,13 +3871,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Unable to open the database.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3032,10 +3935,6 @@ Line %2, column %3</source>
<translation>Unable to calculate master key</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Wrong key or database file is corrupt.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Key transformation failed</translation>
</message>
@@ -3131,39 +4030,56 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
+ <source>Inactive share %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
+ <source>Imported from %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
+ <source>Import is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
+ <source>Export is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Inactive share</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Imported from</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3209,10 +4125,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Browse</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generate</translation>
</message>
@@ -3264,6 +4176,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>Select a key file</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Browse...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3352,10 +4301,6 @@ Message: %2</source>
<translation>&amp;Settings</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Lock databases</translation>
</message>
@@ -3539,28 +4484,88 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for Updates...</source>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Share entry</source>
+ <source>Check for updates on startup?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>You can always check for updates manually from the application menu.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Download favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3622,6 +4627,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3692,6 +4705,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3791,6 +4870,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3816,6 +4906,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3845,22 +4951,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Character Types</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Numbers</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Special Characters</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Extended ASCII</translation>
</message>
@@ -3941,18 +5035,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Advanced</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation type="unfinished"/>
</message>
@@ -3985,18 +5071,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation type="unfinished"/>
</message>
<message>
- <source>Math</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Dashes</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>\_|-/</source>
<translation type="unfinished"/>
</message>
@@ -4044,6 +5122,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4051,11 +5197,8 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4093,6 +5236,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4185,10 +5332,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Generate a password for the entry.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Length for the generated password.</translation>
- </message>
- <message>
<source>length</source>
<translation type="unfinished"/>
</message>
@@ -4238,18 +5381,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Perform advanced analysis on the password.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extract and print the content of a database.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Path of the database to extract.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4288,10 +5419,6 @@ Available commands:
<translation>Merge two databases.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Path of the database to merge into.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Path of the database to merge from.</translation>
</message>
@@ -4368,10 +5495,6 @@ Available commands:
<translation>Browser Integration</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Press</source>
<translation type="unfinished"/>
</message>
@@ -4401,10 +5524,6 @@ Available commands:
<translation>Generate a new random password.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4462,10 +5581,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4590,24 +5705,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>File %1 does not exist.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Unable to open file %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Length of the generated password</source>
<translation type="unfinished"/>
</message>
@@ -4620,10 +5717,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Use special characters</source>
<translation type="unfinished"/>
</message>
@@ -4767,10 +5860,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation type="unfinished"/>
</message>
@@ -4779,10 +5868,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Remove an entry from the database.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Path of the entry to remove.</translation>
</message>
@@ -4838,6 +5923,330 @@ Available commands:
<source>Cannot create new group</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Version %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Build Type: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revision: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribution: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Auto-Type</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (signed and unsigned sharing)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (only signed sharing)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (only unsigned sharing)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>None</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Enabled extensions:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Database was not modified by merge operation.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4992,6 +6401,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Group</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Database settings</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Unlock database</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Lock database</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>None</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5114,147 +6610,205 @@ Available commands:
<source>Signer:</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Key</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
<message>
- <source>Import from container without signature</source>
+ <source>Overwriting signed share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Could not write export container (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
+ <source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Never</source>
- <translation>Never</translation>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Always</source>
+ <source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Just this time</source>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Could not write export container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
- <source>Imported from %1</source>
+ <source>Import from container without signature</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Signed share container are not supported - import prevented</source>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File is not readable</source>
+ <source>Import from container with certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid sharing container</source>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Untrusted import prevented</source>
+ <source>Not this time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful signed import</source>
- <translation type="unfinished"/>
+ <source>Never</source>
+ <translation>Never</translation>
</message>
<message>
- <source>Unexpected error</source>
+ <source>Always</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unsigned share container are not supported - import prevented</source>
+ <source>Just this time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful unsigned import</source>
+ <source>Signed share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File does not exist</source>
+ <source>File is not readable</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unknown share container type</source>
+ <source>Invalid sharing container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
+ <source>Untrusted import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container (%1)</source>
+ <source>Successful signed import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <source>Unexpected error</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container</source>
+ <source>Unsigned share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unexpected export error occurred</source>
+ <source>Successful unsigned import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1 failed (%2)</source>
+ <source>File does not exist</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
+ <source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Export to %1</source>
+ <source>Import from %1 failed (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <source>Import from %1 successful (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Multiple import source path to %1 in %2</source>
+ <source>Imported from %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Conflicting export target path %1 in %2</source>
+ <source>Export to %1 failed (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
+ <source>Export to %1 successful (%2)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not write file (%1)</source>
+ <source>Export to %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed database: Could not open file to write (%1)</source>
+ <source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed database: Could not write file (%1)</source>
+ <source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5304,10 +6858,6 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>Key:</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Default RFC 6238 token settings</translation>
</message>
@@ -5337,15 +6887,44 @@ Available commands:
<translation type="unfinished"/>
</message>
<message>
- <source>6 digits</source>
+ <source>Secret Key:</source>
<translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source>Secret key must be in Base32 format</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5430,6 +7009,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>Welcome to KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5453,5 +7040,13 @@ Available commands:
<source>No YubiKey inserted.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_en_US.ts b/share/translations/keepassx_en_US.ts
index f443aefe6..477b63ffb 100644
--- a/share/translations/keepassx_en_US.ts
+++ b/share/translations/keepassx_en_US.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Follow style</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Reset Settings?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Are you sure you want to reset all general and security settings to default?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Start only a single instance of KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Remember last databases</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Remember last key files and security dongles</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Load previous databases on startup</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimize window at application startup</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Use group icon on entry creation</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimize when copying to clipboard</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Hide the entry preview panel</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Hide window to system tray when minimized</translation>
</message>
<message>
- <source>Language</source>
- <translation>Language</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Auto-Type</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Auto-Type start delay</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Check for updates at application startup</translation>
+ <source>Movable toolbar</source>
+ <translation>Movable toolbar</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>Remember previously used databases</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Include pre-releases when checking for updates</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Load previously open databases on startup</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Movable toolbar</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Remember database key files and security dongles</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Button style</translation>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Check for updates at application startup once per week</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Include beta releases when checking for updates</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Button style:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Language:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(restart program to activate)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Minimize window after unlocking database</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimize when opening a URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Hide window when copying to clipboard</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimize</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Drop to background</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Favicon download timeout:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Website icon download timeout in seconds</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sec</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Toolbar button style</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Use monospaced font for notes</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Language selection</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Reset Settings to Default</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Global auto-type shortcut</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Auto-type character typing delay milliseconds</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Auto-type start delay milliseconds</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Privacy</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Use DuckDuckGo as fallback for downloading website icons</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Use DuckDuckGo service to download website icons</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Clipboard clear seconds</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Touch ID inactivity reset</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Database lock timeout seconds</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Clear search query after</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copy &amp;username</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copy &amp;password</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Select entry to Auto-Type:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Search...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Allow access</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Deny access</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Please select the correct database for saving credentials.</translation>
<translation>This is required for accessing your databases with KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Enable KeepassXC browser integration</translation>
- </message>
- <message>
<source>General</source>
<translation>General</translation>
</message>
@@ -534,10 +643,6 @@ Please select the correct database for saving credentials.</translation>
<translation>Never ask before &amp;updating credentials</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Only the selected database has to be connected with a client.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Searc&amp;h in all opened databases for matching credentials</translation>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</translation>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Executable Files</translation>
</message>
@@ -621,6 +722,50 @@ Please select the correct database for saving credentials.</translation>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Returns expired credentials. String [expired] is added to the title.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Allow returning expired credentials.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Enable browser integration</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Browsers installed as snaps are currently not supported.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>All databases connected to the extension will return matching credentials.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Do not prompt for KeePassHTTP settings migration.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Custom proxy location field</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Browser for custom proxy file</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Don&apos;t show this warning again</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Would you like to migrate your existing settings now?</translation>
<translation>First record has field names</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Number of headers line to discard</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Consider &apos;\&apos; an escape character</translation>
</message>
@@ -818,7 +963,7 @@ Would you like to migrate your existing settings now?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n more message(s) skipped]</numerusform><numerusform>[%n more message(s) skipped]</numerusform></translation>
+ <translation><numerusform>[%n more message skipped]</numerusform><numerusform>[%n more messages skipped]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -826,12 +971,28 @@ Would you like to migrate your existing settings now?</translation>
<translation>CSV import: writer has errors:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Text qualification</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Field separation</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Number of header lines to discard</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV import preview</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n column(s)</numerusform><numerusform>%n column(s)</numerusform></translation>
+ <translation><numerusform>%n column</numerusform><numerusform>%n columns</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -840,11 +1001,11 @@ Would you like to migrate your existing settings now?</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte(s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
+ <translation><numerusform>%n byte</numerusform><numerusform>%n bytes</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n row(s)</numerusform><numerusform>%n row(s)</numerusform></translation>
+ <translation><numerusform>%n row</numerusform><numerusform>%n rows</numerusform></translation>
</message>
</context>
<context>
@@ -867,10 +1028,6 @@ Would you like to migrate your existing settings now?</translation>
<translation>Error while reading the database: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Could not save, database has no file name.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>File cannot be written as it is opened in read-only mode.</translation>
</message>
@@ -878,6 +1035,28 @@ Would you like to migrate your existing settings now?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Key not transformed. This is a bug, please report it to the developers!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Backup database located at %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Could not save, database does not point to a valid file.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Could not save, database file is read-only.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Database file has unmerged changes.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Recycle Bin</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1068,14 @@ Would you like to migrate your existing settings now?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Enter master key</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Key File:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Password:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Browse</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Refresh</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Challenge Response:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Legacy key file format</translation>
</message>
@@ -943,20 +1106,100 @@ Please consider generating a new key file.</translation>
<translation>Select key file</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID for quick unlock</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Failed to open key file: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Unable to open the database:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Select slot...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Can&apos;t open key file:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Unlock KeePassXC Database</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Enter Password:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Password field</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Toggle password visibility</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Enter Additional Credentials:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Key file selection</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardware key slot selection</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Browse for key file</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Browse...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Refresh hardware tokens</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Hardware Key:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Hardware key help</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID for Quick Unlock</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Clear</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Clear Key File</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Select file...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Unlock failed and no password given</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Retry with empty password</translation>
</message>
</context>
<context>
@@ -1065,7 +1308,7 @@ This may prevent connection to the browser plugin.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Successfully removed %n encryption key(s) from KeePassXC settings.</numerusform><numerusform>Successfully removed %n encryption key(s) from KeePassXC settings.</numerusform></translation>
+ <translation><numerusform>Successfully removed %n encryption key from KeePassXC settings.</numerusform><numerusform>Successfully removed %n encryption keys from KeePassXC settings.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1091,7 +1334,7 @@ Permissions to access entries will be revoked.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Successfully removed permissions from %n entry(s).</numerusform><numerusform>Successfully removed permissions from %n entry(s).</numerusform></translation>
+ <translation><numerusform>Successfully removed permissions from %n entry.</numerusform><numerusform>Successfully removed permissions from %n entries.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1111,6 +1354,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Stored browser keys</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Remove selected key</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1253,6 +1504,57 @@ If you keep this number, your database may be too easy to crack!</translation>
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Change existing decryption time</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Decryption time in seconds</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Database format</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Encryption algorithm</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Key derivation function</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Transform rounds</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Memory usage</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Parallelism</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Exposed Entries</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Don&apos;t e&amp;xpose this database</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Expose entries &amp;under this group:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Enable fd.o Secret Service to access these settings.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1300,6 +1602,40 @@ If you keep this number, your database may be too easy to crack!</translation>
<source>Enable &amp;compression (recommended)</source>
<translation>Enable &amp;compression (recommended)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Database name field</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Database description field</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Default username field</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Maximum number of history items per entry</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Maximum size of history per entry</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Delete Recycle Bin</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation> (old)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1367,6 +1703,10 @@ Are you sure you want to continue without a password?</translation>
<source>Failed to change master key</source>
<translation>Failed to change master key</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Continue without password</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1718,129 @@ Are you sure you want to continue without a password?</translation>
<source>Description:</source>
<translation>Description:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Database name field</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Database description field</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statistics</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Hover over lines with error icons for further information.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Value</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Database name</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Description</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Location</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Last saved</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Unsaved changes</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>yes</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>no</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>The database was modified, but the changes have not yet been saved to disk.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Number of groups</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Number of entries</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Number of expired entries</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>The database contains entries that have expired.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Unique passwords</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Non-unique passwords</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>More than 10% of passwords are reused. Use unique passwords when possible.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Maximum password reuse</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Some passwords are used more than three times. Use unique passwords when possible.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Number of short passwords</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Recommended minimum password length is at least 8 characters.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Number of weak passwords</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Average password length</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 characters</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Average password length is less than ten characters. Longer passwords provide more security.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1428,10 +1891,6 @@ This is definitely a bug, please report it to the developers.</source>
This is definitely a bug, please report it to the developers.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>The database file does not exist or is not accessible.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Select CSV file</translation>
</message>
@@ -1454,6 +1913,30 @@ This is definitely a bug, please report it to the developers.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Read-only]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Failed to open %1. It either does not exist or is not accessible.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Export database to HTML file</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML file</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Writing the HTML file failed.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Export Confirmation</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1544,10 +2027,6 @@ Do you want to merge your changes?</translation>
<translation><numerusform>Move entry to recycle bin?</numerusform><numerusform>Move entries to recycle bin?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>File opened in read only mode.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Lock Database?</translation>
</message>
@@ -1588,12 +2067,6 @@ Disable safe saves and try again?</source>
Disable safe saves and try again?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Writing the database failed.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Passwords</translation>
</message>
@@ -1637,6 +2110,14 @@ Disable safe saves and try again?</translation>
<source>Shared group...</source>
<translation>Shared group...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Writing the database failed: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>This database is opened in read-only mode. Autosave is disabled.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1756,6 +2237,18 @@ Disable safe saves and try again?</translation>
<source>Confirm Removal</source>
<translation>Confirm Removal</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Browser Integration</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Are you sure you want to remove this URL?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1795,6 +2288,42 @@ Disable safe saves and try again?</translation>
<source>Background Color:</source>
<translation>Background Color:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Attribute selection</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Attribute value</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Add a new attribute</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Remove selected attribute</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Edit attribute name</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Toggle attribute protection</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Show a protected attribute</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Foreground color selection</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Background color selection</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1830,6 +2359,77 @@ Disable safe saves and try again?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Use a specific sequence for this association:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Custom Auto-Type sequence</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Open Auto-Type help webpage</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Existing window associations</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Add new window association</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Remove selected window association</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>You can use an asterisk (*) to match everything</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Set the window association title</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>You can use an asterisk to match everything</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Custom Auto-Type sequence for this window</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>These settings affect to the entry&apos;s behavior with the browser extension.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Skip Auto-Submit for this entry</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Hide this entry from the browser extension</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Additional URL&apos;s</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Add</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remove</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Edit</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2449,26 @@ Disable safe saves and try again?</translation>
<source>Delete all</source>
<translation>Delete all</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Entry history selection</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Show entry at selected history state</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Restore entry to selected history state</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Delete selected history state</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Delete all history</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2508,62 @@ Disable safe saves and try again?</translation>
<source>Expires</source>
<translation>Expires</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Url field</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Download favicon for URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Repeat password field</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Toggle password generator</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Password field</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Toggle password visibility</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Toggle notes visible</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Expiration field</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Expiration Presets</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Expiration presets</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Notes field</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Title field</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Username field</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Toggle expiration</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1964,6 +2640,22 @@ Disable safe saves and try again?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Require user confirmation when this key is used</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Remove key from agent after specified seconds</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Browser for key file</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>External key file</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Select attachment file</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1999,6 +2691,10 @@ Disable safe saves and try again?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Inherit from parent group (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Entry has unsaved changes</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,68 +2723,99 @@ Disable safe saves and try again?</translation>
<translation>Inactive</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Import from path</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare unsigned container</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Export to path</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare signed container</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchronize with path</translation>
+ <source>Select import source</source>
+ <translation>Select import source</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Your KeePassXC version does not support sharing your container type. Please use %1.</translation>
+ <source>Select export target</source>
+ <translation>Select export target</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Database sharing is disabled</translation>
+ <source>Select import/export file</source>
+ <translation>Select import/export file</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Database export is disabled</translation>
+ <source>Clear</source>
+ <translation>Clear</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Database import is disabled</translation>
+ <source>Import</source>
+ <translation>Import</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare unsigned container</translation>
+ <source>Export</source>
+ <translation>Export</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare signed container</translation>
+ <source>Synchronize</source>
+ <translation>Synchronize</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Select import source</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Select export target</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 is already being exported by this database.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Select import/export file</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 is already being imported by this database.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Clear</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 is being imported and exported by different groups in this database.</translation>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare is currently disabled. You can enable import/export in the application settings.</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Database export is currently disabled by application settings.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Database import is currently disabled by application settings.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Sharing mode field</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Path to share file field</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>The export container %1 is already referenced.</translation>
+ <source>Browser for share file</source>
+ <translation>Browser for share file</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>The import container %1 is already imported.</translation>
+ <source>Password field</source>
+ <translation>Password field</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>The container %1 imported and export by different groups.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Toggle password visibility</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Toggle password generator</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Clear fields</translation>
</message>
</context>
<context>
@@ -2121,6 +2848,34 @@ Disable safe saves and try again?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Set default Auto-Type se&amp;quence</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Name field</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Notes field</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Toggle expiration</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Auto-Type toggle for this and sub groups</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Expiration field</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Search toggle for this and sub groups</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Default auto-type sequence field</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2157,22 +2912,10 @@ Disable safe saves and try again?</translation>
<translation>All files</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Custom icon already exists</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirm Delete</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Custom icon successfully downloaded</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Select Image(s)</translation>
</message>
@@ -2186,7 +2929,7 @@ Disable safe saves and try again?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n icon already exist in the database</numerusform><numerusform>%n icons already exist in the database</numerusform></translation>
+ <translation><numerusform>%n icon already exists in the database</numerusform><numerusform>%n icons already exist in the database</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
@@ -2196,6 +2939,42 @@ Disable safe saves and try again?</translation>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>This icon is used by %n entry, and will be replaced by the default icon. Are you sure you want to delete it?</numerusform><numerusform>This icon is used by %n entries, and will be replaced by the default icon. Are you sure you want to delete it?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Download favicon for URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Apply selected icon to subgroups and entries</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Apply icon &amp;to ...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Apply to this only</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Also apply to child groups</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Also apply to child entries</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Also apply to all children</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Existing icon selected.</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2241,6 +3020,30 @@ This may cause the affected plugins to malfunction.</translation>
<source>Value</source>
<translation>Value</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Datetime created</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Datetime modified</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Datetime accessed</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Unique ID</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Plugin data</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Remove selected plugin data</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2337,6 +3140,26 @@ This may cause the affected plugins to malfunction.</translation>
%1</numerusform><numerusform>Unable to open files:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Attachments</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Add new attachment</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Remove selected attachment</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Open selected attachment</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Save selected attachment to disk</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2431,10 +3254,6 @@ This may cause the affected plugins to malfunction.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generate TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>Close</translation>
</message>
@@ -2519,6 +3338,14 @@ This may cause the affected plugins to malfunction.</translation>
<source>Share</source>
<translation>Share</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Display current TOTP value</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Advanced</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2552,11 +3379,33 @@ This may cause the affected plugins to malfunction.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Recycle Bin</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Failed to register DBus service at %1: another secret service is running.</translation>
</message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n entry was used by %1</numerusform><numerusform>%n entries was used by %1</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo Secret Service: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2575,6 +3424,59 @@ This may cause the affected plugins to malfunction.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Download Favicons</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Close</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Please wait, processing entry list...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Downloading...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Already Exists</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Download Failed</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Downloading favicons (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2596,10 +3498,6 @@ This may cause the affected plugins to malfunction.</translation>
<translation>Unable to issue challenge-response.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Wrong key or database file is corrupt.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>missing database headers</translation>
</message>
@@ -2619,6 +3517,12 @@ This may cause the affected plugins to malfunction.</translation>
<source>Invalid header data length</source>
<translation>Invalid header data length</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2650,10 +3554,6 @@ This may cause the affected plugins to malfunction.</translation>
<translation>Header SHA256 mismatch</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Wrong key or database file is corrupt. (HMAC mismatch)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Unknown cipher</translation>
</message>
@@ -2753,6 +3653,16 @@ This may cause the affected plugins to malfunction.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Invalid variant map field type size</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC mismatch)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2975,13 +3885,13 @@ Line %2, column %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Import KeePass1 database</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Unable to open the database.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Import KeePass1 Database</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3039,10 +3949,6 @@ Line %2, column %3</translation>
<translation>Unable to calculate master key</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Wrong key or database file is corrupt.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Key transformation failed</translation>
</message>
@@ -3138,40 +4044,58 @@ Line %2, column %3</translation>
<source>unable to seek to content position</source>
<translation>unable to seek to content position</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Disabled share</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Invalid sharing reference</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Import from</translation>
+ <source>Inactive share %1</source>
+ <translation>Inactive share %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Export to</translation>
+ <source>Imported from %1</source>
+ <translation>Imported from %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchronize with</translation>
+ <source>Exported to %1</source>
+ <translation>Exported to %1</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Disabled share %1</translation>
+ <source>Synchronized with %1</source>
+ <translation>Synchronized with %1</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Import from share %1</translation>
+ <source>Import is disabled in settings</source>
+ <translation>Import is disabled in settings</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Export to share %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation>Export is disabled in settings</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synchronize with share %1</translation>
+ <source>Inactive share</source>
+ <translation>Inactive share</translation>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation>Imported from</translation>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation>Exported to</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>Synchronized with</translation>
</message>
</context>
<context>
@@ -3216,10 +4140,6 @@ Line %2, column %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Browse</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generate</translation>
</message>
@@ -3275,6 +4195,44 @@ Message: %2</translation>
<source>Select a key file</source>
<translation>Select a key file</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Key file selection</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Browse for key file</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Browse...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Generate a new key file</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Note: Do not use a file that may change as that will prevent you from unlocking your database!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Invalid Key File</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Suspicious Key File</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3363,10 +4321,6 @@ Message: %2</translation>
<translation>&amp;Settings</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Password Generator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Lock databases</translation>
</message>
@@ -3553,14 +4507,6 @@ We recommend you use the AppImage available on our downloads page.</translation>
<translation>Show TOTP QR Code...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Check for Updates...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Share entry</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOTE: You are using a pre-release version of KeePassXC!
@@ -3578,6 +4524,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>You can always check for updates manually from the application menu.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Export</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Check for Updates...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Downlo&amp;ad all favicons</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Sort &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Sort &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Password Generator</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Download favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Export to HTML file...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password Vault...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Import a 1Password Vault</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Getting Started</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Open Getting Started Guide PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>&amp;Online Help...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Go to online documentation (opens browser)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>&amp;User Guide</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Open User Guide PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Keyboard Shortcuts</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3637,6 +4651,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>Adding missing icon %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Removed custom data %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Adding custom data %1 [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3707,6 +4729,73 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>Invalid OpData01, does not contain header</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Unable to read all IV bytes, wanted 16 but got %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Unable to init cipher for opdata01: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Unable to read all HMAC signature bytes</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>Malformed OpData01 due to a failed HMAC</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Unable to process clearText in place</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>Expected %1 bytes of clear-text, found %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Read Database did not produce an instance
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Directory .opvault must exist</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>Directory .opvault must be readable</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Directory .opvault/default must exist</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Directory .opvault/default must be readable</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Unable to decode masterKey: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Unable to derive master key: %1</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3806,6 +4895,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Passwords do not match</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Passwords match so far</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3831,6 +4931,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Generate master password</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Password field</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Toggle password visibility</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Repeat password field</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Toggle password generator</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3860,22 +4976,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Character Types</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Upper Case Letters</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Lower Case Letters</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Numbers</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Special Characters</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Extended ASCII</translation>
</message>
@@ -3956,18 +5060,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Advanced</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Upper Case Letters A to F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Lower Case Letters A to F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4000,18 +5096,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Math</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Dashes</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4059,6 +5147,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>Regenerate</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Generated password</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Upper-case letters</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Lower-case letters</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Special characters</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Math Symbols</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Dashes and Slashes</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Excluded characters</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Hex Passwords</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Password length</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Word Case:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Regenerate password</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Copy password</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Accept password</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>lower case</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>UPPER CASE</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Title Case</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Toggle password visibility</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4066,12 +5222,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Select</translation>
+ <source>Statistics</source>
+ <translation>Statistics</translation>
</message>
</context>
<context>
@@ -4108,6 +5261,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>Merge</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Continue</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4200,10 +5357,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Generate a password for the entry.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Length for the generated password.</translation>
- </message>
- <message>
<source>length</source>
<translation>length</translation>
</message>
@@ -4253,18 +5406,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Perform advanced analysis on the password.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extract and print the content of a database.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Path of the database to extract.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Insert password to unlock %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4309,10 +5450,6 @@ Available commands:
<translation>Merge two databases.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Path of the database to merge into.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Path of the database to merge from.</translation>
</message>
@@ -4389,10 +5526,6 @@ Available commands:
<translation>Browser Integration</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Challenge Response - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Press</translation>
</message>
@@ -4423,10 +5556,6 @@ Available commands:
<translation>Generate a new random password.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Invalid value for password length %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Could not create entry with path %1.</translation>
</message>
@@ -4484,10 +5613,6 @@ Available commands:
<translation>count</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Invalid value for password length: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Could not find entry with path %1.</translation>
</message>
@@ -4612,26 +5737,6 @@ Available commands:
<translation>Failed to load key file %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>File %1 does not exist.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Unable to open file %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Error while reading the database:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Error while parsing the database:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Length of the generated password</translation>
</message>
@@ -4644,10 +5749,6 @@ Available commands:
<translation>Use uppercase characters</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Use numbers.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Use special characters</translation>
</message>
@@ -4792,10 +5893,6 @@ Available commands:
<translation>Successfully created new database.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Insert password to encrypt database (Press enter to leave blank): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Creating KeyFile %1 failed: %2</translation>
</message>
@@ -4804,10 +5901,6 @@ Available commands:
<translation>Loading KeyFile %1 failed: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Remove an entry from the database.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Path of the entry to remove.</translation>
</message>
@@ -4863,6 +5956,330 @@ Available commands:
<source>Cannot create new group</source>
<translation>Cannot create new group</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Deactivate password key for the database.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Displays debugging information.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Deactivate password key for the database to merge from.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Version %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Build Type: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revision: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribution: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Debugging mode is disabled.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Debugging mode is enabled.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Auto-Type</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (signed and unsigned sharing)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (only signed sharing)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (only unsigned sharing)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>None</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Enabled extensions:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Cryptographic libraries:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Cannot generate a password and prompt at the same time!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Adds a new group to a database.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Path of the group to add.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Group %1 already exists!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Group %1 not found.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Successfully added group %1.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>FILENAME</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analyze passwords for weaknesses and problems.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Failed to open HIBP file %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Evaluating database entries against HIBP file, this will take a while...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Close the currently opened database.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Display this help.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Yubikey slot used to encrypt the database.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>slot</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Invalid word count %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>The word list is too small (&lt; 1000 items)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Exit interactive mode.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Exports the content of a database to standard output in the specified format.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Unable to export database to XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Unsupported format %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Use numbers</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Invalid password length %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Display command help.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Available commands:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Import the contents of an XML database.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Path of the XML database export.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Path of the new database.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Unable to import XML database export %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Successfully imported database.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Unknown command %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Flattens the output to single lines.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Only print the changes detected by the merge operation.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Yubikey slot for the second database.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>Successfully merged %1 into %2.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Database was not modified by merge operation.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Moves an entry to a new group.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Path of the entry to move.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Path of the destination group.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Could not find group with path %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>Entry is already in group %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Successfully moved entry %1 to group %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Open a database.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Path of the group to remove.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Cannot remove root group from database.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Successfully recycled group %1.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Successfully deleted group %1.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Failed to open database file %1: not found</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Failed to open database file %1: not a plain file</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Failed to open database file %1: not readable</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Enter password to unlock %1: </translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Invalid YubiKey slot %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Please touch the button on your YubiKey to unlock %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Enter password to encrypt database (optional): </translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>HIBP file, line %1: parse error</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Secret Service Integration</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>User name</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Challenge Response - Slot %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Password for &apos;%1&apos; has been leaked %2 time!</numerusform><numerusform>Password for &apos;%1&apos; has been leaked %2 times!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Invalid password generator after applying all options</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5017,6 +6434,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Enable KeepassXC Freedesktop.org Secret Service integration</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Show notification when credentials are requested</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Don&apos;t confirm when entries are deleted by clients.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Exposed database groups:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>File Name</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Group</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Manage</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Authorization</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>These applications are currently connected:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Application</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Disconnect</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Database settings</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Edit database settings</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Unlock database</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Unlock database to show more information</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Lock database</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Unlock to show</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>None</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5139,9 +6643,100 @@ Available commands:
<source>Signer:</source>
<translation>Signer:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Allow KeeShare imports</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Allow KeeShare exports</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Only show warnings and errors</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Key</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Signer name field</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Generate new certificate</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Import existing certificate</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Export own certificate</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Known shares</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Trust selected certificate</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Ask whether to trust the selected certificate every time</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Untrust selected certificate</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Remove selected certificate</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Overwriting signed share container is not supported - export prevented</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Could not write export container (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Could not embed signature: Could not open file to write (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Could not embed signature: Could not write file (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Could not embed database: Could not open file to write (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Could not embed database: Could not write file (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Overwriting unsigned share container is not supported - export prevented</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Could not write export container</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Unexpected export error occurred</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Import from container without signature</translation>
@@ -5155,6 +6750,10 @@ Available commands:
<translation>Import from container with certificate</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Do you want to trust %1 with the fingerprint of %2 from %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Not this time</translation>
</message>
@@ -5171,18 +6770,6 @@ Available commands:
<translation>Just this time</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Import from %1 failed (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Import from %1 successful (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Imported from %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Signed share container are not supported - import prevented</translation>
</message>
@@ -5222,25 +6809,20 @@ Available commands:
<source>Unknown share container type</source>
<translation>Unknown share container type</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Overwriting signed share container is not supported - export prevented</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Could not write export container (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Overwriting unsigned share container is not supported - export prevented</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import from %1 failed (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Could not write export container</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import from %1 successful (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Unexpected export error occurred</translation>
+ <source>Imported from %1</source>
+ <translation>Imported from %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5255,10 +6837,6 @@ Available commands:
<translation>Export to %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Do you want to trust %1 with the fingerprint of %2 from %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Multiple import source path to %1 in %2</translation>
</message>
@@ -5266,22 +6844,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>Conflicting export target path %1 in %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Could not embed signature: Could not open file to write (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Could not embed signature: Could not write file (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Could not embed database: Could not open file to write (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Could not embed database: Could not write file (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5329,10 +6891,6 @@ Available commands:
<translation>Setup TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Key:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Default RFC 6238 token settings</translation>
</message>
@@ -5362,16 +6920,46 @@ Available commands:
<translation>Code size:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 digits</translation>
+ <source>Secret Key:</source>
+ <translation>Secret Key:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>Secret key must be in Base32 format</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Secret key field</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algorithm:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Time step field</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 digits</translation>
+ <source> digits</source>
+ <translation> digits</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 digits</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>Invalid TOTP Secret</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Confirm Remove TOTP Settings</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Are you sure you want to delete TOTP settings for this entry?</translation>
</message>
</context>
<context>
@@ -5455,6 +7043,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>Welcome to KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Import from 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Open a recent database</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5478,5 +7074,13 @@ Available commands:
<source>No YubiKey inserted.</source>
<translation>No YubiKey inserted.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Refresh hardware tokens</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardware key slot selection</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_es.ts b/share/translations/keepassx_es.ts
index ddef34d3a..50b17bb43 100644
--- a/share/translations/keepassx_es.ts
+++ b/share/translations/keepassx_es.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
- <translation>Reporte errores en: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
+ <translation>Informar de errores en: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
@@ -50,7 +50,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>Habilitar el Agente de SSH (requiere reinicio)</translation>
+ <translation>Habilitar agente de SSH (requiere reinicio)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@@ -95,12 +95,20 @@
<source>Follow style</source>
<translation>Seguir estilo</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>¿Reiniciar configuración?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>¿Desea reiniciar la configuración general y de seguridad a sus valores por defecto?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
<message>
<source>Basic Settings</source>
- <translation>Configuraciones Básicas</translation>
+ <translation>Configuraciones básicas</translation>
</message>
<message>
<source>Startup</source>
@@ -111,18 +119,6 @@
<translation>Inicie solo una instancia de KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Recordar última base de datos</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Recordar los últimos archivos de llaves y el dongle de seguridad</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Abrir base de datos anterior al inicio</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimizar la ventana al iniciar</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Usar icono del grupo en la creación de entrada</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimizar al copiar al portapapeles</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Ocultar entrada del panel de vista previa</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Ocultar la ventana a la bandeja del sistema cuando se minimiza</translation>
</message>
<message>
- <source>Language</source>
- <translation>Idioma</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Autoescritura</translation>
</message>
@@ -212,7 +200,7 @@
</message>
<message>
<source>Always ask before performing Auto-Type</source>
- <translation>Siempre preguntar antes de hacer autoescritura</translation>
+ <translation>Siempre solicitar antes de hacer autoescritura</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
@@ -220,32 +208,113 @@
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation>Escribiendo retardo de la autoescritura</translation>
+ <translation>Retardo de escritura de la autoescritura</translation>
</message>
<message>
<source> ms</source>
<comment>Milliseconds</comment>
- <translation>Micro segundo</translation>
+ <translation>ms</translation>
</message>
<message>
<source>Auto-Type start delay</source>
- <translation>Iniciar retardo de autoescritura</translation>
+ <translation>Retardo de inicio de autoescritura</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Buscar actualizaciones al inicio de la aplicación.</translation>
+ <source>Movable toolbar</source>
+ <translation>Barra de herramientas móvil</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Incluir pre-lanzamientos al verificar actualizaciones</translation>
+ <source>Remember previously used databases</source>
+ <translation>Recordar anteriores bases de datos usadas</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Barra de herramientas móvil</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Abrir base de datos anterior al inicio</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation>Recordar los últimos archivos de llaves y los «dongle» de seguridad</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Buscar actualizaciones al inicio de la aplicación una vez por semana</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Incluir versiones beta al comprobar actualizaciones</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Estilo del botón:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Idioma:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(reiniciar aplicación para activar)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Minimizar ventana después de desbloquear base de datos</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimizar al abrir una URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Ocultar ventana al copiar al portapapeles</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimizar</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Mover a segundo plano</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Tiempo de espera de descarga de favicon:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Tiempo de espera en segundos de descarga de icono de sitio web</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>seg</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Estilo de botón de barra de herramientas</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Usar fuente monoespacio para Notas</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Estilo del botón</translation>
+ <source>Language selection</source>
+ <translation>Selección de idioma</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Restaurar configuración por defecto</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Atajo global de autoescritura</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Retardo de autoescritura de caracteres</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Retardo de inicio de autoescriturura en milisegundos</translation>
</message>
</context>
<context>
@@ -261,7 +330,7 @@
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>segundos</translation>
+ <translation>seg</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -320,8 +389,29 @@
<translation>Privacidad</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Utilice DuckDuckGo como alternativa para descargar iconos de sitios web</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Usar el servicio DuckDuckGo para descargar iconos de sitio web</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Limpiar portapapeles en segundos</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Reinicio de inactividad de Touch ID</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Tiempo de espera de bloqueo de base de datos en segundos</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Limpiar consulta de búsqueda después</translation>
</message>
</context>
<context>
@@ -344,11 +434,11 @@
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
- <translation>Este comando de autoescritura contiene un retraso muy largo. ¿Realmente desea continuar?</translation>
+ <translation>Este comando de autoescritura contiene un retraso muy largo. ¿Desea continuar?</translation>
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>Este comando de autoescritura contiene pulsaciones de teclas muy lentas. ¿Realmente desea continuar?</translation>
+ <translation>Este comando de autoescritura contiene pulsaciones de teclas muy lentas. ¿Desea continuar?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
@@ -382,7 +472,7 @@
</message>
<message>
<source>Username</source>
- <translation>Nombre de usuario:</translation>
+ <translation>Nombre de usuario</translation>
</message>
<message>
<source>Sequence</source>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copiar nombre de &amp;usuario</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copiar &amp;contraseña</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,12 +500,16 @@
<source>Select entry to Auto-Type:</source>
<translation>Seleccionar entrada para autoescritura:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Buscar...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
<message>
<source>KeePassXC-Browser Confirm Access</source>
- <translation>KeePassXC-Browser Confirmar Acceso</translation>
+ <translation>Confirmación de acceso KeePassXC-Browser</translation>
</message>
<message>
<source>Remember this decision</source>
@@ -421,8 +526,16 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
- <translation>%1 ha solicitado acceso a las contraseñas de los siguientes ítems.
-Por favor seleccione si desea autorizar su acceso.</translation>
+ <translation>%1 ha solicitado acceso a las contraseñas de los siguientes elementos.
+Seleccione si desea autorizar su acceso.</translation>
+ </message>
+ <message>
+ <source>Allow access</source>
+ <translation>Permitir acceso</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Denegar acceso</translation>
</message>
</context>
<context>
@@ -433,7 +546,7 @@ Por favor seleccione si desea autorizar su acceso.</translation>
</message>
<message>
<source>Ok</source>
- <translation>Listo</translation>
+ <translation>Aceptar</translation>
</message>
<message>
<source>Cancel</source>
@@ -442,7 +555,7 @@ Por favor seleccione si desea autorizar su acceso.</translation>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
- <translation>Tienes múltiples bases de datos abiertas.
+ <translation>Tiene múltiples bases de datos abiertas.
Por favor, seleccione la base de datos correcta para guardar las credenciales.</translation>
</message>
</context>
@@ -457,10 +570,6 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
<translation>Esto es necesario para acceder a las bases de datos con KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Permitir la integración de KeepassXC con el Navegador </translation>
- </message>
- <message>
<source>General</source>
<translation>General</translation>
</message>
@@ -526,21 +635,17 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Nunca &amp;pregunte antes de acceder a las credenciales</translation>
+ <translation>Nunca &amp;solicitar antes de acceder a las credenciales</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>No preguntar y guardar los credenciales</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Sólo las bases de datos seleccionadas se conectaran con el cliente.</translation>
+ <translation>No solicitar y guardar los credenciales</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Buscar &amp;h en todas las bases de datos abiertas los credenciales correspondientes</translation>
+ <translation>&amp;Buscar en todas las bases de datos abiertas las credenciales correspondientes</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
@@ -548,7 +653,7 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>Mostra&amp;r campos de caracteres avanzados que comiencen con &quot;KPH: &quot;</translation>
+ <translation>Mostra&amp;r campos de caracteres avanzados que comiencen con «KPH: » </translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
@@ -556,11 +661,11 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>Actualizar &amp;native mensajes al iniciar</translation>
+ <translation>Actualizar archivos manifiesto de mensajería &amp;nativa al iniciar</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
- <translation>Apoya una aplicación proxy entre KeePassXC y una extensión de navegador.</translation>
+ <translation>Soporta una aplicación proxy entre KeePassXC y una extensión de navegador.</translation>
</message>
<message>
<source>Use a &amp;proxy application between KeePassXC and browser extension</source>
@@ -582,7 +687,7 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
- <translation>&lt;b&gt;Advertencia:&lt;/b&gt; Las siguientes opciones pueden ser peligrosas.</translation>
+ <translation>&lt;b&gt;Advertencia:&lt;/b&gt; las siguientes opciones pueden ser peligrosas.</translation>
</message>
<message>
<source>Select custom proxy location</source>
@@ -593,10 +698,6 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
<translation>Navegador &amp;Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Advertencia&lt;/b&gt;, no se encontró la aplicación keepassxc-proxy!&lt;br /&gt;Verifique el directorio de instalación de KeePassXC o confirme la ruta personalizada en las opciones avanzadas.&lt;br /&gt;La integración del navegador NO FUNCIONARÁ sin la aplicación proxy..&lt;br /&gt;Ruta esperada: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Archivos ejecutables</translation>
</message>
@@ -607,26 +708,70 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation>No pedir permiso para Autenticación HTTP &amp;Básica</translation>
+ <translation>No solicitar permiso para autenticación HTTP &amp;básica</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation>Debido al modo aislado de Snap, debes ejecutar un código para permitir la integración con el navegador.&lt;br/&gt;Puedes obtener este código desde %1</translation>
+ <translation>Debido al modo aislado de Snap, debe ejecutar un código para permitir la integración con el navegador.&lt;br/&gt;Puedes obtener este código desde %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation>Por favor ve las instrucciones especiales para el uso de extensiones del navegador debajo.</translation>
+ <translation>Por favor vea las instrucciones especiales para el uso de extensiones del navegador debajo</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser es necesario para que la integración con el navegador funcione. &lt;br /&gt;Descárguelo para %1 y %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Devuelve las credenciales expiradas. La cadena [expirada] es añadida al título.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Permitir devolver credenciales expiradas.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Habilitar integración con navegador</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Los navegadores instalados como snaps no están soportados.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Todas las bases de datos conectadas a la extensión devolverán las credenciales coincidentes.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>No permitir ventana emergente sugiriendo migración de configuración antigua de KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;No preguntar por migración de configuración de KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Ubicación de campo personalizado proxy</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Navegar para archivo personalizado proxy</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Advertencia&lt;/b&gt;, no se encontró la aplicación keepassxc-proxy!&lt;br /&gt;Compruebe el directorio de instalación de KeePassXC o confirme la ruta personalizada en las opciones avanzadas.&lt;br /&gt;La integración del navegador NO FUNCIONARÁ sin la aplicación proxy.&lt;br /&gt;Ruta esperada: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
<message>
<source>KeePassXC: New key association request</source>
- <translation>KeePassXC: Solicitud de asociación de nueva clave</translation>
+ <translation>KeePassXC: solicitud de asociación de nueva clave</translation>
</message>
<message>
<source>You have received an association request for the above key.
@@ -635,9 +780,9 @@ If you would like to allow it access to your KeePassXC database,
give it a unique name to identify and accept it.</source>
<translation>¿Quiere asociar la base de datos al navegador?
-Si quiere autorizar el acceso a la base de datos de KeePassXC,
-proporcione un nombre único para identificar la autorización
-y acepte.</translation>
+Si quiere autorizar el acceso a la base de datos de KeePassXC
+de un nombre único para identificar la autorización
+(se guardará como una entrada más)</translation>
</message>
<message>
<source>Save and allow access</source>
@@ -645,17 +790,17 @@ y acepte.</translation>
</message>
<message>
<source>KeePassXC: Overwrite existing key?</source>
- <translation>KeePassXC: ¿Sobrescribir clave existente?</translation>
+ <translation>KeePassXC: ¿sobrescribir clave existente?</translation>
</message>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
- <translation>Existe una llave con el nombre &quot;%1&quot;.
-¿Quiere sobreescribirlo?</translation>
+ <translation>Existe una llave con el nombre «%1».
+¿Desea sobrescribirlo?</translation>
</message>
<message>
<source>KeePassXC: Update Entry</source>
- <translation>KeePassXC: Actualizar entrada</translation>
+ <translation>KeePassXC: actualizar entrada</translation>
</message>
<message>
<source>Do you want to update the information in %1 - %2?</source>
@@ -681,11 +826,11 @@ Movió %2 claves a datos personalizados.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>%n llave(s) movida(s) a datos propios exitosamente.</numerusform><numerusform>%n llave(s) movida(s) a datos propios exitosamente.</numerusform></translation>
+ <translation><numerusform>%n llave movida a datos propios exitosamente.</numerusform><numerusform>%n llaves movidas a datos propios exitosamente.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation>KeePassXC: ¡No se encontró entrada con los atributos KeePassHTTP!</translation>
+ <translation>KeePassXC: ¡no se encontró entrada con los atributos KeePassHTTP!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
@@ -697,14 +842,14 @@ Movió %2 claves a datos personalizados.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation>KeePassXC: Crear un grupo nuevo</translation>
+ <translation>KeePassXC: crear un grupo nuevo</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation>Una solicitud para crear un nuevo grupo &quot;%1&quot; se ha recibido.
-¿Quiere crear este grupo?
+ <translation>Una solicitud para crear un nuevo grupo «%1» se ha recibido.
+¿Desea crear este grupo?
</translation>
</message>
<message>
@@ -715,16 +860,20 @@ Would you like to migrate your existing settings now?</source>
Es necesario para mantener sus conexiones presentes del navegador.
¿Le gustaría migrar sus configuraciones existentes ahora?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>No mostrar esta advertencia de nuevo</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
<message>
<source>Clone Options</source>
- <translation>Opciones de Clonado</translation>
+ <translation>Opciones de clonado</translation>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>Añadir &apos; - Clon&apos; a título</translation>
+ <translation>Añadir «- Clon» al título</translation>
</message>
<message>
<source>Replace username and password with references</source>
@@ -774,16 +923,12 @@ Es necesario para mantener sus conexiones presentes del navegador.
<translation>El primer registro tiene los nombres de los campos</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Cantidad de líneas a descartar de la cabecera</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
- <translation>Considerar &apos;\&apos; como un carácter de escape </translation>
+ <translation>Considerar «\» como un caracter de escape </translation>
</message>
<message>
<source>Preview</source>
- <translation>Vista anticipada</translation>
+ <translation>Vista previa</translation>
</message>
<message>
<source>Column layout</source>
@@ -819,7 +964,7 @@ Es necesario para mantener sus conexiones presentes del navegador.
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n más mensaje(s) omitidos]</numerusform><numerusform>[%n más mensaje(s) omitidos]</numerusform></translation>
+ <translation><numerusform>[%n mensaje más omitido]</numerusform><numerusform>[%n mensajes más omitidos]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -827,12 +972,28 @@ Es necesario para mantener sus conexiones presentes del navegador.
<translation>Importación CSV: la escritura tiene errores:
% 1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Certificado de texto</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Separación de campo</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Número de líneas de cabecera a descartar</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Previsualización importar CSV </translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n columna(s)</numerusform><numerusform>%n columna(s) </numerusform></translation>
+ <translation><numerusform>%n columna</numerusform><numerusform>%n columnas</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -841,11 +1002,11 @@ Es necesario para mantener sus conexiones presentes del navegador.
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte(s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
+ <translation><numerusform>%n byte</numerusform><numerusform>%n bytes</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n fila(s)</numerusform><numerusform>%n fila(s)</numerusform></translation>
+ <translation><numerusform>%n fila</numerusform><numerusform>%n filas</numerusform></translation>
</message>
</context>
<context>
@@ -868,16 +1029,34 @@ Es necesario para mantener sus conexiones presentes del navegador.
<translation>Error al leer la base de datos: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>No se pudo guardar, la base de datos no tiene nombre de archivo.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>El archivo no se puede escribir, ya que se ha abierto en modo de solo lectura.</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
- <translation>Llave no está transformada. Esto es un bug, por favor, ¡informe sobre él a los desarrolladores!</translation>
+ <translation>Llave no está transformada. Esto es un bug, por favor, informe sobre él a los desarrolladores</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Copiar de seguridad de base de datos ubicada en %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>No se puede guardar, la base de datos no apunta a un archivo válido.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>No se puede guardar, el archivo de base de datos es de solo lectura.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>La base de datos tiene cambios no combinados.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Papelera de reciclaje</translation>
</message>
</context>
<context>
@@ -890,30 +1069,14 @@ Es necesario para mantener sus conexiones presentes del navegador.
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Ingrese la clave maestra</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Archivo llave:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Contraseña:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Navegar</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Actualizar</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Desafío/respuesta:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Formato de archivo llave heredado</translation>
</message>
@@ -923,7 +1086,7 @@ unsupported in the future.
Please consider generating a new key file.</source>
<translation>Está utilizando un formato de archivo llave heredado que puede convertirse
- en no soportado en el futuro.
+en no soportado en el futuro.
Considere generar un nuevo archivo llave.</translation>
</message>
@@ -944,20 +1107,100 @@ Considere generar un nuevo archivo llave.</translation>
<translation>Seleccionar archivo llave</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID para desbloquear rápidamente</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Fallo al abrir archivo de clave: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Incapaz de abrir la base de datos:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Seleccionar ranura...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>No se puede abrir el archivo llave:
-% 1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Desbloquear base de datos KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Introducir contraseña:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de contraseña</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Intercambiar visibilidad de contraseña</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Introducir credenciales adicionales:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Selección de archivo de llave </translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Selección de ranura de clave hardware</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Navegar para un fichero de claves</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Navegar...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Actualizar «tokens» hardware</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Clave hardware:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Puede usar una clave de seguridad hardware como &lt;strong&gt;YubiKey&lt;/strong&gt; o&lt;strong&gt;OnlyKey&lt;/strong&gt; con ranuras configuradas para HMAC-SHA1.&lt;/p&gt;
+&lt;p&gt;Clic para más información...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Ayuda de clave hardware</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID para desbloqueo rápido</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Limpiar</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Limpiar archivo de clave</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Seleccionar archivo...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Desbloqueo fallido y sin contraseña proporcionada</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Desbloquear la base de datos ha fallado y no introdujo una contraseña.
+¿Desea reintentar con una contraseña vacía?
+
+Para prevenir que aparezca este error, debe ir a «Configuración de base de datos / Seguridad» y reiniciar su contraseña.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Reintentar con contraseña vacía</translation>
</message>
</context>
<context>
@@ -983,15 +1226,15 @@ Considere generar un nuevo archivo llave.</translation>
</message>
<message>
<source>Master Key</source>
- <translation>Clave Maestra</translation>
+ <translation>Clave maestra</translation>
</message>
<message>
<source>Encryption Settings</source>
- <translation>Configuraciones de Cifrado</translation>
+ <translation>Configuraciones de cifrado</translation>
</message>
<message>
<source>Browser Integration</source>
- <translation>Integración con Navegadores</translation>
+ <translation>Integración con navegadores</translation>
</message>
</context>
<context>
@@ -1006,7 +1249,7 @@ Considere generar un nuevo archivo llave.</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation>Olvíd&amp;e todas las configuraciones específicas del sitio en las entradas</translation>
+ <translation>Olvid&amp;ar todas las configuraciones específicas del sitio en las entradas</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
@@ -1049,12 +1292,12 @@ Esto puede impedir la conexión con el complemento del navegador.</translation>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation>¿Realmente quieres desconectar todos los navegadores?
+ <translation>¿Desea desconectar todos los navegadores?
Esto puede impedir la conexión con el complemento del navegador.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
- <translation>KeePassXC: No se encontró ninguna clave</translation>
+ <translation>KeePassXC: no se encontró ninguna clave</translation>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
@@ -1062,20 +1305,20 @@ Esto puede impedir la conexión con el complemento del navegador.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
- <translation>KeePassXC: Las claves se eliminaron de la base de datos</translation>
+ <translation>KeePassXC: las claves se eliminaron de la base de datos</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Quitada(s) exitosamente %n llaves de cifrado de la configuración KeePassXC.</numerusform><numerusform>Quitada(s) exitosamente %n llaves de cifrado de la configuración KeePassXC.</numerusform></translation>
+ <translation><numerusform>Quitada con éxito %n llave de cifrado de configuración de KeePassXC.</numerusform><numerusform>Eliminadas con éxito %n llaves de cifrado de configuración de KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation>Olvíde todas las configuraciones específicas del sitio en las entradas</translation>
+ <translation>Olvidar todas las configuraciones específicas del sitio en las entradas</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation>¿Realmente quieres olvidar todas las configuraciones específicas del sitio en cada entrada?
+ <translation>¿Desea olvidar todas las configuraciones específicas del sitio en cada entrada?
Los permisos para acceder a las entradas serán revocados.</translation>
</message>
<message>
@@ -1088,15 +1331,15 @@ Los permisos para acceder a las entradas serán revocados.</translation>
</message>
<message>
<source>KeePassXC: Removed permissions</source>
- <translation>KeePassXC: Permisos eliminados</translation>
+ <translation>KeePassXC: permisos eliminados</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Removidos con éxito permisos de %n entrada(s).</numerusform><numerusform>Removidos con éxito permisos de %n entrada(s).</numerusform></translation>
+ <translation><numerusform>Eliminados con éxito permisos de %n entrada.</numerusform><numerusform>Eliminados con éxito permisos de %n entradas.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
- <translation>KeePassXC: ¡No se encontró ninguna entrada con permisos!</translation>
+ <translation>KeePassXC: ¡no se encontró ninguna entrada con permisos!</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
@@ -1112,6 +1355,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>¿Realmente desea mover todos los datos de integración del navegador heredado al último estándar?
Esto es necesario para mantener la compatibilidad con el complemento del navegador.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Claves de navegador almacenadas</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Eliminar clave seleccionada</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1149,7 +1400,7 @@ Esto es necesario para mantener la compatibilidad con el complemento del navegad
</message>
<message>
<source>Decryption Time:</source>
- <translation>Tiempo de Descifrado:</translation>
+ <translation>Tiempo de descifrado:</translation>
</message>
<message>
<source>?? s</source>
@@ -1242,7 +1493,7 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!<
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>hilo(s)</numerusform><numerusform>hilo(s)</numerusform></translation>
+ <translation><numerusform>hilo</numerusform><numerusform>hilos</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1254,6 +1505,57 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!<
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Cambiar el tiempo de descifrado</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Tiempo de descifrado en segundos</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Formato de base de datos</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Algoritmo de cifrado</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Función de derivación de la llave</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Rondas de transformación</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Uso de memoria</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Paralelismo</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Exponer entradas</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>No e&amp;xponer esta base de datos</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Exponer entradas &amp;bajo este grupo:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Habilitar servicio de secretos fd.o para acceder a esta configuración.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1275,7 +1577,7 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!<
</message>
<message>
<source>History Settings</source>
- <translation>Configuración del Historial</translation>
+ <translation>Configuración del historial</translation>
</message>
<message>
<source>Max. history items:</source>
@@ -1287,7 +1589,7 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!<
</message>
<message>
<source> MiB</source>
- <translation>MiB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1301,6 +1603,40 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!<
<source>Enable &amp;compression (recommended)</source>
<translation>Habilitar &amp;compresión (recomendado)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Campo nombre de base de datos</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Campo descripción de base de datos</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Campo nombre de usuario por defecto</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Número máximo de elementos de historial por entrada</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Tamaño máximo de historial por entrada</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Eliminar papelera de reciclaje</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>¿Desea eliminar los contenidos actuales de la papelera de reciclaje?
+Esta acción no es reversible.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(viejo)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1346,19 +1682,19 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!<
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation>¡Debe agregar al menos una clave de cifrado para proteger su base de datos!</translation>
+ <translation>¡Debe añadir al menos una clave de cifrado para proteger su base de datos!</translation>
</message>
<message>
<source>No password set</source>
- <translation>Sin contraseña establecida</translation>
+ <translation>Contraseña no establecida</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation>¡ADVERTENCIA! No has establecido una contraseña. Se desaconseja el uso de una base de datos sin contraseña.
+ <translation>¡ADVERTENCIA! No ha establecido una contraseña. Se desaconseja el uso de una base de datos sin contraseña.
-¿Seguro que quieres continuar sin contraseña?</translation>
+¿Desea continuar sin contraseña?</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1368,6 +1704,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>Error al cambiar la clave maestra</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Continuar sin contraseña</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1379,6 +1719,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Descripción:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Campo nombre de base de datos</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Campo descripción de base de datos</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Estadísticas</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Ratón sobre líneas con iconos de error para información adicional.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valor</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Nombre de la base de datos</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descripción</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Localización</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Última guardada</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Cambios no guardados</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>sí</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>no</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>La base de datos fue modificada pero los cambios no han sido guardados a disco todavía.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Número de grupos</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Número de entradas</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Número de entradas expiradas</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>La base de datos contiene entradas que han expirado.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Contraseñas únicas</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Contraseñas no únicas</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Más del 10% de las contraseñas son reusadas. Use contraseñas únicas si es posible.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Reuso máximo de contraseña</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Algunas contraseñas son usadas más de tres veces. Use contraseñas únicas si es posible.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Número de contraseñas cortas</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>La longitud mínima recomendada de contraseña es de al menos 8 caracteres.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Número de contraseñas débiles</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Se recomienda usar largas contraseñas aleatorias con una calificación de «buena» o «excelente».</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Longitud media de contraseña</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 caracteres</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>La longitud media de contraseña es menos de diez caracteres. Las contraseñas más largas proporcionan más seguridad.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1400,7 +1863,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Merge database</source>
- <translation>Unir base de datos</translation>
+ <translation>Combinar base de datos</translation>
</message>
<message>
<source>Open KeePass 1 database</source>
@@ -1426,11 +1889,7 @@ Are you sure you want to continue without a password?</source>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
<translation>La base de datos creada no tiene clave o KDF, negándose a guardarla.
-Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</translation>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>El archivo de base de datos no existe o no es accesible.</translation>
+Esto es definitivamente un error, por favor infórmelo a los desarrolladores.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1455,6 +1914,30 @@ Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</t
<comment>Database tab name modifier</comment>
<translation>%1 [Sólo lectura]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Fallo al abrir %1. No existe o no es accesible.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Exportar base de datos a archivo HTML</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>Archivo HTML</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Fallo escribiendo a archivo HTML.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Confirmación de exportación</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Está a punto de exportar su base de datos a un archivo sin cifrar. Esto dejará sus contraseñas e información sensible vulnerable. ¿Desea continuar?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1464,15 +1947,15 @@ Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</t
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
- <translation>¿Realmente quiere eliminar la entrada &quot;%1&quot; de forma definitiva?</translation>
+ <translation>¿Realmente quiere eliminar la entrada «%1» de forma definitiva?</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
- <translation>¿Realmente quiere mover la entrada &quot;%1&quot; a la papelera de reciclaje?</translation>
+ <translation>¿Realmente quiere mover la entrada «%1» a la papelera de reciclaje?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>¿Estás seguro de mover %n entrada(s) a la papelera de reciclaje?</numerusform><numerusform>¿Realmente desea mover %n entrada(s) a la papelera de reciclaje?</numerusform></translation>
+ <translation><numerusform>¿Desea mover %n entrada a la papelera de reciclaje?</numerusform><numerusform>¿Desea mover %n entradas a la papelera de reciclaje?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1480,7 +1963,7 @@ Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</t
</message>
<message>
<source>Do you really want to execute the following command?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</source>
- <translation>¿Realmente desea ejecutar el siguiente comando?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
+ <translation>¿Desea ejecutar el siguiente comando?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
</message>
<message>
<source>Remember my choice</source>
@@ -1488,7 +1971,7 @@ Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</t
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation>¿Realmente quiere eliminar el grupo &quot;%1&quot; de forma definitiva?</translation>
+ <translation>¿Desea eliminar el grupo «%1» de forma definitiva?</translation>
</message>
<message>
<source>No current database.</source>
@@ -1500,7 +1983,7 @@ Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</t
</message>
<message>
<source>Search Results (%1)</source>
- <translation>Resultado de búsqueda (%1)</translation>
+ <translation>Resultados de búsqueda (%1)</translation>
</message>
<message>
<source>No Results</source>
@@ -1516,12 +1999,12 @@ Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</t
</message>
<message>
<source>Merge Request</source>
- <translation>Solicitud de Unión</translation>
+ <translation>Solicitud de combinación</translation>
</message>
<message>
<source>The database file has changed and you have unsaved changes.
Do you want to merge your changes?</source>
- <translation>El archivo de la base de datos ha cambiado y usted tiene modificaciones sin guardar. ¿Desea unir sus modificaciones?</translation>
+ <translation>El archivo de la base de datos ha cambiado y usted tiene modificaciones sin guardar. ¿Desea combinar sus modificaciones?</translation>
</message>
<message>
<source>Empty recycle bin?</source>
@@ -1529,23 +2012,19 @@ Do you want to merge your changes?</source>
</message>
<message>
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
- <translation>¿Está seguro que quiere eliminar permanentemente todo de su papelera de reciclaje?</translation>
+ <translation>¿Desea eliminar permanentemente todo de su papelera de reciclaje?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>¿Realmente quiere eliminar %n entrada(s) de forma definitiva?</numerusform><numerusform>¿Realmente quiere eliminar %n entrada(s) de forma definitiva?</numerusform></translation>
+ <translation><numerusform>¿Desea eliminar %n entrada para siempre?</numerusform><numerusform>¿Desea eliminar %n entradas para siempre?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>¿Borrar entrada(s)?</numerusform><numerusform>¿Borrar entrada(s)?</numerusform></translation>
+ <translation><numerusform>¿Eliminar entrada?</numerusform><numerusform>¿Eliminar entradas?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>¿Mover entrada(s) a la papelera de reciclaje?</numerusform><numerusform>¿Mover entrada(s) a la papelera de reciclaje?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Archivo abierto en modo sólo lectura.</translation>
+ <translation><numerusform>¿Mover entrada a la papelera de reciclaje?</numerusform><numerusform>¿Mover entradas a la papelera de reciclaje?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1553,12 +2032,12 @@ Do you want to merge your changes?</source>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation>Estás editando una entrada. ¿Descartar los cambios y bloquear todos modos?</translation>
+ <translation>Estás editando una entrada. ¿Descartar los cambios y bloquear de todos modos?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
- <translation>&quot;%1&quot; ha sido modificado.
+ <translation>«%1» ha sido modificado.
¿Guardar cambios?</translation>
</message>
<message>
@@ -1585,13 +2064,7 @@ Error: %1</translation>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
<translation>KeePassXC no ha podido guardar la base de datos varias veces. Esto es probablemente causado por los servicios de sincronización de archivos manteniendo un bloqueo en el archivo.
-¿Desactivar la guarda segura y volver a intentarlo?</translation>
- </message>
- <message>
- <source>Writing the database failed.
-%1</source>
- <translation>Fallo al escribir en la base de datos.
-%1</translation>
+¿Desactivar el guardado seguro y volver a intentarlo?</translation>
</message>
<message>
<source>Passwords</source>
@@ -1611,7 +2084,7 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>La(s) entrada(s) &quot;%1&quot; tiene(n) %2 referencia(s). ¿Desea sobrescribir la(s) referencia(s) con los valor(es), saltarse esta entrada o borrarla de todos modos?</numerusform><numerusform>La(s) entrada(s) &quot;%1&quot; tiene(n) %2 referencia(s). ¿Desea sobrescribir la(s) referencia(s) con los valor(es), saltarse esta entrada o borrarla de todos modos?</numerusform></translation>
+ <translation><numerusform>La entrada &quot;%1&quot; tiene %2 referencia. ¿Desea sobrescribir la referencia con el valor, saltarse esta entrada o borrarla de todos modos?</numerusform><numerusform>La entrada «%1» tiene %2 referencias. ¿Desea sobrescribir las referencias con los valores, omitir esta entrada o eliminarla de todos modos?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1623,20 +2096,28 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation>¿Realmente desea mover el grupo &quot;%1&quot; a la papelera de reciclaje?</translation>
+ <translation>¿Desea mover el grupo «%1» a la papelera de reciclaje?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation>Unido correctamente los archivos de base de datos.</translation>
+ <translation>Combinados correctamente los archivos de base de datos.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation>La base de datos no fue modificada por la operación de unir</translation>
+ <translation>La base de datos no fue modificada por la operación de combinar.</translation>
</message>
<message>
<source>Shared group...</source>
<translation>Grupo compartido...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Fallo al escribir la base de datos: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Esta base de datos está abierta en modo solo lectura. El autoguardado está deshabilitado.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1674,7 +2155,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>(encrypted)</source>
- <translation>(encriptado)</translation>
+ <translation>(cifrado)</translation>
</message>
<message>
<source>Select private key</source>
@@ -1702,7 +2183,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Different passwords supplied.</source>
- <translation>Las contraseñas ingresadas son distintas.</translation>
+ <translation>Las contraseñas proporcionadas son diferentes.</translation>
</message>
<message>
<source>New attribute</source>
@@ -1710,7 +2191,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>¿Está seguro que desea eliminar este atributo?</translation>
+ <translation>¿Desea eliminar este atributo?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1718,11 +2199,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n semana(s)</numerusform><numerusform>%n semana(s)</numerusform></translation>
+ <translation><numerusform>%n semana</numerusform><numerusform>%n semanas</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n mes(es)</numerusform><numerusform>%n mes(es)</numerusform></translation>
+ <translation><numerusform>%n mes</numerusform><numerusform>%n meses</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1750,11 +2231,23 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n año(s)</numerusform><numerusform>%n año(s)</numerusform></translation>
+ <translation><numerusform>%n año</numerusform><numerusform>%n años</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
- <translation>Confirmar la Eliminación</translation>
+ <translation>Confirmar la eliminación</translation>
+ </message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integración con navegadores</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>¿Desea eliminar esta URL?</translation>
</message>
</context>
<context>
@@ -1773,7 +2266,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit Name</source>
- <translation>Editar Nombre</translation>
+ <translation>Editar nombre</translation>
</message>
<message>
<source>Protect</source>
@@ -1795,6 +2288,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>Color de fondo:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Selección de atributo</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Valor de atributo</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Añadir nuevo atributo</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Eliminar atributo seleccionado</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Editar atributo nombre</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Intercambiar atributo protección</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Mostrar un atributo protegido</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Selección de color de primer plano</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Selección de color de fondo</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1812,7 +2341,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Window Associations</source>
- <translation>Ventanas Asociadas</translation>
+ <translation>Ventanas asociadas</translation>
</message>
<message>
<source>+</source>
@@ -1830,6 +2359,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation>Utilizar una secuencia específica para esta asociación:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Secuencia personalizada autoescritura</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Abrir página de ayuda autoescritura</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Asociaciones de ventana existentes</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Añadir nueva asociación de ventana</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Eliminar asociación de ventana</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Puede usar un asterisco (*) par coincidir todo.</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Establecer título de asociación de ventana</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Puede usar un asterisco par coincidir todo.</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Secuencia personalizada de autoescritura para esta ventana</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Esta configuración afecta al comportamiento de esta entrada con la extensión del navegador.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Omitir autoenvío para esta entrada</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Ocultar esta entrada de la extensión del navegador</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>URLs adicionales</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Añadir</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Eliminar</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Editar</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2449,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>Eliminar todo</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Selección de entrada de historial</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Mostrar entrada en historial seleccionado</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Restaurar entrada al estado historial seleccionado</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Eliminar el historial seleccionado</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Eliminar todo el historial</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1878,7 +2498,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation>Cambie la casilla de verificación para mostrar la sección de notas.</translation>
+ <translation>Intercambiar la casilla de verificación para mostrar la sección de notas.</translation>
</message>
<message>
<source>Username:</source>
@@ -1888,6 +2508,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>Expira</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Campo URL</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Descargar favicon para URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Campo repetir contraseña</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Intercambiar generador de contraseña</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de contraseña</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Intercambiar visibilidad de contraseña</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Intercambiar notas visibles</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Campo expiración</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Predeterminados expiración</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Predeterminados expiración</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo notas</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Campo título</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Campo nombre de usuario</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Intercambiar expiración</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1913,7 +2589,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Public key</source>
- <translation>Llave Pública</translation>
+ <translation>Llave pública</translation>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
@@ -1937,7 +2613,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Private key</source>
- <translation>Llave Privada</translation>
+ <translation>Llave privada</translation>
</message>
<message>
<source>External file</source>
@@ -1964,6 +2640,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>Requiere confirmación del usuario cuando se usa esta llave</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Eliminar clave del agente después de los segundos especificados</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Navegar para fichero de claves</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Fichero de claves externa</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Seleccionar archivo adjunto</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1999,6 +2691,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>Heredar del grupo padre (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>La entrada tiene cambios sin guardar</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,68 +2723,99 @@ Disable safe saves and try again?</source>
<translation>Inactivo</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importar desde ruta</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Contenedor KeeShare sin firma</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>Contenedor KeeShare firmado</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportar a ruta</translation>
+ <source>Select import source</source>
+ <translation>Seleccione el origen de la importación</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Sincronizar con ruta</translation>
+ <source>Select export target</source>
+ <translation>Seleccionar el destino de la exportación</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Su versión de KeePassXC no admite compartir su tipo de contenedor. Por favor use %1.</translation>
+ <source>Select import/export file</source>
+ <translation>Seleccione el archivo de importación/exportación</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Compartir la base de datos está deshabilitado</translation>
+ <source>Clear</source>
+ <translation>Limpiar</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>La exportación de la base de datos está deshabilitada</translation>
+ <source>Import</source>
+ <translation>Importar</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>La importación de la base de datos está deshabilitada</translation>
+ <source>Export</source>
+ <translation>Exportar</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Contenedor KeeShare sin firma</translation>
+ <source>Synchronize</source>
+ <translation>Sincronizar</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Contenedor KeeShare firmado</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Su versión de KeePassXC no soporta este tipo de contenedor de compartición.
+Las extensiones soportadas son: %1.</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Seleccione el origen de la importación</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 ya está siendo exportada por esta base de datos.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Seleccionar el destino de la exportación</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 ya está siendo exportada por esta base de datos.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Seleccione el archivo de importación/exportación</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 ya está siendo importada y exportada por diferentes grupos en esta base de datos.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Limpiar</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare actualmente está deshabilitada. Puede habilitar importar/exportar en la configuración de aplicación</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>La exportación de la base de datos actualmente está deshabilitada en la configuración de aplicación.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>La importación de base de datos actualmente está deshabilitada por la configuración de aplicación</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Campo modo comapartir</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Ruta para campo de archivo compartir</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Navegar para un archivo compartir</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de contraseña</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>El contenedor de exportación %1 ya es referenciado.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Intercambiar visibilidad de contraseña</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>El contenedor de importación %1 ya es importado.</translation>
+ <source>Toggle password generator</source>
+ <translation>Intercambiar generador de contraseñas</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>El contenedor %1 se importa y se exporta por grupos diferentes.</translation>
+ <source>Clear fields</source>
+ <translation>Limpiar campos</translation>
</message>
</context>
<context>
@@ -2121,6 +2848,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Seleccionar se&amp;cuencia de autoescritura por defecto</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Campo nombre</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo notas</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Intercambiar expiración</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Intercambiar autoescritura para este y subgrupos</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Campo de expiración</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Intercambiar de búsqueda para este y subgrupos</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Campo por defecto de secuencia de autoescritura</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2146,7 +2901,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>No se pudo descargar el favicon</translation>
+ <translation>No se pudo descargar el favicon.</translation>
</message>
<message>
<source>Images</source>
@@ -2157,20 +2912,8 @@ Disable safe saves and try again?</source>
<translation>Todos los archivos</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>El icono personalizado ya existe</translation>
- </message>
- <message>
<source>Confirm Delete</source>
- <translation>Confirmar Eliminación</translation>
- </message>
- <message>
- <source>Custom icon successfully downloaded</source>
- <translation>Icono personalizado descargado exitosamente</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Sugerencia: puede habilitar DuckDuckGo como una alternativa en Herramientas&gt; Configuración&gt; Seguridad</translation>
+ <translation>Confirmar eliminación</translation>
</message>
<message>
<source>Select Image(s)</source>
@@ -2178,7 +2921,7 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Cargado(s) %1 de %n ícono(s) exitosamente</numerusform><numerusform>Cargado(s) %1 de %n ícono(s) exitosamente</numerusform></translation>
+ <translation><numerusform>Cargado(s) %1 de %n ícono exitosamente</numerusform><numerusform>Cargado(s) %1 de %n iconos exitosamente</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2186,15 +2929,51 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>El/Los ícono(s) %n ya existe(n) en la base de datos</numerusform><numerusform>El/Los ícono(s) %n ya existe(n) en la base de datos</numerusform></translation>
+ <translation><numerusform>%n ícono ya existe en la base de datos</numerusform><numerusform>%n íconos ya existen en la base de datos</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>El/Los siguiente(s) ícono(s) fallaron:</numerusform><numerusform>El/Los siguiente(s) ícono(s) fallaron:</numerusform></translation>
+ <translation><numerusform>El siguiente icono falló:</numerusform><numerusform>Los siguientes iconos fallaron:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Este ícono es usado en %1 entrada(s), y será remplazado por el ícono por defecto. ¿Está seguro que desea eliminarlo?</numerusform><numerusform>Este ícono es usado en %1 entrada(s), y será remplazado por el ícono por defecto. ¿Está seguro que desea eliminarlo?</numerusform></translation>
+ <translation><numerusform>Este icono se utiliza en %n entrada, y será remplazado por el icono por defecto. ¿Desea eliminarlo?</numerusform><numerusform>Este icono se utiliza en %n entradas, y será remplazado por el icono por defecto. ¿Desea eliminarlo?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Puede habilitar el servicio de icono del sitio web DuckDuckGo bajo «Herramientas -&gt; Configuración -&gt; Seguridad»</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Descargar favicon para URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Aplicar icono selecionado a subgrupos y entradas</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Aplicar icono &amp;a...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Aplicar solo a esta</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Aplicar a los grupos hijos</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Aplicar también a las entradas hijos</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Aplicar a todos los hijos</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Icono existente seleccionado.</translation>
</message>
</context>
<context>
@@ -2241,6 +3020,30 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<source>Value</source>
<translation>Valor</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Fecha de creación</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Fecha de modificación</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Fecha de acceso</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>ID único</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Complemente de datos</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Eliminar complemento de datos seleccionado</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2288,7 +3091,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>¿Confirma que desea quitar %n dato(s) adjunto(s)?</numerusform><numerusform>¿Confirme que desea remover %n dato(s) adjunto(s)?</numerusform></translation>
+ <translation><numerusform>¿Desea eliminar %n adjunto?</numerusform><numerusform>¿Desea eliminar %n adjuntos?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2302,11 +3105,11 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation>¿Está seguro que quiere sobrescribir el archivo existente &quot;%1&quot; con el archivo adjunto?</translation>
+ <translation>¿Desea sobrescribir el archivo existente «%1» con el archivo adjunto?</translation>
</message>
<message>
<source>Confirm overwrite</source>
- <translation>Confirmar sobreescritura</translation>
+ <translation>Confirmar sobrescritura</translation>
</message>
<message>
<source>Unable to save attachments:
@@ -2333,10 +3136,30 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>No se puede(n) abrir el/los archivo(s):
-%1</numerusform><numerusform>No se puede(n) abrir el/los archivo(s):
+ <translation><numerusform>Incapaz de abrir el archivo:
+%1</numerusform><numerusform>Incapaz de abrir los archivos:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Adjuntos</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Añadir nuevo adjunto</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Eliminar adjunto seleccionado</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Abrir adjunto seleccionado</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Guardar adjunto seleccionado a disco</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2357,7 +3180,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Username</source>
- <translation>Nombre de usuario:</translation>
+ <translation>Nombre de usuario</translation>
</message>
<message>
<source>URL</source>
@@ -2381,7 +3204,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Username</source>
- <translation>Nombre de usuario:</translation>
+ <translation>Nombre de usuario</translation>
</message>
<message>
<source>URL</source>
@@ -2431,10 +3254,6 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generar Token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Cerrar</translation>
</message>
@@ -2444,7 +3263,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Username</source>
- <translation>Nombre de usuario:</translation>
+ <translation>Nombre de usuario</translation>
</message>
<message>
<source>Password</source>
@@ -2452,7 +3271,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Expiration</source>
- <translation>Vencimiento</translation>
+ <translation>Expiración</translation>
</message>
<message>
<source>URL</source>
@@ -2484,7 +3303,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Searching</source>
- <translation>Buscando...</translation>
+ <translation>Buscar</translation>
</message>
<message>
<source>Search</source>
@@ -2519,12 +3338,20 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<source>Share</source>
<translation>Compartir</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Mostrar valor actual TOTP</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avanzado</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
<message>
<source>Customize View</source>
- <translation>Personalizar Vista</translation>
+ <translation>Personalizar vista</translation>
</message>
<message>
<source>Hide Usernames</source>
@@ -2532,7 +3359,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message>
<source>Hide Passwords</source>
- <translation>Ocultar Contraseñas</translation>
+ <translation>Ocultar contraseñas</translation>
</message>
<message>
<source>Fit to window</source>
@@ -2552,11 +3379,33 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Papelera de reciclaje</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Entrada «%1» de la base de datos «%2» fue usada por %3</translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Fallo al registrar el servicio DBus en %1: otro servicio de secretos está corriendo.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n entrada fue usada por %1</numerusform><numerusform>%n entradas fueron usadas por %1</numerusform></translation>
</message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Servicio de secretos Fdo: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2567,7 +3416,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<name>HostInstaller</name>
<message>
<source>KeePassXC: Cannot save file!</source>
- <translation>KeePassXC: ¡No se puede guardar el archivo!</translation>
+ <translation>KeePassXC: ¡no se puede guardar el archivo!</translation>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
@@ -2575,6 +3424,59 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Descargar favicons</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>¿Problemas al descargar iconos?
+Puede habilitar el servicio de iconos del sitio web DuckDuckGo en la sección seguridad de la configuración de la aplicación.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Estado</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Espere, procesando lista de entradas...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Descargando...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Aceptar</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Ya existe</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Descarga fallida</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Descargando favicons (%1%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2596,10 +3498,6 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<translation>No se pudo hacer el desafío/respuesta:</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>La contraseña es incorrecta o el archivo de la base de datos está dañado.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>faltan las cabeceras de la base de datos</translation>
</message>
@@ -2619,6 +3517,12 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<source>Invalid header data length</source>
<translation>Longitud del campo de datos en la cabecera incorrecto</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Se han proporcionado credenciales inválidas, inténtelo de nuevo.
+Si ocurre nuevamente entonces su archivo de base de datos puede estar corrupto.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2650,10 +3554,6 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<translation>Cabecera SHA256 diferente</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Clave equivocada o base de datos corrupta. (HMAC distinta)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Algoritmo de cifrado desconocido</translation>
</message>
@@ -2726,32 +3626,42 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
<message>
<source>Invalid variant map Int32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Largo inválido en valor de entrada Int32 de mapa variante</translation>
+ <translation>Largo inválido en valor de entrada Int32 de mapeo de variante</translation>
</message>
<message>
<source>Invalid variant map UInt32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Largo inválido en valor de entrada UInt32 de mapa variante</translation>
+ <translation>Largo inválido en valor de entrada UInt32 de mapeo de variante</translation>
</message>
<message>
<source>Invalid variant map Int64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Largo inválido en valor de entrada Int64 de mapa variante</translation>
+ <translation>Largo inválido en valor de entrada Int64 de mapeo de variante</translation>
</message>
<message>
<source>Invalid variant map UInt64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Largo inválido en valor de entrada UInt64 de mapa variante</translation>
+ <translation>Largo inválido en valor de entrada UInt64 de mapeo de variante</translation>
</message>
<message>
<source>Invalid variant map entry type</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Entrada inválida de mapa variante</translation>
+ <translation>Tipo de entrada inválida de mapeo devariante</translation>
</message>
<message>
<source>Invalid variant map field type size</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Tamaño inválido de mapa variante</translation>
+ <translation>Mapei de variante inválido en campo de tipo tamaño</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Se han proporcionado credenciales inválidas, inténtelo de nuevo.
+Si ocurre nuevamente entonces su archivo de base de datos puede estar corrupto.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC no coincidente)</translation>
</message>
</context>
<context>
@@ -2848,7 +3758,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada
<name>KdbxXmlReader</name>
<message>
<source>XML parsing failure: %1</source>
- <translation>Error de parsing XML: %1</translation>
+ <translation>Error de procesado XML: %1</translation>
</message>
<message>
<source>No root group</source>
@@ -2856,7 +3766,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>Falta icono uuid o datos</translation>
+ <translation>Datos o uuid del ícono faltantes</translation>
</message>
<message>
<source>Missing custom data key or value</source>
@@ -2900,7 +3810,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada
</message>
<message>
<source>Invalid entry icon number</source>
- <translation>Número de icono de entrada no válida</translation>
+ <translation>Número de ícono de entrada inválido</translation>
</message>
<message>
<source>History element in history entry</source>
@@ -2932,7 +3842,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada
</message>
<message>
<source>Auto-type association window or sequence missing</source>
- <translation>Falta de secuencia o ventana de asociación de autoescritura</translation>
+ <translation>Falta de secuencia o ventana de Asociación de autoescritura</translation>
</message>
<message>
<source>Invalid bool value</source>
@@ -2969,19 +3879,19 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada
Line %2, column %3</source>
<translation>Error XML:
%1
-Linea %2, columna %3</translation>
+Línea %2, columna %3</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importar base de datos KeePass1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>No se pudo abrir la base de datos.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importar base de datos KeePass1</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3024,7 +3934,7 @@ Linea %2, columna %3</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation>Número de turnos de transformación no válido </translation>
+ <translation>Número de rondas de transformación no válido</translation>
</message>
<message>
<source>Unable to construct group tree</source>
@@ -3039,10 +3949,6 @@ Linea %2, columna %3</translation>
<translation>No se puede calcular la clave maestra</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>La contraseña es incorrecta o el archivo de la base de datos está dañado.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Error en la transformación de la llave</translation>
</message>
@@ -3138,47 +4044,65 @@ Linea %2, columna %3</translation>
<source>unable to seek to content position</source>
<translation>incapaz de buscar la posición de contenido</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Se han proporcionado credenciales inválidas, inténtelo de nuevo.
+Si ocurre nuevamente entonces su archivo de base de datos puede estar corrupto.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Compartir deshabilitado</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Referencia de compartición inválida</translation>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation>Compartición inactiva %1</translation>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importado de %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation>Exportado a %1</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importar desde</translation>
+ <source>Synchronized with %1</source>
+ <translation>Sincronizado con %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Exportar a</translation>
+ <source>Import is disabled in settings</source>
+ <translation>Importar está deshabilitado en configuración</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Sincronizar con</translation>
+ <source>Export is disabled in settings</source>
+ <translation>Exportar está deshabilitado en configuración</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Deshabilitada cuota %1</translation>
+ <source>Inactive share</source>
+ <translation>Compartición inactiva</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importar de cuota %1</translation>
+ <source>Imported from</source>
+ <translation>Importado desde</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportar a cuota %1</translation>
+ <source>Exported to</source>
+ <translation>Exportado a</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Sincronizar con cuota %1</translation>
+ <source>Synchronized with</source>
+ <translation>Sincronizado con</translation>
</message>
</context>
<context>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation>Componente de la Clave</translation>
+ <translation>Componente de la clave</translation>
</message>
<message>
<source>Key Component Description</source>
@@ -3190,7 +4114,7 @@ Linea %2, columna %3</translation>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation>Conjunto de componentes de la Clave, haga clic para cambiar o eliminar</translation>
+ <translation>Conjunto de componentes de la clave, haga clic para cambiar o eliminar</translation>
</message>
<message>
<source>Add %1</source>
@@ -3216,10 +4140,6 @@ Linea %2, columna %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Navegar</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generar</translation>
</message>
@@ -3248,7 +4168,7 @@ Vaya a la configuración de la clave maestra y genere un nuevo fichero de claves
<message>
<source>Error loading the key file '%1'
Message: %2</source>
- <translation>Error al cargar el fichero de claves &apos;%1&apos;
+ <translation>Error al cargar el fichero de claves «%1»
Mensaje: %2</translation>
</message>
<message>
@@ -3261,7 +4181,7 @@ Mensaje: %2</translation>
</message>
<message>
<source>Create Key File...</source>
- <translation>Crear un Archivo Llave ....</translation>
+ <translation>Crear un archivo llave...</translation>
</message>
<message>
<source>Error creating key file</source>
@@ -3275,12 +4195,50 @@ Mensaje: %2</translation>
<source>Select a key file</source>
<translation>Seleccione un archivo llave</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Selección de archivo de llave </translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Navegar para un fichero de claves</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Navegar...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Generar un nuevo fichero de claves</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Nota: no use un archivo que pueda cambiar dado que lo impedirá desbloquear la base de datos.</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Fichero de claves inválido</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>No puede usar la base de datos actual como su propio fichero de claves. Seleccione un archivo diferente o genere un nuevo fichero de claves.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Fichero de claves sospechoso</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>El fichero de claves seleccionado parece una base de datos de contraseñas. Un fichero de claves debe ser un archivo estático que nunca cambie o perderá el acceso a su base de datos para siempre.
+¿Desea continuar con este archivo?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>&amp;Database</source>
- <translation>Base de &amp;Datos</translation>
+ <translation>Base de &amp;datos</translation>
</message>
<message>
<source>&amp;Recent databases</source>
@@ -3363,10 +4321,6 @@ Mensaje: %2</translation>
<translation>&amp;Configuración</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Generador de contraseñas</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Bloquear las bases de datos</translation>
</message>
@@ -3432,13 +4386,13 @@ Mensaje: %2</translation>
</message>
<message>
<source>Please touch the button on your YubiKey!</source>
- <translation>Por favor presione el botón en su YubiKey!</translation>
+ <translation>¡Por favor presione el botón en su YubiKey!</translation>
</message>
<message>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation>ADVERTENCIA: Usted está utilizando una versión inestable de KeePassXC!
+ <translation>ADVERTENCIA: está utilizando una versión inestable de KeePassXC!
Hay un alto riesgo de corrupción, mantenga una copia de seguridad de sus bases de datos.
Esta versión no es para uso de producción.</translation>
</message>
@@ -3448,7 +4402,7 @@ Esta versión no es para uso de producción.</translation>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation>Reportar un &amp;error</translation>
+ <translation>Informar de un &amp;error</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
@@ -3478,11 +4432,11 @@ Le recomendamos que utilice la AppImage disponible en nuestra página de descarg
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation>&amp;Unir desde la base de datos...</translation>
+ <translation>&amp;Combinar desde la base de datos...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
- <translation>Unir desde otra base de datos KDBX</translation>
+ <translation>Combinar desde otra base de datos KDBX</translation>
</message>
<message>
<source>&amp;New entry</source>
@@ -3553,14 +4507,6 @@ Le recomendamos que utilice la AppImage disponible en nuestra página de descarg
<translation>Mostrar código QR TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Buscar actualizaciones ...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Compartir entrada</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOTA: ¡Está utilizando una versión preliminar de KeePassXC!
@@ -3572,12 +4518,80 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation>¿Quieres KeePassXC para comprobar las actualizaciones en el arranque?</translation>
+ <translation>¿Desea que KeePassXC compruebe actualizaciones en el inicio?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
<translation>Siempre se puede comprobar si hay actualizaciones manualmente desde el menú de la aplicación.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Exportar</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Comprobar actualizaciones...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Descarg&amp;ar todos los favicons</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Ordenar &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Ordenar &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Generador de contraseña</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Descargar favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Exportar a archivo HTML...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password Vault...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importar un 1Password Vault</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Guía de inicio</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Abrir la guía de inicio PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>Ayuda en &amp;línea...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Ir a la documentación en línea (abre el navegador)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>Guía de &amp;usuario</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Abrir la guía de usuario PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>Atajos de &amp;teclado</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3623,7 +4637,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation>Borrando hijo %1[%2]</translation>
+ <translation>Eliminando hijo %1[%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
@@ -3637,6 +4651,14 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<source>Adding missing icon %1</source>
<translation>Añadiendo el icono faltante %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Eliminados datos personalizados %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Añadiendo datos personalizados %1 [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3654,15 +4676,15 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<name>NewDatabaseWizardPage</name>
<message>
<source>WizardPage</source>
- <translation>PáginaAsistente</translation>
+ <translation>Asistente</translation>
</message>
<message>
<source>En&amp;cryption Settings</source>
- <translation>Configuraciones de &amp;Cifrado</translation>
+ <translation>Configuraciones de &amp;cifrado</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>Aquí puede ajustar la configuración de cifrado de la base de datos. No se preocupe, puede cambiarlos más adelante en la configuración de la base de datos.</translation>
+ <translation>Aquí puede ajustar la configuración de cifrado de la base de datos. No se preocupe, puede cambiarlo más adelante en la configuración de la base de datos.</translation>
</message>
<message>
<source>Advanced Settings</source>
@@ -3677,22 +4699,22 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<name>NewDatabaseWizardPageEncryption</name>
<message>
<source>Encryption Settings</source>
- <translation>Configuraciones de Cifrado</translation>
+ <translation>Configuraciones de cifrado</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>Aquí puede ajustar la configuración de cifrado de la base de datos. No se preocupe, puede cambiarlos más adelante en la configuración de la base de datos.</translation>
+ <translation>Aquí puede ajustar la configuración de cifrado de la base de datos. No se preocupe, puede cambiarla más adelante en la configuración de la base de datos.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMasterKey</name>
<message>
<source>Database Master Key</source>
- <translation>Llave maestra de la base de datos</translation>
+ <translation>Clave maestra de la base de datos</translation>
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation>Una llave maestra, conocida por usted únicamente, protege su base de datos.</translation>
+ <translation>Una clave maestra, conocida únicamente por usted, protege su base de datos.</translation>
</message>
</context>
<context>
@@ -3703,7 +4725,74 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
- <translation>Por favor complete el nombre, y agregue una descripción opcional, para su nueva base de datos:</translation>
+ <translation>Rellene el nombre y añada una descripción opcional para su nueva base de datos:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>OpData01 inválido, no contiene cabecera</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>No se pueden leer todos los bytes IV, se deseaban 16 pero se obtuvieron %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>No se puede inicializar el cifrado para opdata01: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>No se pueden leer todos los bytes de firma HMAC</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>OpData01 malformado debido a un HMAC fallido</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>No se puede procesar clearText en su lugar</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>Se esperaban %1 bytes de texto plano, se encontraron %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Leer la base de datos no produce una instancia
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>El directorio .opvault debe existir</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>El directorio .opvault debe ser leíble</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>El directorio .opvault/default debe existir</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>El directorio .opvault/default debe ser leíble</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>No se puede decodificar la clave maestra: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>No se puede derivar la clave maestra: %1</translation>
</message>
</context>
<context>
@@ -3742,7 +4831,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation>Sin contenido a desencriptar en llave privada</translation>
+ <translation>Sin contenido a descifrar en llave privada</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
@@ -3750,7 +4839,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
- <translation>Frase de contraseña necesaria para descrifrar esta clave</translation>
+ <translation>Contraseña necesaria para descifrar esta clave</translation>
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
@@ -3758,7 +4847,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation>¿Error de descifrado, frase de contraseña incorrecta?</translation>
+ <translation>Fallo de descifrado, ¿contraseña incorrecta?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
@@ -3806,10 +4895,21 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Contraseñas que no coinciden</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Contraseñas coincidentes hasta el momento</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
- <translation>Ingrese la contraseña</translation>
+ <translation>Introduzca la contraseña</translation>
</message>
<message>
<source>Confirm password:</source>
@@ -3829,7 +4929,23 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Generate master password</source>
- <translation>Generar contraseña maestra</translation>
+ <translation>Generar clave maestra</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de contraseña</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Intercambiar visibilidad de contraseña</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Campo repetir contraseña</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Intercambiar generador de contraseñas</translation>
</message>
</context>
<context>
@@ -3860,24 +4976,12 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<translation>Tipos de caracteres</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Letras mayúsculas</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Letras minúsculas</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Números</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caracteres especiales</translation>
- </message>
- <message>
<source>Extended ASCII</source>
- <translation>ASCII Extendido</translation>
+ <translation>ASCII extendido</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
@@ -3885,7 +4989,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Pick characters from every group</source>
- <translation>Elegir caracteres de todos los grupos</translation>
+ <translation>Seleccionar caracteres de todos los grupos</translation>
</message>
<message>
<source>&amp;Length:</source>
@@ -3893,7 +4997,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Passphrase</source>
- <translation>Frase de contraseña</translation>
+ <translation>Contraseña</translation>
</message>
<message>
<source>Wordlist:</source>
@@ -3901,7 +5005,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Word Separator:</source>
- <translation>Separador de Palabras:</translation>
+ <translation>Separador de palabras:</translation>
</message>
<message>
<source>Copy</source>
@@ -3956,18 +5060,10 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<translation>Avanzado</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Letras mayúsculas de la A hasta la F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Letras minúsculas de la A hasta la F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4000,18 +5096,10 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matemáticas</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!? =</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Guiones</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4041,7 +5129,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Add non-hex letters to &quot;do not include&quot; list</source>
- <translation>Agregar letras no-hexadecimales a la lista de &quot;no incluir&quot;</translation>
+ <translation>Agregar letras no-hexadecimales a la lista de «no incluir»</translation>
</message>
<message>
<source>Hex</source>
@@ -4049,7 +5137,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
- <translation>Caracteres excluidos: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
+ <translation>Caracteres excluidos: «0», «1», «l», «I», «O», «|», « . »</translation>
</message>
<message>
<source>Word Co&amp;unt:</source>
@@ -4059,6 +5147,74 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<source>Regenerate</source>
<translation>Regenerar</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Generar contraseña</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Letras mayúsculas</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Letras minúsculas</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Caracteres especiales</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Símbolos matemáticos</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Guiones y barras</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Excluir caracteres</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Contraseñas hex</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Longitud de contraseña</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Capitalización de palabra:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Regenerar contraseña</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Copiar contraseña</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Aceptar contraseña</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>minúsculas</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>MAYÚSCULAS</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Capitalización de título</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Intercambiar visibilidad de contraseña</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4066,12 +5222,9 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Seleccionar</translation>
+ <source>Statistics</source>
+ <translation>Estadísticas</translation>
</message>
</context>
<context>
@@ -4106,7 +5259,11 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Merge</source>
- <translation>Unir</translation>
+ <translation>Combinar</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuar</translation>
</message>
</context>
<context>
@@ -4153,7 +5310,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>No logins found</source>
- <translation>No se encontraron logins</translation>
+ <translation>No se encontraron inicios de sesión</translation>
</message>
<message>
<source>Unknown error</source>
@@ -4200,16 +5357,12 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<translation>Generar una contraseña para la entrada.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Tamaño de la contraseña a generar</translation>
- </message>
- <message>
<source>length</source>
<translation>Tamaño</translation>
</message>
<message>
<source>Path of the entry to add.</source>
- <translation>Ruta de la entrada para añadir.</translation>
+ <translation>Camino de la entrada para añadir.</translation>
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
@@ -4218,11 +5371,11 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<message>
<source>Path of the entry to clip.</source>
<comment>clip = copy to clipboard</comment>
- <translation>Ruta de la entrada para copiar.</translation>
+ <translation>Camino de la entrada para copiar.</translation>
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
- <translation>Tiempo de espera en segundos antes de borrar el portapapeles.</translation>
+ <translation>Tiempo de espera en segundos antes de limpiar el portapapeles.</translation>
</message>
<message>
<source>Edit an entry.</source>
@@ -4238,7 +5391,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Path of the entry to edit.</source>
- <translation>Ruta de la entrada para editar.</translation>
+ <translation>Camino de la entrada para editar.</translation>
</message>
<message>
<source>Estimate the entropy of a password.</source>
@@ -4253,18 +5406,6 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<translation>Realizar análisis avanzado sobre la contraseña.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extraer e imprimir el contenido de la base de datos.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Ruta a la base de datos a extraer.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Introduzca la contraseña para desbloquear %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4306,15 +5447,11 @@ Comandos disponibles:
</message>
<message>
<source>Merge two databases.</source>
- <translation>Mezclar dos bases de datos.</translation>
- </message>
- <message>
- <source>Path of the database to merge into.</source>
- <translation>Ruta de la base de datos resultado de la mezcla.</translation>
+ <translation>Combinar dos bases de datos.</translation>
</message>
<message>
<source>Path of the database to merge from.</source>
- <translation>Ruta de la base de datos de inicio de la mezcla.</translation>
+ <translation>Ruta de la base de datos de inicio de la combinación.</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
@@ -4366,7 +5503,7 @@ Comandos disponibles:
</message>
<message>
<source>Username</source>
- <translation>Nombre de usuario:</translation>
+ <translation>Nombre de usuario</translation>
</message>
<message>
<source>Password</source>
@@ -4386,11 +5523,7 @@ Comandos disponibles:
</message>
<message>
<source>Browser Integration</source>
- <translation>Integración con Navegadores</translation>
- </message>
- <message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey [%1] Desafío/Respuesta - Ranura %2 - %3</translation>
+ <translation>Integración con navegadores</translation>
</message>
<message>
<source>Press</source>
@@ -4406,11 +5539,11 @@ Comandos disponibles:
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
- <translation>Generar una nueva frase de contraseña aleatoria diceware.</translation>
+ <translation>Generar una nueva contraseña aleatoria diceware.</translation>
</message>
<message>
<source>Word count for the diceware passphrase.</source>
- <translation>Número de palabras para la frase de contraseña de diceware.</translation>
+ <translation>Número de palabras para la contraseña de diceware.</translation>
</message>
<message>
<source>Wordlist for the diceware generator.
@@ -4423,16 +5556,12 @@ Comandos disponibles:
<translation>Generar una nueva contraseña aleatoria.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Valor inválido para el largo de contraseña %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>No pudo crearse la entrada con ruta %1.</translation>
</message>
<message>
<source>Enter password for new entry: </source>
- <translation>Ingrese la contraseña para la nueva entrada:</translation>
+ <translation>Introduzca la contraseña para la nueva entrada:</translation>
</message>
<message>
<source>Writing the database failed %1.</source>
@@ -4440,7 +5569,7 @@ Comandos disponibles:
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation>La entrada se agregó exitosamente %1.</translation>
+ <translation>La entrada se agregó correctamente %1.</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
@@ -4448,7 +5577,7 @@ Comandos disponibles:
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation>Valor inválido para el &quot;timeout&quot; %1.</translation>
+ <translation>Valor inválido para el «timeout» %1.</translation>
</message>
<message>
<source>Entry %1 not found.</source>
@@ -4468,7 +5597,7 @@ Comandos disponibles:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Limpiar el portapapeles en %1 segundo(s)...</numerusform><numerusform>Limpiar el portapapeles en %1 segundo(s)...</numerusform></translation>
+ <translation><numerusform>Limpiar el portapapeles en %1 segundo...</numerusform><numerusform>Limpiar el portapapeles en %1 segundos...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4484,10 +5613,6 @@ Comandos disponibles:
<translation>número</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Valor inválido para el largo de contraseña: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>No se pudo encontrar la entrada con la ruta %1.</translation>
</message>
@@ -4505,7 +5630,7 @@ Comandos disponibles:
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation>Entrada %1 editada exitosamente.</translation>
+ <translation>Entrada %1 editada correctamente.</translation>
</message>
<message>
<source>Length %1</source>
@@ -4521,11 +5646,11 @@ Comandos disponibles:
</message>
<message>
<source>Multi-word extra bits %1</source>
- <translation>Multi-palabra extra bits %1</translation>
+ <translation>Multipalabra extra bits %1</translation>
</message>
<message>
<source>Type: Bruteforce</source>
- <translation>Tipo: Fuerza Bruta</translation>
+ <translation>Tipo: Fuerza bruta</translation>
</message>
<message>
<source>Type: Dictionary</source>
@@ -4537,7 +5662,7 @@ Comandos disponibles:
</message>
<message>
<source>Type: User Words</source>
- <translation>Tipo: Usuario Palabras</translation>
+ <translation>Tipo: Palabras de usuario</translation>
</message>
<message>
<source>Type: User+Leet</source>
@@ -4573,7 +5698,7 @@ Comandos disponibles:
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation>Tipo: Usuario Palabras(Rep)</translation>
+ <translation>Tipo: Palabras de usuario (Rep)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
@@ -4605,33 +5730,13 @@ Comandos disponibles:
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation>*** Longitud de la contraseña (%1) != Suma de la longitud de las partes (%2) ***</translation>
+ <translation>*** Longitud de la contraseña (%1) != suma de la longitud de las partes (%2) ***</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
<translation>Error al cargar el fichero de claves %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>El archivo %1 no existe.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Incapaz de abrir el archivo %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Error al leer la base de datos:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Error al analizar la base de datos:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Longitud de la contraseña generada</translation>
</message>
@@ -4644,10 +5749,6 @@ Comandos disponibles:
<translation>Usar caracteres en mayúscula</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Usar números.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Usar caracteres especiales</translation>
</message>
@@ -4682,7 +5783,7 @@ Comandos disponibles:
<message>
<source>Error reading merge file:
%1</source>
- <translation>Error al leer el archivo a unir:
+ <translation>Error al leer el archivo a combinar:
%1</translation>
</message>
<message>
@@ -4757,7 +5858,7 @@ Comandos disponibles:
<message>
<source>Invalid Key</source>
<comment>TOTP</comment>
- <translation>Clave Inválida</translation>
+ <translation>Clave inválida</translation>
</message>
<message>
<source>Message encryption failed.</source>
@@ -4792,10 +5893,6 @@ Comandos disponibles:
<translation>Creación exitosa de nueva base de datos.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Introduzca la contraseña para cifrar la base de datos (Pulse enter para dejar en blanco):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Error al crear el archivo de clave %1: %2</translation>
</message>
@@ -4804,12 +5901,8 @@ Comandos disponibles:
<translation>Error al cargar el archivo de claves %1: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Quitar una entrada de la base de datos.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
- <translation>Ruta de la entrada a quitar.</translation>
+ <translation>Camino de la entrada a quitar.</translation>
</message>
<message>
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
@@ -4863,6 +5956,330 @@ Comandos disponibles:
<source>Cannot create new group</source>
<translation>No se puede crear el nuevo grupo</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Desactivar contraseña para la base de datos.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Muestra información de depurado.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Desactivar contraseña para la base de datos desde la que combinar.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versión %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Tipo de compilación: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisión: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribución: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Modo de depurado deshabilitado.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Modo de depurado habilitado.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistema operativo: %1
+Arquitectura de CPU: %2
+Núcleo: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Autoescritura</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (compartir firmado y sin firmar)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (compartir solo firmado)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (compartir solo sin firmar)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ninguno</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Extensiones habilitadas:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Librerías criptográficas:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>No se puede generar una contraseña y preguntar al mismo tiempo</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Añade un nuevo grupo a la base de datos.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Ruta del grupo a añadir.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Grupo %1 ya existe.</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Grupo %1 no encontrado.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Grupo %1 añadido correctamente.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Comprueba si algunas contraseñas han sido filtradas públicamente. FILENAME debe ser la ruta de un archivo conteniendo «hashes» SHA-1 de las contraseñas filtradas en formato HIBP, como está disponible en https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>FILENAME</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analizar contraseñas débiles y problemas.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Fallo al abrir archivo HIBP %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Evaluando las entradas de la base de datos contra el archivo HIBP, esto tomará un rato...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Cerrar la base de datos abierta actual.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Mostrar esta ayuda.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>La ranura de YubiKey usada para cifrar la base de datos.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>ranura</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Cuenta de palabras invalida %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>La lista de palabras es demasiada pequeña (&lt; 1000 elementos)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Salir de modo interactivo.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Formato a usar al exportar. Las opciones disponibles son xml o csv. Por defecto xml.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Exporta el contenido de la base de datos en la salida estándar en el formato especificado.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>No se puede exportar base de datos a XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Formato no soportado %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Usar números</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Longitud de contraseña inválida %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Mostrar ayuda de comando.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Comandos disponibles:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Importar los contenidos de la base de datos XML.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Ruta de la exportación de la base de datos XML.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Ruta de la nueva base de datos.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>No se puede importar la base de datos XML de la exportación %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Base de datos importada correctamente.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Comando %1 desconocido</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Aplana la salida en líneas individuales.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Imprimir solo cambios detectados por la operación de combinado.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Ranura YubiKey para la segunda base de datos.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>Combinado %1 en %2 correctamente.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>La base de datos no fue modificada por la operación de combinar</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Mueve una entrada a un nuevo grupo.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Ruta de la entrada a mover.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Ruta del grupo destino.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>No se puede encontrar el grupo con ruta %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>La entrada ya está en el grupo %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Entrada %1 movida al grupo %2 correctamente.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Abrir base de datos.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Ruta del grupo a eliminar.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>No se puede eliminar grupo raíz de la base de datos.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Grupo %1 reciclado correctamente.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Grupo %1 eliminado correctamente.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Fallo al abrir archivo de base de datos %1: no encontrado</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Fallo al abrir archivo de base de datos %1: archivo de texto no plano</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Fallo al abrir archivo de base de datos %1: no leíble</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Introduzca contraseña para desbloquear: %1</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Ranura %1 de YubiKey inválida</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Pulse el botón de su YubiKey para desbloquear %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Introduzca la contraseña para cifrar la base de datos (opcional):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>Archivo HIBP, línea %1: error de analizado</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Integración de servicio de secretos</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Nombre de usuario</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Respuesta de desafío - Ranura %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>¡Contraseña para «%1» se ha filtrado %2 vez!</numerusform><numerusform>¡Contraseña para «%1» se ha filtrado %2 veces!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Generador de contraseñas inválido después de aplicar opciones</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4937,7 +6354,7 @@ Comandos disponibles:
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation>Buscar Ayuda</translation>
+ <translation>Buscar ayuda</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
@@ -5004,7 +6421,7 @@ Comandos disponibles:
</message>
<message>
<source>Search Help</source>
- <translation>Buscar Ayuda</translation>
+ <translation>Buscar ayuda</translation>
</message>
<message>
<source>Search (%1)...</source>
@@ -5017,6 +6434,93 @@ Comandos disponibles:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Opciones</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Permitir integración de servicio KeepassXC Freedesktop.org Secret</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Mostrar una notificación cuando las credenciales son requeridas</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Si la papelera de reciclaje está habilitada para la base de datos, las entradas serán movidas a la papelera directamente. Sino serán eliminadas sin confirmación.&lt;/p&gt;&lt;p&gt;Aún así se le solicitará si alguna entrada es referenciada por otras.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>No confirmar cuando las entradas son eliminadas por los clientes.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Exponer grupos de base de datos:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupo</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Gestionar</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorización</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Estas aplicaciones están actualmente conectadas:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Aplicación</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Desconectar</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Configuración de la base de datos</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Editar configuración de base de datos</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Desbloquear base de datos</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Desbloquear para mostrar más información</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Bloquear base de datos</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Desbloquear para mostrar</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ninguno</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5068,15 +6572,15 @@ Comandos disponibles:
</message>
<message>
<source>Trust</source>
- <translation>Confianza</translation>
+ <translation>Confiar</translation>
</message>
<message>
<source>Ask</source>
- <translation>Preguntar</translation>
+ <translation>Solicitar</translation>
</message>
<message>
<source>Untrust</source>
- <translation>Desconfianza</translation>
+ <translation>Desconfiar</translation>
</message>
<message>
<source>Remove</source>
@@ -5139,9 +6643,100 @@ Comandos disponibles:
<source>Signer:</source>
<translation>Firmante:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Permitir importación KeeShare</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Permitir exportación KeeShare</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Mostrar solo advertencias y errores</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Clave</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Campo de nombre firmante</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Generar nuevo certificado</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importar certificado existente</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Exportar certificado propio</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Comparticiones conocidos</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Confiar en certificado seleccionado</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Solicitar si confiar en certificado seleccionado cada vez</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Desconfiar de certificado seleccionado</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Eliminar certificado seleccionado</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>No se soporta sobrescribir contenedor compartido - exportación prevenido</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>No podría escribir el contenedor de exportación (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>No se puede incrustar la firma: no se puede abrir el archivo para escribir (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>No se puede incrustar la firma: no se puede escribir el archivo (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>No se puede incrustar la base de datos: no se puede abrir el archivo para escribir (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>No se puede incrustar la base de datos: no se puede escribir el archivo (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>No se soporta la sobrescritura de contenedor compartido sin firmar - exportación prevenida</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>No se puede escribir contenedor de exportación</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Ha ocurrido un error inesperado en la exportación</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importación de contenedores sin firma</translation>
@@ -5155,6 +6750,10 @@ Comandos disponibles:
<translation>Importar desde contenedor con certificado</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>¿Desea confiar a %1 con la huella digital de %2 de %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>No esta vez</translation>
</message>
@@ -5171,18 +6770,6 @@ Comandos disponibles:
<translation>Sólo esta vez</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Importación de %1 fallida (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Importación de %1 exitosa (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importado de %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>No se soportan contenedores compartidos firmados - importación prevenida</translation>
</message>
@@ -5222,25 +6809,20 @@ Comandos disponibles:
<source>Unknown share container type</source>
<translation>Tipo de contenedor compartido desconocido</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>No se soporta sobreescribir contenedor compartido - exportación prevenido</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>No podría escribir el contenedor de exportación (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>No se soporta la sobrescritura de contenedor compartido sin firmar - exportación prevenida</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Importación de %1 fallida (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>No se puede escribir contenedor de exportación</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Importación de %1 exitosa (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Ha ocurrido un error inesperado en la exportación</translation>
+ <source>Imported from %1</source>
+ <translation>Importado de %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5255,10 +6837,6 @@ Comandos disponibles:
<translation>Exportar a %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>¿Desea confiar a %1 con la huella digital de %2 de %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Ruta de origen de importación múltiple a %1 en %2</translation>
</message>
@@ -5266,28 +6844,12 @@ Comandos disponibles:
<source>Conflicting export target path %1 in %2</source>
<translation>Ruta de destino de exportación contradictoria %1 en %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>No se puede incrustar la firma: no se puede abrir el archivo para escribir (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>No se puede incrustar la firma: no se puede escribir el archivo (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>No se puede incrustar la base de datos: no se puede abrir el archivo para escribir (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>No se puede incrustar la base de datos: no se puede escribir el archivo (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
<message>
<source>Timed Password</source>
- <translation>Contraseña Cronometrada</translation>
+ <translation>Contraseña cronometrada</translation>
</message>
<message>
<source>000000</source>
@@ -5299,7 +6861,7 @@ Comandos disponibles:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Caduca en &lt;b&gt;%n&lt;/b&gt; segundo(s)</numerusform><numerusform>Caduca en &lt;b&gt;%n&lt;/b&gt; segundo (s)</numerusform></translation>
+ <translation><numerusform>Caduca en &lt;b&gt;%n&lt;/b&gt; segundo</numerusform><numerusform>Caduca en &lt;b&gt;%n&lt;/b&gt; segundos</numerusform></translation>
</message>
</context>
<context>
@@ -5329,16 +6891,12 @@ Comandos disponibles:
<translation>Configurar TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Clave:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Ajustes para el token por defecto RFC 6238</translation>
</message>
<message>
<source>Steam token settings</source>
- <translation>Opciones de token de Steam</translation>
+ <translation>Confiuración de token de Steam</translation>
</message>
<message>
<source>Use custom settings</source>
@@ -5362,16 +6920,46 @@ Comandos disponibles:
<translation>Tamaño del código:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 dígitos</translation>
+ <source>Secret Key:</source>
+ <translation>Clave secreta:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>La clave secreta debe estar en formato Base32</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Campo clave secreta</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritmo:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Campo paso de tiempo</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 digitos</translation>
+ <source> digits</source>
+ <translation>dígitos</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 dígitos</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>Secreto TOTP inválido</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Ha introducido un secreto de clave inválido. La clave debe estar en formato Base32.
+Ejemplo: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Confirmar eliminar configuración TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>¿Desea eliminar la configuración TOTP para esta entrada?</translation>
</message>
</context>
<context>
@@ -5390,7 +6978,7 @@ Comandos disponibles:
</message>
<message>
<source>Update Error!</source>
- <translation>¡Error al Acualizar!</translation>
+ <translation>¡Error al acualizar!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
@@ -5398,7 +6986,7 @@ Comandos disponibles:
</message>
<message>
<source>Please try again later.</source>
- <translation>Por favor Inténtalo más tarde.</translation>
+ <translation>Por favor inténtelo más tarde.</translation>
</message>
<message>
<source>Software Update</source>
@@ -5414,11 +7002,11 @@ Comandos disponibles:
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation>Descargala en keepassxc.org</translation>
+ <translation>Descárguela en keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation>¡Estás al día!</translation>
+ <translation>¡Está actualizado!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
@@ -5455,6 +7043,14 @@ Comandos disponibles:
<source>Welcome to KeePassXC %1</source>
<translation>Bienvenido a KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importar desde 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Abrir base de datos reciente</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5464,7 +7060,7 @@ Comandos disponibles:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation>Desafío/respuesta Yubikey</translation>
+ <translation>Desafío/respuesta YubiKey</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
@@ -5478,5 +7074,13 @@ Comandos disponibles:
<source>No YubiKey inserted.</source>
<translation>No hay YubiKey insertado.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Actualizar «tokens» hardware</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Selección de ranura de clave hardware</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_fi.ts b/share/translations/keepassx_fi.ts
index e70665f90..d49df70c1 100644
--- a/share/translations/keepassx_fi.ts
+++ b/share/translations/keepassx_fi.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Seuraa tyyliä</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Palauta asetukset?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Haluatko varmasti palauttaa kaikki yleiset ja turvallisuusasetukset oletuksiin?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Käynnistä vain yksi KeePassXC-instanssi</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Muista viimeisimmät tietokannat</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Muista viimeisimmät avaintiedostot ja tietoturva-avainlaitteet (donglet)</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Lataa edelliset tietokannat käynnistäessä</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Pienennä ikkuna ohjelman käynnistyessä</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Käytä ryhmän kuvaketta tietuetta luodessa</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Pienennä ikkuna kopioidessa leikepöydälle</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Piilota tietueen esikatselupaneeli</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Piiloita pienennetty ikkuna ilmoitusalueelle</translation>
</message>
<message>
- <source>Language</source>
- <translation>Kieli</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Automaattisyöttö</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Automaattisyötön aloitusviive</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Tarkista päivitykset sovelluksen käynnistyessä</translation>
+ <source>Movable toolbar</source>
+ <translation>Siirrettävä työkalupalkki</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>Muista aiemmin käytetyt tietokannat</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Sisällytä esijulkaisut tarkistaessa päivityksiä</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Lataa aiemmin avoinna olleet tietokannat käynnistyksen yhteydessä</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Siirrettävä työkalupalkki</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Muista tietokannan avaintiedostot ja tietoturva-avainlaitteet</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Tarkista päivitykset kerran viikossa sovelluksen käynnistyessä</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Sisällytä betajulkaisut päivityksiä tarkistaessa</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Painiketyyli:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Kieli:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(aktivoi käynnistämällä ohjelma uudestaan)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Pienennä ikkuna tietokannan lukituksen avauksen jälkeen</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Pienennä ikkuna URL:ää avatessa</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Piilota ikkuna leikepöydälle kopioitaessa</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Pienennä</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Siirrä taustalle</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Painiketyyli</translation>
+ <source>Favicon download timeout:</source>
+ <translation>Faviconin latauksen aikakatkaisu:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Nettisivun ikonin latauksen aikakatkaisu sekunneissa</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> s</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Työkalupalkin painiketyyli</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Käytä tasalevyistä (monospace) fonttia muistiinpanoihin</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Kielivalinta</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Palauta oletusasetukset</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Yleisen automaattisyötön pikanäppäin</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Automaattisyötön kirjoituksen viive millisekunneissa</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Automaattisyötön aloitusviive millisekunneissa</translation>
</message>
</context>
<context>
@@ -320,9 +389,30 @@
<translation>Yksityisyys</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
+ <source>Use DuckDuckGo service to download website icons</source>
<translation>Käytä DuckDuckGo:ta sivustojen ikonien lataukseen</translation>
</message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Leikepöydän tyhjentäminen sekunneissa</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Touch ID:n joutilaisuusasetuksen palautus</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Tietokannan lukituksen aikakatkaisu sekunneissa</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>minuuttia</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Tyhjennä hakukentän sisältö kun on kulunut</translation>
+ </message>
</context>
<context>
<name>AutoType</name>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Kopioi käyttäjä&amp;tunnus</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Kopioi &amp;salasana</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Valitse tietue automaattisyöttöä varten:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Etsi...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -421,9 +526,17 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
- <translation>%1 pyytää pääsyä seuraavien kohteiden salasanoihin.
+ <translation>%1 pyytää pääsyä seuraavien tietueiden salasanoihin.
Ole hyvä ja valitse sallitaanko pääsy.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Salli pääsy</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Estä pääsy</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Valitse oikea tietokanta tietueen tallentamiseksi</translation>
<translation>Tämä vaaditaan, jotta tietokantoja voidaan käyttää KeePassXC-Browser -selainlaajennuksella</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Käytä KeepassXC:n selainintegraatiota</translation>
- </message>
- <message>
<source>General</source>
<translation>Yleistä</translation>
</message>
@@ -534,10 +643,6 @@ Valitse oikea tietokanta tietueen tallentamiseksi</translation>
<translation>Älä koskaan k&amp;ysy ennen tilitietojen päivittämistä</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Vain valittu tietokanta tulee olla yhdistetty asiakkaan kanssa.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>%Etsi kaikista avoinna olevista tietokannoista vastaavia tilitietoja</translation>
@@ -593,10 +698,6 @@ Valitse oikea tietokanta tietueen tallentamiseksi</translation>
<translation>&amp;Tor-selain</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Varoitus&lt;/b&gt;, keepassxc-proxy -ohjelmaa ei löydy!&lt;br /&gt;Ole hyvä ja tarkista KeePassXC:n asennushakemisto tai varmista mukautettu polku lisäasetuksista.&lt;br /&gt;Selainintegraatio ei toimi ilman välitysohjelmaa.&lt;br /&gt;Odotettu polku:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Suoritettavat tiedostot</translation>
</message>
@@ -621,6 +722,50 @@ Valitse oikea tietokanta tietueen tallentamiseksi</translation>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser tarvitaan selainintegraation toimimista varten.&lt;br /&gt;Dataa se seuraaville selaimille: %1 ja %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Salli vanhentuneiden tietueiden noutaminen. Teksti [vanhentunut] lisätään tietueen otsikkoon. </translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Salli vanhentuneiden tietueiden noutaminen.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Käytä selainintegraatiota</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Snapin kautta asennetut selaimet eivät ole tällä hetkellä tuettuja.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Sallitaan tietueiden nouto kaikista tietokannoista jotka ovat yhdistetty selainlaajennukseen.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Älä näytä ponnahdusikkunaa, joka ehdottaa vanhojen KeePassHTTP-asetuksien muuttamista uuteen muotoon.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Älä näytä ponnahdusikkunaa KeePassHTTP-asetusten muuttamiselle</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Mukautetun välitusohjelman sijainti</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Selaa mukautettua välitysohjelman tiedostoa</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Varoitus&lt;/b&gt;, keepassxc-proxy -ohjelmaa ei löydy!&lt;br /&gt;Ole hyvä ja tarkista KeePassXC:n asennushakemisto tai varmista mukautettu polku lisäasetuksista.&lt;br /&gt;Selainintegraatio ei toimi ilman välitysohjelmaa.&lt;br /&gt;Odotettu polku: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -679,7 +824,7 @@ Siirrettiin %2 avainta mukautettuihin tietoihin.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>Siirrettiin onnistuneesti %n avainta mukautettuihin tietoihin.</numerusform><numerusform>Siirrettiin onnistuneesti %n avainta mukautettuihin tietoihin.</numerusform></translation>
+ <translation><numerusform>Siirettiin onnistuneesti %n avain mukautettuihin tietoihin.</numerusform><numerusform>Siirrettiin onnistuneesti %n avainta mukautettuihin tietoihin.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -712,6 +857,10 @@ Would you like to migrate your existing settings now?</source>
Tämä on välttämätöntä, jotta yhteys selainlaajennukseen säilyy muuttumattomana.
Haluat siirtää asetukset nyt?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Älä näytä tätä varoitusta uudelleen</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -771,10 +920,6 @@ Haluat siirtää asetukset nyt?</translation>
<translation>Ensimmäinen tietue sisältää kenttien nimet</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Hylättävissä olevien otsakerivien lukumäärä</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Käsittele merkkiä &apos;\&apos; escape-merkkinä</translation>
</message>
@@ -816,7 +961,7 @@ Haluat siirtää asetukset nyt?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n more message(s) skipped]</numerusform><numerusform>[%n kappaletta viestejä ohitettiin]</numerusform></translation>
+ <translation><numerusform>[%n kappaletta viestejä ohitettiin]</numerusform><numerusform>[%n kappaletta viestejä ohitettiin]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -824,12 +969,28 @@ Haluat siirtää asetukset nyt?</translation>
<translation>CSV-tuonti: kirjoituksessa on virheitä:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Tekstin määrittely</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Kenttäerotus</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Hylättävissä olevien otsakerivien lukumäärä</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV-tuonnin esikatselu</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n sarake.</numerusform><numerusform>%n saraketta</numerusform></translation>
+ <translation><numerusform>%n sarake</numerusform><numerusform>%n saraketta</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -838,7 +999,7 @@ Haluat siirtää asetukset nyt?</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n tavu</numerusform><numerusform>%n tavua</numerusform></translation>
+ <translation><numerusform>%n tavu</numerusform><numerusform>% tavua</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
@@ -865,10 +1026,6 @@ Haluat siirtää asetukset nyt?</translation>
<translation>Virhe tietokantaa luettaessa: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Tallennus ei onnistu. Tietokannalla ei ole tiedostonimeä.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Tiedostoa ei voitu tallentaa, sillä se on avattu vain lukuoikeuksin.</translation>
</message>
@@ -876,6 +1033,28 @@ Haluat siirtää asetukset nyt?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Avainmuunnosta ei voitu suorittaa. Ole hyvä ja ilmoita tästä virheestä sovelluksen kehittäjille.</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Tietokannan varmuuskopio paikannettu: %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Tallennus ei onnistu. Tietokanta ei osoita validiin tiedostoon.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Ei voitu tallentaa, tietokantatiedosto on vain luettavassa muodossa.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Tietokannalla on muutoksia joita ei ole yhdistetty.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Roskakori</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -887,30 +1066,14 @@ Haluat siirtää asetukset nyt?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Syötä pääsalasana</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Avaintiedosto:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Salasana:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Selaa</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Päivitä</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Haaste/vastaus:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Vanha avaintiedostomuoto</translation>
</message>
@@ -941,20 +1104,100 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation>
<translation>Valitse avaintiedosto</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID pika-avaukseen</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Avaintiedoston avaus epäonnistui: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Tietokantaa ei voitu avata:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Valitse paikka...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Avaintiedostoa ei voitu avata:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Avaa KeePassXC-tietokannan lukitus</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Syötä salasana:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Salasanakenttä</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Vaihda salasanan näkyvyyttä</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Syötä lisätietueita:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Avaintiedoston valinta</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Laiteavaimen paikan valinta</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Selaa avaintiedostoa</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Selaa...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Uudista laitetunnisteet</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Laiteavain:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Voit käyttää laiteavainta, kuten &lt;strong&gt;Yubikey:tä&lt;/strong&gt; tai &lt;strong&gt;OnlyKey:tä&lt;/strong&gt; HMAC-SHA1 configuroidun paikan kanssa.&lt;/p&gt;
+&lt;p&gt;Lisätietoja tästä...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Laiteavaimen apu</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID Pika-Avaukseen</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Tyhjennä</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Tyhjennä Avaintiedosto</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Valitse tiedosto...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Avaus epäonnistui, eikä salasanaa ole annettu</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Tietokannan avaus epäonnistui, eikä salasanaa ole syötetty.
+Haluat koittaa uudestaan tyhjällä salasanalla?
+
+Jos et halua nähdä tätä virhettä uudestaan, mene &quot;Tietokannan asetukset / Turvallisuus&quot; ja muuta salasanaasi.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Yritä uudelleen tyhjällä salasanalla</translation>
</message>
</context>
<context>
@@ -1063,7 +1306,7 @@ Tämä voi estää yhteyden selainlaajennukseen.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>%n salausavain poistettiin onnistuneesti KeePassXC:n asetuksista.</numerusform><numerusform>%n salausavainta poistettiin onnistuneesti KeePassXC:n asetuksista.</numerusform></translation>
+ <translation><numerusform>Poistettiin %n salausavain KeePassXC:n asetuksista.</numerusform><numerusform>Poistettiin %n salausavainta KeePassXC:n asetuksista.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1089,7 +1332,7 @@ Pääsy tietueisiin evätään.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Poistettiin lupa %n tietueelta.</numerusform><numerusform>Poistettiin lupa %n tietueelta.</numerusform></translation>
+ <translation><numerusform>Poistettiin käyttöoikeudet %n:n tietueen tiedoista.</numerusform><numerusform>Poistettiin käyttöoikeudet %n:n tietueen tiedoista.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1109,6 +1352,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Haluatko todella siirtää vanhat selainlaajennustiedot uuteen muotoon?
Tämä on välttämätöntä selainintegraation yhteensopivuuden takaamiseksi.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Tallennetut selaimen avaimet</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Poista valittu avain</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1134,7 +1385,7 @@ Tämä on välttämätöntä selainintegraation yhteensopivuuden takaamiseksi.</
</message>
<message>
<source>Benchmark 1-second delay</source>
- <translation>Laske parametrit 1:n sekunnin viiveelle</translation>
+ <translation>Laske parametrit 1:n sekunnin viivästykselle</translation>
</message>
<message>
<source>Memory Usage:</source>
@@ -1146,7 +1397,7 @@ Tämä on välttämätöntä selainintegraation yhteensopivuuden takaamiseksi.</
</message>
<message>
<source>Decryption Time:</source>
- <translation>Salauksen purkuun kulunut aika:</translation>
+ <translation>Salauksen purkuun vaadittava aika:</translation>
</message>
<message>
<source>?? s</source>
@@ -1174,7 +1425,7 @@ Tämä on välttämätöntä selainintegraation yhteensopivuuden takaamiseksi.</
</message>
<message>
<source>This is only important if you need to use your database with other programs.</source>
- <translation>Tämä on tärkeää vain, jos käytät tietokantaa muissa ohjelmissa.</translation>
+ <translation>Tämä asetus on tärkeä vain, jos käytät tietokantaa muissa ohjelmissa.</translation>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
@@ -1187,7 +1438,7 @@ Tämä on välttämätöntä selainintegraation yhteensopivuuden takaamiseksi.</
<message>
<source>unchanged</source>
<comment>Database decryption time is unchanged</comment>
- <translation>muuttamaton</translation>
+ <translation>ei muutettu</translation>
</message>
<message>
<source>Number of rounds too high</source>
@@ -1251,6 +1502,57 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation>
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Muuta olemassa olevaa salauksen purkuun vaadittavaa aikaa</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Salauksen purkuun vaadittava aika sekunneissa</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Tietokannan muoto</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Salausalgoritmi</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Avainmuunnosfunktio</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Muunnoskierroksia</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Muistin käyttö</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Rinnakkaisuus</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Avoimia tietueita</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Älä &amp;muuta tätä tietokantaa avoimeksi</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Muuta tietueet avoimeksi tämän &amp;ryhmän alta:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Käytä fd.o:n Secret Serviceä päästäksesi näihin asetuksiin.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1276,7 +1578,7 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation>
</message>
<message>
<source>Max. history items:</source>
- <translation>Maks. historia-kohteiden lukumäärä:</translation>
+ <translation>Maks. historiamerkintöjen lukumäärä:</translation>
</message>
<message>
<source>Max. history size:</source>
@@ -1284,7 +1586,7 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation>
</message>
<message>
<source> MiB</source>
- <translation> Mt</translation>
+ <translation>MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1298,6 +1600,39 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation>
<source>Enable &amp;compression (recommended)</source>
<translation>Ota käyttöön &amp;pakkaus (suositeltava)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Tietokannan nimikenttä</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Tietokannan kuvauskenttä</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Oletuskäyttäjänimen kenttä</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Historiamerkintöjen maksimimäärä per tietue</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Historian koon maksimimäärä per tietue</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Poista roskakori</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Haluatko poistaa nykyisen roskakorin ja sen kaiken sisällön? Tämä toimenpide on peruuttamaton.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(vanha)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1365,6 +1700,10 @@ Oletko varma, että haluat jatkaa ilman salasanaa?</translation>
<source>Failed to change master key</source>
<translation>Pääsalasanan muuttaminen ei onnistunut</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Jatka ilman salasanaa</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1376,6 +1715,129 @@ Oletko varma, että haluat jatkaa ilman salasanaa?</translation>
<source>Description:</source>
<translation>Kuvaus:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Tietokannan nimikenttä</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Tietokannan kuvauskenttä</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Tilastot</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Liiku virheikonin sisältävän rivin päälle saadaksesi lisätietoa.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nimi</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Arvo</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Tietokannan nimi</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Kuvaus</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Sijainti</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Viimeksi tallennettu</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Tallentamattomia muutoksia</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>kyllä</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>ei</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Tietokantaa muokattiin, mutta muutoksia ei ole tallennettu levylle.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Ryhmien määrä</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Tietueiden lukumäärä</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Vanhentuneiden tietueiden lukumäärä</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Tietokanta sisältää tietueita jotka ovat vanhentuneet.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Yksilöllisiä salasanoja</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Ei-yksilöllisiä salasanoja</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Salasanoista enemmän kuin 10% ovat samoja. Käytä yksilöllisiä salasanoja aina kun mahdollista.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Maksimimäärä samoja salasanoja</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Salasanoista osa on käytössä useammassa kuin kolmessa tietueessa. Käytä yksilöllisiä salasanoja aina kun mahdollista.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Lyhyiden salasanojen määrä</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Salasanan suositeltu minimipituus on vähintään 8 merkkiä.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Heikkojen salasanojen määrä</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>On suositeltavaa käyttää salasanoja joiden luokitus on &apos;hyvä&apos; tai &apos;erinomainen&apos;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Salasanan keskimääräinen pituus</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 merkkiä</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Salasanojen keskimääräinen pituus on vähemmän kuin kymmenen merkkiä. Pidemmät salasanat ovat turvallisempia.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1426,10 +1888,6 @@ This is definitely a bug, please report it to the developers.</source>
Tämä on selkeä virhe, joten ota yhteyttä kehittäjätiimiin.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Tietokantatiedostoa ei ole olemassa tai siihen ei ole pääsyä.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Valitse CSV-tiedosto</translation>
</message>
@@ -1452,6 +1910,30 @@ Tämä on selkeä virhe, joten ota yhteyttä kehittäjätiimiin.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Vain luku]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>%1:n avaus epäonnistui. Sitä ei ole joko olemassa, tai siihen ei ole pääsyoikeutta.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Vie tietokanta HTML-tiedostoon</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML-tiedosto</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>HTML-tiedoston kirjoittaminen epäonnistui.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Viennin vahvistus</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Olet viemässä tietokantaasi salaamattomaan tiedostoon. Tämä jättää salasanasi ja minkä tahansa arkaluontoisen tiedon haavoittuvaksi! Oletko varma, että haluat jatkaa?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1531,7 +2013,7 @@ Haluatko yhdistää muutoksesi?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Haluatko todella poistaa %n tietueen pysyvästi?</numerusform><numerusform>Haluatko todella poistaa %n tietuetta pysyvästi?</numerusform></translation>
+ <translation><numerusform>Haluatko varmasti poistaa %1 tietueen lopullisesti?</numerusform><numerusform>Haluatko varmasti poistaa %1 tietuetta lopullisesti?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
@@ -1542,10 +2024,6 @@ Haluatko yhdistää muutoksesi?</translation>
<translation><numerusform>Siirrä tietue roskakoriin?</numerusform><numerusform>Siirrä tietueet roskakoriin?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Tiedosto on avattu &quot;vain luku&quot;-tilassa.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Lukitse tietokanta?</translation>
</message>
@@ -1586,12 +2064,6 @@ Disable safe saves and try again?</source>
Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Tietokantaan kirjoittaminen epäonnistui.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Salasanat</translation>
</message>
@@ -1609,7 +2081,7 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>Tietueella &quot;%1&quot; on %2 viittaus. Haluatko ylikirjoittaa viittaukset arvoilla, ohittaa tietueen tai poistaa sen?</numerusform><numerusform>Tietueella &quot;%1&quot; on %2 viittausta. Haluatko ylikirjoittaa viittaukset arvoilla, ohittaa tietueen tai poistaa sen?</numerusform></translation>
+ <translation><numerusform>Tietueella &quot;%1&quot; on %2 viittaus. Haluatko ylikirjoittaa viittauksen arvolla, ohittaa tietueen käsittelyn vai poistaa tietueen viittauksesta huolimatta?</numerusform><numerusform>Tietueella &quot;%1&quot; on %2 viittausta. Haluatko ylikirjoittaa viittaukset arvoilla, ohittaa tietueen käsittelyn vai poistaa tietueen viittauksista huolimatta?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1635,6 +2107,14 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Shared group...</source>
<translation>Jaettu ryhmä...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Tietokannan kirjoittaminen epäonnistui: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Tietokanta on avattu vain-luku -moodissa. Automaattinen tallennus on otettu pois päältä.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1754,6 +2234,18 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Confirm Removal</source>
<translation>Vahvista poistaminen</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Selainintegraatio</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Haluatko varmasti poistaa tämän URL:n?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1793,6 +2285,42 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Background Color:</source>
<translation>Taustaväri:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Attribuutin valinta</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Attribuutin arvo</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Lisää uusi attribuutti</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Poista valittu attribuutti</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Muokkaa attribuutin nimeä</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Suojaa attribuutti</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Näytä suojattu attribuutti</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Korostusvärin valinta</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Taustavärin valinta</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1828,6 +2356,77 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Käytä tiettyä sekvenssiä tälle liitokselle:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Mukautettu automaattisyötön sekvenssi</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Avaa automaattitäydennyksen ohjesivusto</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Jo olemassa olevat ikkunoiden liitokset</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Lisää uusi ikkunan liitos</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Poista valittu ikkunaliitos</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Voit käyttää asteriskia (*) vastaamaan kaikkea mahdollista</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Aseta ikkunan liitoksen otsikko</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Voit käyttää asteriskia vastaamaan kaikkea mahdollista</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Mukautettu automaattisyötön sekvenssi tälle ikkunalle</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Tämä asetukset vaikuttavat tietueen toimintaan selainlaajennuksen kanssa.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Yleistä</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Älä salli automaattisyöttöä tälle tietueelle</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Piilota tämä tietue selainlaajennuksesta</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Lisäosoitteet</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Lisää</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Poista</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Muokkaa</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1847,6 +2446,26 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Delete all</source>
<translation>Poista kaikki</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Tietueen historiavalinta</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Näytä tietue valitulla historiatilalla</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Palauta tietue valittuun historiatilaan</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Poista valittu historiatila</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Poista kaikki historia</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1856,7 +2475,7 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message>
<message>
<source>Password:</source>
- <translation>Salasana</translation>
+ <translation>Salasana:</translation>
</message>
<message>
<source>Repeat:</source>
@@ -1886,6 +2505,62 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Expires</source>
<translation>Erääntyy</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Osoitekenttä</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Lataa favicon tälle URL:lle</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Toista salasana -kenttä</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Näytä salasanageneraattori</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Salasanakenttä</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Vaihda salasanan näkyvyyttä</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Vaihda muistiinpanojen näkyvyyttä</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Vanhentumisajan kenttä</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Vanhentumisajan valmiit asetukset</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Vanhentumisajan valmiit asetukset</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Muistiinpanojen kenttä</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Otsikkokenttä</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Käyttäjätunnuksen kenttä</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Ota vanhentumisaika käyttöön</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1962,6 +2637,22 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Vaadi käyttäjävahvistusta kun avainta käytetään</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Poista avain agentista tietyn sekuntiajan jälkeen</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Selaa avaintiedostoa</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Ulkoinen avaintiedosto</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Valitse liitetiedosto</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1997,6 +2688,10 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Peri ylemmältä ryhmältä (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Tietueella on tallentamattomia muutoksia</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2025,68 +2720,99 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<translation>Toimeton</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Tuo polusta</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeSharen allekirjoittamaton säiliö</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Vie polkuun</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeSharen allekirjoitettu säiliö</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synkronoi polun kanssa</translation>
+ <source>Select import source</source>
+ <translation>Valitse tuonnin lähde</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>KeePassXC-versiosi ei tue jakamista tällä säiliötyypillä. Ole hyvä ja käytä tyyppiä %1.</translation>
+ <source>Select export target</source>
+ <translation>Valitse viennin kohde</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Tietokannan jakaminen on poistettu käytöstä</translation>
+ <source>Select import/export file</source>
+ <translation>Valitse tuonti-/vientitiedosto</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Tietokannan vieminen on poistettu käytöstä</translation>
+ <source>Clear</source>
+ <translation>Tyhjennä</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Tietokannan tuominen on poistettu käytöstä</translation>
+ <source>Import</source>
+ <translation>Tuo</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeSharen allekirjoittamaton säiliö</translation>
+ <source>Export</source>
+ <translation>Vie</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeSharen allekirjoitettu säiliö</translation>
+ <source>Synchronize</source>
+ <translation>Synkronoi</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Valitse tuonnin lähde</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>KeePassXC-versiosi ei tue jakamista tällä säiliötyypillä.
+Tuetut tyypit ovat: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Valitse viennin kohde</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 on jo viety tästä tietokannasta.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Valitse tuonti-/vientitiedosto</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 on jo tuotu tästä tietokannasta.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Tyhjennä</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 on tuotu ja viety eri ryhmästä tästä tietokannasta.</translation>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare ei ole tällä hetkellä käytössä. Voit ottaa tuonnin/viennin käyttöön ohjelmiston asetuksista.</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Tietokannan vienti on poistettu käytöstä ohjelmiston asetuksissa.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Tietokannan tuonti on poistettu käytöstä ohjelmiston asetuksista.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Jakotavan kenttä</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Jakotiedoston sijainnin kenttä</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Selaa jakotiedostoa</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Vientisäiliöön %1 on jo viitattu.</translation>
+ <source>Password field</source>
+ <translation>Salasanakenttä</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Tuontisäiliö %1 on jo tuotu.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Vaihda salasanan näkyvyyttä</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Säiliö %1 on tuotu ja viety eri ryhmien perusteella.</translation>
+ <source>Toggle password generator</source>
+ <translation>Näytä salasanageneraattori</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Tyhjennä kentät</translation>
</message>
</context>
<context>
@@ -2119,6 +2845,34 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Aseta automaattisyötön &amp;oletussekvenssi</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Nimikenttä</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Muistiinpanojen kenttä</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Ota vanhentumisaika käyttöön</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Automaattisyötön päälle laittaminen tälle ryhmälle ja sen aliryhmille</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Vanhentumisajan kenttä</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Haun päälle laittaminen tälle ryhmälle ja sen aliryhmille</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Automaattisyötön sekvenssin oletuksen kenttä</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2155,28 +2909,16 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
<translation>Kaikki tiedostot</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Mukautettu kuvake on jo olemassa</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Vahvista poisto</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Mukautettu ikoni ladattu onnistuneesti</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Vinkki: Voit asettaa DuckDuckGo:n ikonien lataukseen asetuksen Työkalut&gt;Asetukset&gt;Turvallisuus alta</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Valitse kuva(t)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>%1 ikoni kaikista (%n) ladattiin onnistuneesti</numerusform><numerusform>%1 ikonia kaikista (%n) ladattiin onnistuneesti</numerusform></translation>
+ <translation><numerusform>Ladattiin onnistuneesti %1 / %n ikoni.</numerusform><numerusform>Ladattiin onnistuneesti %1 / %n ikonia.</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2184,15 +2926,51 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n ikoni on jo tietokannassa</numerusform><numerusform>%n ikonia on jo tietokannassa</numerusform></translation>
+ <translation><numerusform>%n ikoni on jo tietokannassa.</numerusform><numerusform>%n ikonia on jo tietokannassa.</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>Seuraava ikoni epäonnistui:</numerusform><numerusform>Seuraavat ikonit epäonnistuivat:</numerusform></translation>
+ <translation><numerusform>Seuraavat ikoni epäonnistui:</numerusform><numerusform>Seuraavat ikonit epäonnistuivat:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Ikonia käytetään %n tietueessa, ja se korvataan oletusikonilla. Oletko varma, että haluat poistaa sen?</numerusform><numerusform>Ikonia käytetään %n tietueessa, ja se korvataan oletusikonilla. Oletko varma, että haluat poistaa sen?</numerusform></translation>
+ <translation><numerusform>Tätä ikonia käytetään %n tietueessa, ja se korvataan oletusikonilla. Oletko varma, että haluat poistaa sen?</numerusform><numerusform>Tätä ikonia käytetään %n tietueessa, ja se korvataan oletusikonilla. Oletko varma, että haluat poistaa sen?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Voit asettaa DuckDuckGo:n ikonien lataukseen asetuksen Työkalut&gt;Asetukset&gt;Turvallisuus alta</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Lataa favicon tälle URL:lle</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Lisää valittu ikoni aliryhmille ja sen tietueille</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>&amp;Lisää ikoni ...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Lisää vain tälle</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Lisää myös aliryhmille</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Lisää myös lapsitietueille</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Lisää kaikille lapsille</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Jo olemassa oleva ikoni valittu.</translation>
</message>
</context>
<context>
@@ -2239,6 +3017,30 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<source>Value</source>
<translation>Arvo</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Luomisen ajankohta</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Muokkauksen ajankohta</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Käyttämisen ajankohta</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Yksilökohtainen ID</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Liitännäistiedot</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Poista liitännäistiedot</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2286,7 +3088,7 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Haluatko varmasti poistaa &amp;n liitettä?</numerusform><numerusform>Haluatko varmasti poistaa %n liitettä?</numerusform></translation>
+ <translation><numerusform>Haluatko varmasti poistaa %n liitteen?</numerusform><numerusform>Haluatko varmasti poistaa %n liitettä?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2331,10 +3133,30 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Tiedostoa ei voitu avata:
-%1</numerusform><numerusform>Tiedostoja ei voitu avata:
+ <translation><numerusform>Seuraavan tiedoston avaus epäonnistui:
+%1</numerusform><numerusform>Seuraavien tiedostojen avaus epäonnistui:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Liitteet</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Lisää uusi liite</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Poista valittu liite</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Avaa valittu liite</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Tallenna valittu liite levylle</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2429,10 +3251,6 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Luo ajastetun kertakäyttöisen salasanan (TOTP) tunniste</translation>
- </message>
- <message>
<source>Close</source>
<translation>Sulje</translation>
</message>
@@ -2517,6 +3335,14 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<source>Share</source>
<translation>Jaa</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Näytä nykyinen TOTP-arvo</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Lisäasetukset</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2550,11 +3376,33 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Roskakori</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Tietuetta &quot;%1&quot; tietokannasta &quot;%2&quot; käytettiin %3:n toimesta</translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>DBus-palvelun rekisteröinti epäonnistui: %1. Toinen salauspalvelu on jo käynnissä.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%1 tietue käytettiin %1:n toimesta</numerusform><numerusform>%1 tietuetta käytettiin %1:n toimesta</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo Secret Service: %1</translation>
</message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2573,6 +3421,59 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Lataa faviconit</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Onko ikonien latauksessa ongelmia?
+Voit käyttää DuckDuckGo:ta ikonien lataukseen ohjelmiston turvallisuusasetuksia muokkaamalla.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Sulje</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Tila</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Odota hetki, käsitellään tietuelistaa...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Ladataan...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>On jo olemassa</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Lataus epäonnistui</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Ladataan faviconeja (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2594,10 +3495,6 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<translation>Haaste-vastauksen tekeminen epäonnistui.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Väärä avain tai tietokanta on korruptoitunut.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>tietokannan otsaketiedot puuttuvat</translation>
</message>
@@ -2617,6 +3514,12 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<source>Invalid header data length</source>
<translation>Virheellinen otsaketietojen sisällön koko</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Väärät tilitiedot, ole hyvä ja koita uudestaan.
+Jos tämä toistuu, tietokantasi voi olla viallinen.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2648,10 +3551,6 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<translation>Yhteensopimaton SHA256-otsaketieto</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Väärä avain tai tietokantatiedosto on rikki. (HMAC ei täsmää)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Tuntematon salaus</translation>
</message>
@@ -2751,6 +3650,16 @@ Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Virheellinen variant-kartan kenttätyypin koko</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Väärät tilitiedot, ole hyvä ja koita uudestaan.
+Jos tämä toistuu, tietokantasi voi olla viallinen.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC on yhteensopimaton)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2850,7 +3759,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant
</message>
<message>
<source>No root group</source>
- <translation>Ei isäntäryhmää</translation>
+ <translation>Ei juuriryhmää</translation>
</message>
<message>
<source>Missing icon uuid or data</source>
@@ -2973,13 +3882,13 @@ Rivi %2, sarake %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Tuo KeePass 1 -tietokanta</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Tietokannan avaaminen epäonnistui.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Tuo KeePass1-tietokanta</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3037,10 +3946,6 @@ Rivi %2, sarake %3</translation>
<translation>Pääavaimen laskeminen ei onnistu</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Väärä avain tai tietokanta on korruptoitunut.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Avaimen muuttaminen epäonnistui</translation>
</message>
@@ -3136,40 +4041,58 @@ Rivi %2, sarake %3</translation>
<source>unable to seek to content position</source>
<translation>sisällön sijaintia ei voitu hakea</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Väärät tilitiedot, ole hyvä ja koita uudestaan.
+Jos tämä toistuu, tietokantasi voi olla viallinen.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Jakaminen poistettu käytöstä</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Virheellinen jakoviittaus</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Tuo</translation>
+ <source>Inactive share %1</source>
+ <translation>Ei-aktiivinen jako %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Vie</translation>
+ <source>Imported from %1</source>
+ <translation>Tuotu kohteesta %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synkronoi</translation>
+ <source>Exported to %1</source>
+ <translation>Viety kohteeseen %1</translation>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation>Synkronoitu kohteen %1 kanssa</translation>
+ </message>
+ <message>
+ <source>Import is disabled in settings</source>
+ <translation>Tuonti on poistettu käytöstä asetuksissa</translation>
+ </message>
+ <message>
+ <source>Export is disabled in settings</source>
+ <translation>Vienti on otettu pois käytöstä asetuksissa</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Jako %1 otettu pois käytöstä</translation>
+ <source>Inactive share</source>
+ <translation>Ei-aktiivinen jako</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Tuo jaosta %1</translation>
+ <source>Imported from</source>
+ <translation>Tuotu kohteesta</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Vie jaosta %1</translation>
+ <source>Exported to</source>
+ <translation>Viety kohteeseen</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synkronoi jaon %1 kanssa</translation>
+ <source>Synchronized with</source>
+ <translation>Synkronoitu seuraavan kohteen kanssa</translation>
</message>
</context>
<context>
@@ -3193,12 +4116,12 @@ Rivi %2, sarake %3</translation>
<message>
<source>Add %1</source>
<comment>Add a key component</comment>
- <translation>Lisätty %1</translation>
+ <translation>Lisää %1</translation>
</message>
<message>
<source>Change %1</source>
<comment>Change a key component</comment>
- <translation>Muutettu %1</translation>
+ <translation>Muuta %1</translation>
</message>
<message>
<source>Remove %1</source>
@@ -3214,10 +4137,6 @@ Rivi %2, sarake %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Selaa</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Luo</translation>
</message>
@@ -3227,7 +4146,7 @@ Rivi %2, sarake %3</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Lisäturvaksi voit lisätä avaintiedoston, joka sisältää sattumanvaraista dataa.&lt;/p&gt;&lt;p&gt;Tämä tiedosto täytyy pitää salassa eikä sitä saa koskaan hävittää!&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Turvallisutta voidaan lisätä avaintiedostolla, joka sisältää sattumanvaraista dataa.&lt;/p&gt;&lt;p&gt;Avaintiedosto on pidettävä salassa ja sen säilytyksestä tulee huolehtia. Salasanatietokantaa ei voida avata mikäli avaintiedosto hävitetään! &lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
@@ -3272,6 +4191,44 @@ Viesti: %2</translation>
<source>Select a key file</source>
<translation>Valitse avaintiedosto</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Avaintiedoston valinta</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Selaa avaintiedostoa</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Selaa...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Luo uusi avaintiedosto</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Huom.: Älä käytä tiedostoa jonka sisältö voi muuttua, sillä se voi estää tietokannan avauksen!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Virheellinen avaintiedosto</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Et voi käyttää kyseistä tietokantaa avaintiedostona. Ole hyvä ja valitse eri tiedosto, tai luo uusi avaintiedosto.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Epäilyttävä avaintiedosto</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Valittu avaintiedosto näyttää tietokannalta. Avaintiedoston täytyy olla staattinen tiedosto jonka sisältö ei koskaan muutu. Muussa tapauksessa saatat menettää pääsyn tietokantaasi lopullisesti.
+Haluatko jatkaa käyttämällä tätä tiedostoa?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3281,7 +4238,7 @@ Viesti: %2</translation>
</message>
<message>
<source>&amp;Recent databases</source>
- <translation>Viimeisimmät tietokannat</translation>
+ <translation>&amp;Viimeisimmät tietokannat</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -3293,7 +4250,7 @@ Viesti: %2</translation>
</message>
<message>
<source>&amp;Groups</source>
- <translation>Ryhmät</translation>
+ <translation>&amp;Ryhmät</translation>
</message>
<message>
<source>&amp;Tools</source>
@@ -3360,10 +4317,6 @@ Viesti: %2</translation>
<translation>&amp;Asetukset</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Salasanageneraattori</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Lukitse tietokannat</translation>
</message>
@@ -3550,14 +4503,6 @@ Suosittelemme, että käytät AppImagea, jonka voit hakea lataussivustoltamme.</
<translation>Näytä TOTP QR-koodi...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Tarkista päivitykset...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Jaa tietue</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>HUOM: Käytät KeePassXC:n esiversiota!
@@ -3575,6 +4520,74 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>You can always check for updates manually from the application menu.</source>
<translation>Voit tarkistaa päivitykset manuaalisesti sovellusvalikosta.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Vie</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Tarkista päivitykset...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Lataa kaikki &amp;faviconit</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Järjestä &amp;A-Ö</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Järjestä &amp;Ö-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Salasanageneraattori</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Lataa favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Vie HTML-tiedostoon...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password-holvi...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Tuo 1Password-holvi</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Alkuun pääsy</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Avaa alkuun pääsyyn tarkoitettu käyttäjäopas -PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>&amp;Verkko-ohje...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Siirry verkkodokumentaatioon (avaa selaimen)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>&amp;Käyttäjäopas</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Avaa käyttäjäopas PDF-muodossa</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Pikanäppäimet</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3634,6 +4647,14 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>Adding missing icon %1</source>
<translation>Lisätään puuttuva ikoni %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Poista mukautettu tieto %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Lisätään mukautettua tietoa%1 [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3704,6 +4725,73 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>Viallinen OpData01. Otsaketieto puuttuu</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Kaikkia IV-tavuja ei voitu lukea. Tarvittiin 16, mutta saatiin vain %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>OpData01:n salakirjoitusta ei voitu alustaa: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Kaikkia HMAC-allekirjoituksen tavuja ei voitu lukea</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>Viallinen OpData01 epäonnistuneen HMAC:in vuoksi</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Selkotekstiä ei voitu prosessoida</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>Odotettiin %1 tavua selkotekstiä, löydettiin %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Tietokannan lukeminen ei luonut instanssia
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Hakemiston .opvault täytyy olla olemassa</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>Hakemistoon .opvault täytyy olla lukuoikeus</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Hakemisto .opvault/default täytyy olla olemassa</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Hakemistoon .opvault/default täytyy olla lukuoikeus</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Pääavainta %1 ei voitu purkaa</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Pääavainta %1 ei kyetty johdattamaan</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3727,7 +4815,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
<message>
<source>Found zero keys</source>
- <translation>Löytyi nolla avainta</translation>
+ <translation>Yhtään avainta ei löytynyt</translation>
</message>
<message>
<source>Failed to read public key.</source>
@@ -3803,6 +4891,17 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Salasanat eivät täsmää</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Salasanat jotka ovat tähän mennessä samoja</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3828,6 +4927,22 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>Generate master password</source>
<translation>Luo pääsalasana</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Salasanakenttä</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Vaihda salasanan näkyvyyttä</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Toista salasana -kenttä</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Näytä salasanageneraattori</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3837,7 +4952,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
<message>
<source>Password:</source>
- <translation>Salasana</translation>
+ <translation>Salasana:</translation>
</message>
<message>
<source>strength</source>
@@ -3857,22 +4972,10 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<translation>Merkkityypit</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Isot kirjaimet</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Pienet kirjaimet</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Numerot</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Erikoismerkit</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Laajennettu ASCII</translation>
</message>
@@ -3953,18 +5056,10 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<translation>Lisäasetukset</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Isot kirjaimet A:sta F:ään</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Pienet kirjaimet A:sta F:ään</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3997,18 +5092,10 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matemaattiset</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Viivat</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4056,6 +5143,74 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>Regenerate</source>
<translation>Luo uudelleen</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Luotu salasana</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Isot kirjaimet</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Pienet kirjaimet</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Erikoismerkit</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Matemaattiset symbolit</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Viivat ja vinoviivat</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Poissuljetut merkit</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Heksasalasanat</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Salasanan pituus</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Aakkoslaji:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Luo salasana uudelleen</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Kopioi salasana</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Hyväksy salasana</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>pienaakkoset</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>SUURAAKKOSET</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Otsikon aakkoslaji</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Vaihda salasanan näkyvyyttä</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4063,12 +5218,9 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Valitse</translation>
+ <source>Statistics</source>
+ <translation>Tilastot</translation>
</message>
</context>
<context>
@@ -4087,7 +5239,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
<message>
<source>Empty</source>
- <translation>Tyhjä</translation>
+ <translation>Tyhjennä</translation>
</message>
<message>
<source>Remove</source>
@@ -4105,6 +5257,10 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>Merge</source>
<translation>Yhdistä</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Jatka</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4158,7 +5314,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
<message>
<source>Add a new entry to a database.</source>
- <translation>Lisää uusi tietue tietokantaan.</translation>
+ <translation>Lisää uusi tietue tietokantaan</translation>
</message>
<message>
<source>Path of the database.</source>
@@ -4174,7 +5330,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
<message>
<source>Username for the entry.</source>
- <translation>Tietueen käyttäjänimi.</translation>
+ <translation>Tietueen käyttäjänimi</translation>
</message>
<message>
<source>username</source>
@@ -4197,10 +5353,6 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<translation>Luo tietueelle salasana.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Luodun salasanan pituus.</translation>
- </message>
- <message>
<source>length</source>
<translation>pituus</translation>
</message>
@@ -4227,7 +5379,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message>
<message>
<source>Title for the entry.</source>
- <translation>Tietueen nimi</translation>
+ <translation>Tietueen otsikko.</translation>
</message>
<message>
<source>title</source>
@@ -4250,18 +5402,6 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<translation>Suorita salasanalle edistynyt analyysi.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Pura ja tulosta tietokannan sisältö.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Purettavan tietokannan polku.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Syötä salasana avataksesi %1:</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4306,10 +5446,6 @@ Käytettävissä olevat komennot:
<translation>Yhdistä kaksi tietokantaa.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Tietokannan polku, johon yhdistetään.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Tietokannan polku, josta yhdistetään.</translation>
</message>
@@ -4386,10 +5522,6 @@ Käytettävissä olevat komennot:
<translation>Selainintegraatio</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Haaste/vastaus - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Paina</translation>
</message>
@@ -4420,10 +5552,6 @@ Käytettävissä olevat komennot:
<translation>Luo uusi satunnainen salasana.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Väärä arvo salasanan pituudeksi %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Tietuetta ei voitu luoda polun %1 kanssa.</translation>
</message>
@@ -4465,7 +5593,7 @@ Käytettävissä olevat komennot:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Tyhjennetään leikepöytä %1 sekunnissa...</numerusform><numerusform>Tyhjennetään leikepöytä %1 sekunnissa...</numerusform></translation>
+ <translation><numerusform>Leikepöytä tyhjennetään %1 sekunnin kuluttua...</numerusform><numerusform>Leikepöytä tyhjennetään %1 sekunnin kuluttua...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4481,10 +5609,6 @@ Käytettävissä olevat komennot:
<translation>määrä</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Virheellinen arvo salasanan pituudelle: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Tietuetta polulla %1 ei löydetty.</translation>
</message>
@@ -4609,26 +5733,6 @@ Käytettävissä olevat komennot:
<translation>Avaintiedoston %1 lataaminen epäonnistui: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Tiedostoa %1 ei ole.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Tiedostoa %1 ei voitu avata.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Virhe tietokantaa luettaessa:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Virhe tietokantaa jäsennettäessä:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Luodun salasanan pituus</translation>
</message>
@@ -4641,10 +5745,6 @@ Käytettävissä olevat komennot:
<translation>Käytä isoja merkkejä</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Käytä numeroita.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Käytä erikoismerkkejä</translation>
</message>
@@ -4789,10 +5889,6 @@ Käytettävissä olevat komennot:
<translation>Luotiin onnistuneesti uusi tietokanta.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Syötä salasana salataksesi tietokannan (Paina enter jättääksesi se tyhjäksi):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Avaintiedoston %1 luonti epäonnistui: %2</translation>
</message>
@@ -4801,10 +5897,6 @@ Käytettävissä olevat komennot:
<translation>Avaintiedoston %1 lataus epäonnistui: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Poista tietue tietokannasta.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Poistettavan tietueen polku.</translation>
</message>
@@ -4860,6 +5952,330 @@ Käytettävissä olevat komennot:
<source>Cannot create new group</source>
<translation>Uutta ryhmää ei voitu luoda</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Poista salasana-avain tietokannasta.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Näytä virheenjäljitystiedot.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Ota salasana-avain pois käytöstä tietokannasta josta yhdistetään.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versio %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Ohjelmiston tyyppi</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisio: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Jakelu: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Virheenjäljitystila on pois päältä.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Virheenjäljitystila on päällä.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Käyttöjärjestelmä: %1
+Suoritinarkkitehtuuri: %2
+Ydin: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Automaattisyöttö</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (allekirjoitettu ja allekirjoittamaton jakaminen)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (vain allekirjoitettu jakaminen)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (vain allekirjoittamaton jakaminen)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ei mitään</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Käytössä olevat laajennukset:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Kryptografiakirjastot:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Salasanaa ei voida luoda ja asettaa yhtäaikaisesti!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Lisää uuden ryhmän tietokantaan.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Lisättävän ryhmän polku.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Ryhmä %1 on jo olemassa!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Ryhmää %1 ei löydy.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Ryhmä %1 lisättiin onnistuneesti.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Tarkista onko yksikään salanoista julkisesti vuotanut. TIEDOSTONIMEN täytyy osoittaa sijaintiin tiedostosta, joka listaa SHA-1 -tiivisteet vuotaneista salasanoista HIBP-muodossa, kuten sivusto https://haveibeenpwned.com/Passwords tarjoaa.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>TIEDOSTONIMI</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analysoi salasanojen heikkouksia ja ongelmia.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>HIBP-tiedoston %1 avaus epäonnistui: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Tarkastetaan tietokantaa HIBP-tiedostoa vasten, tämä kestää hetken aikaa...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Sulje parhaillaan avoinna oleva tietokanta.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Näytä tämä ohje.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Yubikey-paikkaa käytetty tietokannan salaukseen.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>paikka</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Väärä sanamäärä %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>Sanalista on liian pieni (&lt; 1000 sanaa)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Poistu interaktiivisesta tilasta.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Formaatti jota viennissä käytetään. Saatavilla olevat vaihtoehdot ovat XML tai CSV. Oletuksena käytetään XML:ää.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Vie tietokannan sisällön standardiin tulosteeseen (stdout) halutussa formaatissa.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Tietokantaa ei voitu viedä XML-muotoon: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Formaattia %1 ei ole tuettu</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Käytä numeroita</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Väärä salasanan pituus %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Näytä komento-ohjeistus</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Käytettävissä olevat komennot:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Tuo XML-tietokannan sisältö.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Tietokannan XML-viennin polku.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Uuden tietokannan polku.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Vietyä XML-tietokantaa ei voitu tuoda %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Tietokanta tuotiin onnistuneesti.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Tuntematon komento %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Tasoittaa tulostuksen yksittäisille riveille.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Tulosta vain yhdistämisessä havaitut muutokset.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Yukibey-paikka toiselle tietokannalle.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>%1 yhdistettiin onnistuneesti kohteeseen %2</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Tietokannan sisältö ei muuttunut yhdistämisen yhteydessä.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Siirtää tietueen uuteen ryhmään.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Siirrettävän tietueen polku.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Kohderyhmän polku.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Ryhmää ei voitu löytää polussa %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>Tietue on jo ryhmässä %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Siirrettiin onnistuneesti tietue %1 ryhmään %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Avaa tietokanta.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Poistettavan ryhmän polku.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Juuriryhmää ei voida poistaa tietokannasta.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Ryhmä %1 siirrettiin onnistuneesti roskakoriin.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Ryhmä %1 poistettiin onnistuneesti.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Tietokantatiedoston %1 avaus epäonnistui: ei löytynyt</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Tietokantatiedostoa %1 ei voitu avata: ei ole tavallinen tiedosto</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Tietokantatiedoston %1 avaus epäonnistui: ei luettavissa</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Syötä salasana avataksesi %1:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Virheellinen Yubikey-paikka %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Kosketa Yubikey:ssä olevaa painiketta avataksesi kohteen %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Syötä salasana salataksesi tietokannan (valinnainen): </translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>HIBP-tiedosto, rivi %1: jäsennysvirhe</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Secret Service -integraatio</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Käyttäjätunnus</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1 [%2] Haaste-vastaus - Paikka %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Salasana tietueelle &apos;%1&apos; on vuotanut %2 kertaa!</numerusform><numerusform>Salasana tietueelle &apos;%1&apos; on vuotanut %2 kertaa!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Virheellinen salasanageneraattori kaikkien aktiivisten asetusten kanssa</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5014,6 +6430,93 @@ Käytettävissä olevat komennot:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Valinnat</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Käytä KeePassXC:ssä Freedesktop.org:in Secret Service -integraatiota</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Yleistä</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Näytä ilmoitus, kun tilitietoja pyydetään</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Jos tietokannassa on roskakori, tietueet siirretään suoraan sinne. Muussa tapauksessa ne poistetaan ilman vahvistusta.&lt;/p&gt;&lt;p&gt;Huomautus näytetään, mikäli tietue viittaa johonkin toiseen tietueeseen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Älä näytä vahvistusta asiakkaan kautta tapahtuville tietueiden poistolle.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Avoimet tietokannan ryhmät:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Tiedostonimi</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Ryhmä</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Hallitse</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Valtuutus</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Nämä sovellukset ovat parhaillaan yhdistetty:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Sovellus</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Katkaise yhteys</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Tietokannan asetukset</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Muokkaa tietokannan asetuksia</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Avaa tietokannan lukitus</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Avaa tietokannan lukitus näyttääksesi enemmän tietoja</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Lukitse tietokanta</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Avaa lukitus näyttääksesi</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ei mitään</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5136,9 +6639,100 @@ Käytettävissä olevat komennot:
<source>Signer:</source>
<translation>Allekirjoittaja:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Salli KeeSharen tuonnit</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Salli KeeSharen viennit</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Näytä vain varoitukset ja virheet</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Avain</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Allekirjoittajan nimen kenttä</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Luo uusi varmenne</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Tuo olemassa oleva varmenne</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Vie oma varmenne</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Tunnetut jaot</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Luota valittuun varmenteeseen</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Kysy joka kerta luotetaanko valittuun varmenteeseen</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Älä luota valittuun varmenteeseen</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Poista valittu varmenne</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Allekirjoitetun jaetun säiliön ylikirjoittaminen ei ole tuettu - vienti estettiin</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Vietyä säiliötä ei voitu kirjoittaa (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Allekirjoitusta ei voitu sisällyttää: Tiedostoa ei voitu avata kirjoitusta varten (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Allekirjoitusta ei voitu sisällyttää: Tiedostoon kirjoitus epäonnistui (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Tietokantaa ei voitu sisällyttää: Tiedostoa ei voitu avata kirjoitusta varten (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Tietokantaa ei voitu sisällyttää: Tiedostoon kirjoitus epäonnistui (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Allekirjoittamattoman jaetun säiliön ylikirjoitus ei ole tuettu - vienti estettiin</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Vietyä säiliötä ei voitu kirjoittaa</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Tapahtui odottamaton vientivirhe</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Tuo säiliöstä ilman allekirjoitusta</translation>
@@ -5152,6 +6746,10 @@ Käytettävissä olevat komennot:
<translation>Tuo säiliöstä sertifikaatin kanssa</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Haluatko luottaa kohteeseen %1 sormenjäljellä %2, joka on peräisin kohteesta %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Ei tällä kertaa</translation>
</message>
@@ -5168,18 +6766,6 @@ Käytettävissä olevat komennot:
<translation>Vain tämän kerran</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Tuonti kohteesta %1 epäonnistui (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Tuonti kohteesta %1 onnistui (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Tuotu kohteesta %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Allekirjoitettu jaettu säiliö ei ole tuettu - tuonti estettiin</translation>
</message>
@@ -5219,25 +6805,20 @@ Käytettävissä olevat komennot:
<source>Unknown share container type</source>
<translation>Tuntematon jaetun säiliön tyyppi</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Allekirjoitetun jaetun säiliön ylikirjoittaminen ei ole tuettu - vienti estettiin</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Vietyä säiliötä ei voitu kirjoittaa (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Allekirjoittamattoman jaetun säiliön ylikirjoitus ei ole tuettu - vienti estettiin</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Tuonti kohteesta %1 epäonnistui (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Vietyä säiliötä ei voitu kirjoittaa</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Tuonti kohteesta %1 onnistui (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Tapahtui odottamaton vientivirhe</translation>
+ <source>Imported from %1</source>
+ <translation>Tuotu kohteesta %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5252,10 +6833,6 @@ Käytettävissä olevat komennot:
<translation>Vie kohteeseen %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Haluatko luottaa kohteeseen %1 sormenjäljellä %2, joka on peräisin kohteesta %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Useampi lähde kohteeseen %1 tuonnissa %2</translation>
</message>
@@ -5263,22 +6840,6 @@ Käytettävissä olevat komennot:
<source>Conflicting export target path %1 in %2</source>
<translation>Ristiriita viennin %2 kohdepolussa %1</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Allekirjoitusta ei voitu sisällyttää: Tiedostoa ei voitu avata kirjoitusta varten (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Allekirjoitusta ei voitu sisällyttää: Tiedostoon kirjoitus epäonnistui (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Tietokantaa ei voitu sisällyttää: Tiedostoa ei voitu avata kirjoitusta varten (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Tietokantaa ei voitu sisällyttää: Tiedostoon kirjoitus epäonnistui (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5296,7 +6857,7 @@ Käytettävissä olevat komennot:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Umpeutuu &lt;b&gt;%n&lt;/b&gt; sekunnin kuluttua</numerusform><numerusform>Umpeutuu &lt;b&gt;%n&lt;/b&gt; sekunnin kuluttua</numerusform></translation>
+ <translation><numerusform>Vanhenee &lt;b&gt;%n&lt;/b&gt; sekunnin kuluttua</numerusform><numerusform>Vanhenee &lt;b&gt;%n&lt;/b&gt; sekunnin kuluttua</numerusform></translation>
</message>
</context>
<context>
@@ -5326,10 +6887,6 @@ Käytettävissä olevat komennot:
<translation>Määritä TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Avain:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Oletusarvoiset RFC 6238:n mukaiset tunnisteasetukset</translation>
</message>
@@ -5359,16 +6916,46 @@ Käytettävissä olevat komennot:
<translation>Koodikoko:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 numeroa</translation>
+ <source>Secret Key:</source>
+ <translation>Salainen avain:</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 numeroa</translation>
+ <source>Secret key must be in Base32 format</source>
+ <translation>Salaisen avaimen täytyy olla Base32-formaatissa</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 numeroa</translation>
+ <source>Secret key field</source>
+ <translation>Salaisen avaimen kenttä</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritmi:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Ajan uusiutumisen kenttä</translation>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation>numeroa</translation>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation>Virheellinen TOTP-salaisuus</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Syötit väärän salaisen avaimen. Avaimen täytyy olla Base32-formaatissa.
+Esimerkiksi: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Varmista TOTP-asetusten poisto</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Haluatko varmasti poistaa TOTP-asetukset tältä tietueelta?</translation>
</message>
</context>
<context>
@@ -5452,6 +7039,14 @@ Käytettävissä olevat komennot:
<source>Welcome to KeePassXC %1</source>
<translation>Tervetuloa KeePassXC:n versioon %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Tuo 1Passwordista</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Avaa yksi viimeisimmistä tietokannoista</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5475,5 +7070,13 @@ Käytettävissä olevat komennot:
<source>No YubiKey inserted.</source>
<translation>YubiKey ei ole kiinni laittessa.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Uudista laitetunnisteet</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Laiteavaimen paikan valinta</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_fr.ts b/share/translations/keepassx_fr.ts
index 7d6e726c8..3ebcb3eff 100644
--- a/share/translations/keepassx_fr.ts
+++ b/share/translations/keepassx_fr.ts
@@ -3,7 +3,7 @@
<name>AboutDialog</name>
<message>
<source>About KeePassXC</source>
- <translation>À propos de KeePassXC</translation>
+ <translation>À propos de KeePassXC</translation>
</message>
<message>
<source>About</source>
@@ -31,7 +31,7 @@
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
- <translation>Inclure les informations suivantes chaque fois que vous signalez un bogue :</translation>
+ <translation>Inclure les informations suivantes à chaque fois que vous signalez un bogue :</translation>
</message>
<message>
<source>Copy to clipboard</source>
@@ -39,7 +39,7 @@
</message>
<message>
<source>Project Maintainers:</source>
- <translation>Mainteneurs du projet :</translation>
+ <translation>Développeurs du projet :</translation>
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Suivre le style</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Réinitialiser les paramètres ?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Voulez-vous réinitialiser tous les paramètres généraux et de sécurité à leur valeur par défaut ?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -108,19 +116,7 @@
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
- <translation>Démarrer une seule instance de KeePassXC</translation>
- </message>
- <message>
- <source>Remember last databases</source>
- <translation>Se souvenir des dernières bases de données</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Mémoriser les derniers fichiers-clés et les clés électroniques de sécurité</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Charger les bases de données précédentes au démarrage</translation>
+ <translation>Exécuter une seule instance de KeePassXC</translation>
</message>
<message>
<source>Minimize window at application startup</source>
@@ -140,7 +136,7 @@
</message>
<message>
<source>Automatically save after every change</source>
- <translation>Enregistrer automatiquement après chaque changement</translation>
+ <translation>Enregistrer automatiquement après chaque modification</translation>
</message>
<message>
<source>Automatically save on exit</source>
@@ -163,10 +159,6 @@
<translation>Utiliser l’icône de groupe à la création d’une entrée</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimiser après avoir copié dans le presse-papiers</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Masquer le panneau de prévisualisation de l&apos;entrée</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Cacher la fenêtre dans la zone de notification une fois minimisée</translation>
</message>
<message>
- <source>Language</source>
- <translation>Langue</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Saisie automatique</translation>
</message>
@@ -220,7 +208,7 @@
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation>Délai de remplissage de la saisie automatique</translation>
+ <translation>Vitesse de remplissage de la saisie automatique</translation>
</message>
<message>
<source> ms</source>
@@ -232,27 +220,108 @@
<translation>Délai de démarrage de la saisie automatique</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Vérifier les mises à jour au démarrage de l&apos;application</translation>
+ <source>Movable toolbar</source>
+ <translation>Barre d’outils déplaçable</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Inclure les versions préliminaires lors de la vérification des mises à jour</translation>
+ <source>Remember previously used databases</source>
+ <translation>Mémoriser les bases de données précédentes utilisées</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Barre d’outils mobile</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Charger les bases de données précédemment ouvertes au démarrage</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation>Mémoriser les fichiers-clé de base de données et les clés de sécurité</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Vérifier les mises à jour au démarrage de l&apos;application une fois par semaine</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Inclure les versions bêta lors de la vérification des mises à jour.</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Style de bouton :</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Langue :</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(relancer le programme pour activer)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Réduire la fenêtre après déverrouillage de la base de données</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Réduire lors de l&apos;ouverture d&apos;une URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Masquer la fenêtre après copie dans le presse-papiers</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Réduire</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Mettre en arrière-plan</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Style de bouton</translation>
+ <source>Favicon download timeout:</source>
+ <translation>Temps imparti au chargement de la favicon :</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Temps imparti au chargement de l&apos;icône du site Web en secondes</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> s</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Style de bouton de barre d&apos;outils</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Utiliser une police non proportionnelle pour les notes</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Sélection de la langue</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Réinitialiser les paramètres à leur valeur par défaut</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Raccourci global de la saisie automatique</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Vitesse de remplissage de la saisie automatique en millisecondes</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Délai de démarrage de la saisie automatique en millisecondes</translation>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
<message>
<source>Timeouts</source>
- <translation>Expirations</translation>
+ <translation>Temps impartis</translation>
</message>
<message>
<source>Clear clipboard after</source>
@@ -285,11 +354,11 @@
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>Oublier TouchID lorsque la session est verrouillée ou le capot fermé</translation>
+ <translation>Oublier TouchID lorsque la session est verrouillée ou l&apos;écran rabattu</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
- <translation>Verrouiller les bases de données lorsque la fenêtre est minimisée</translation>
+ <translation>Verrouiller les bases de données lorsque la fenêtre est réduite</translation>
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
@@ -297,7 +366,7 @@
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>Ne pas demander de répéter le mot de passe lorsque celui-ci est visible</translation>
+ <translation>Ne pas demander de confirmer le mot de passe lorsque celui-ci est visible</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
@@ -320,8 +389,29 @@
<translation>Confidentialité</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Utiliser DuckDuckGo en second recours pour télécharger les icônes des sites Web</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Utiliser le service DuckDuckGo pour télécharger les icônes des sites Web</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Effacement du presse-papiers en secondes</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Réinitialiser TouchID après inactivité</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Temps imparti au verrouillage de la base de données en secondes</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Effacer la requête de recherche après</translation>
</message>
</context>
<context>
@@ -340,19 +430,19 @@
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation>La syntaxe de votre instruction de saisie automatique est incorrecte !</translation>
+ <translation>La syntaxe de votre instruction de saisie automatique est incorrecte !</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
- <translation>Cette commande de saisie automatique contient un délai très long. Voulez-vous vraiment continuer ?</translation>
+ <translation>Cette commande de saisie automatique contient un délai très long. Voulez-vous vraiment continuer  ?</translation>
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>Cette commande de saisie automatique contient des touches très lentes. Voulez-vous vraiment continuer ?</translation>
+ <translation>Cette commande de saisie automatique contient une séquence de touches très lentes. Voulez-vous vraiment continuer ?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
- <translation>Cette commande de saisie automatique contient des arguments répétés très souvent. Voulez-vous vraiment continuer ?</translation>
+ <translation>Cette commande de saisie automatique contient des arguments répétés très souvent. Voulez-vous vraiment continuer ?</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copier le nom d’utilisateur</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copier le mot de &amp;passe</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Sélectionner une entrée à saisir automatiquement :</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Recherche…</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -422,7 +527,15 @@
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
<translation>%1 a demandé l’accès aux mots de passe pour les éléments suivants.
-Veuillez indiquer si vous souhaitez autoriser l’accès.</translation>
+Veuillez sélectionner ceux auxquels vous souhaitez autoriser l’accès.</translation>
+ </message>
+ <message>
+ <source>Allow access</source>
+ <translation>Autoriser l&apos;accès</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Refuser l&apos;accès</translation>
</message>
</context>
<context>
@@ -454,11 +567,7 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>Ceci est requis pour accéder à vos bases de données à partir de KeePassXC-Browser</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Activer l’intégration de KeePassXC aux navigateurs</translation>
+ <translation>Ceci est obligatoire pour accéder à vos bases de données à partir de KeePassXC-Browser</translation>
</message>
<message>
<source>General</source>
@@ -470,7 +579,7 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
</message>
<message>
<source>&amp;Google Chrome</source>
- <translation>Chrome de &amp;Google</translation>
+ <translation>&amp;Google Chrome</translation>
</message>
<message>
<source>&amp;Firefox</source>
@@ -495,11 +604,11 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>Seules les entrées répondant au même format (http://, https://, …) sont retournées.</translation>
+ <translation>Seules les entrées répondant au même format (http://, https://…) sont retournées.</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
- <translation>&amp;Correspondre au format d’URL (p. ex. https://…)</translation>
+ <translation>A&amp;dapter au format d’URL (ex. : https://…)</translation>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
@@ -526,7 +635,7 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Ne &amp;jamais demander avant d’accéder aux identifiants</translation>
+ <translation>Ne jamais demander avant d’a&amp;ccéder aux identifiants</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
@@ -534,10 +643,6 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
<translation>Ne jamais demander avant de &amp;mettre à jour les identifiants</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Seule la base de données sélectionnée doit être connectée avec un client.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>&amp;Chercher les identifiants correspondants dans toutes les bases de données ouvertes</translation>
@@ -560,7 +665,7 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
- <translation>Supporter une application proxy entre KeePassXC et l’extension pour navigateur web</translation>
+ <translation>Prend en charge une application proxy entre KeePassXC et l’extension pour navigateur web</translation>
</message>
<message>
<source>Use a &amp;proxy application between KeePassXC and browser extension</source>
@@ -578,7 +683,7 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Parcourir...</translation>
+ <translation>Parcourir…</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
@@ -593,10 +698,6 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
<translation>&amp;Navigateur Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Attention&lt;/b&gt;, l&apos;application keepassxc-proxy n&apos;a pas été trouvée !&lt;br /&gt;Veuillez vérifier le répertoire d&apos;installation de KeePassXC ou confirmez le chemin personnalisé dans les options avancées. &lt;br /&gt;L&apos;intégration au navigateur NE MARCHERA PAS sans l&apos;application de serveur mandataire. &lt;br /&gt;Chemin attendu :</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Fichiers exécutables</translation>
</message>
@@ -615,18 +716,62 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation>Veuillez regarder les instructions spéciales pour l&apos;extension du navigateur utilisé ci-dessous</translation>
+ <translation>Veuillez regarder les instructions spéciales pour l&apos;extension pour navigateur web utilisé ci-dessous</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser est nécessaire pour que l&apos;intégration au navigateur fonctionne. &lt;br /&gt;Téléchargez-le pour %1 et%2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Retourne les identifiants expirés. La chaîne [expiré] est ajoutée au titre.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Autoriser l&apos;envoi des identifiants expirés.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Activer l&apos;intégration au navigateur</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Les navigateurs installés par snap ne sont pas pris en charge actuellement.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Toutes les bases de données connectées à l’extension retourneront les identifiants trouvés.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Ne pas afficher la fenêtre de suggestion de migration des anciens paramètres de KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Ne pas confirmer la migration des paramètres KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Champ d&apos;adresse de proxy personnalisé</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Sélectionner un fichier de proxy personnalisé</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Attention&lt;/b&gt;, l&apos;application keepassxc-proxy n&apos;a pas été trouvée !&lt;br /&gt;Veuillez vérifier le répertoire d&apos;installation de KeePassXC ou validez le chemin personnalisé dans les options avancées.&lt;br /&gt;L&apos;intégration au navigateur NE FONCTIONNERA PAS sans l&apos;application du proxy.&lt;br /&gt;Chemin requis : %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
<message>
<source>KeePassXC: New key association request</source>
- <translation>KeePassXC : Nouvelle demande d’association de touche</translation>
+ <translation>KeePassXC : nouvelle demande d’association de touche</translation>
</message>
<message>
<source>You have received an association request for the above key.
@@ -636,7 +781,7 @@ give it a unique name to identify and accept it.</source>
<translation>Vous avez reçu une demande d’association pour la clé ci-dessus.
Si vous voulez autoriser cette clé à accéder à votre base de données KeePassXC,
-attribuez lui un nom unique pour l’identifier et acceptez la.</translation>
+attribuez-lui un nom unique pour l’identifier et acceptez-la.</translation>
</message>
<message>
<source>Save and allow access</source>
@@ -644,13 +789,13 @@ attribuez lui un nom unique pour l’identifier et acceptez la.</translation>
</message>
<message>
<source>KeePassXC: Overwrite existing key?</source>
- <translation>KeePassXC : Remplacer la clé existante ?</translation>
+ <translation>KeePassXC : remplacer la clé existante ?</translation>
</message>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
<translation>Une clé de chiffrement partagée portant le nom « %1 » existe déjà.
-Voulez-vous la remplacer ?</translation>
+Voulez-vous la remplacer ?</translation>
</message>
<message>
<source>KeePassXC: Update Entry</source>
@@ -658,11 +803,11 @@ Voulez-vous la remplacer ?</translation>
</message>
<message>
<source>Do you want to update the information in %1 - %2?</source>
- <translation>Voulez-vous mettre à jour les informations dans %1 - %2 ?</translation>
+ <translation>Voulez-vous mettre à jour l’information dans %1 - %2 ?</translation>
</message>
<message>
<source>Abort</source>
- <translation>Annuler</translation>
+ <translation>Abandonner</translation>
</message>
<message>
<source>Converting attributes to custom data…</source>
@@ -670,7 +815,7 @@ Voulez-vous la remplacer ?</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation>KeePassXC : Attributs KeePassHTTP convertis</translation>
+ <translation>KeePassXC : attributs KeePassHTTP convertis</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
@@ -680,11 +825,11 @@ Moved %2 keys to custom data.</source>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>%n clé a été déplacée avec succès vers les données personnalisées.</numerusform><numerusform>%n clés ont été déplacées avec succès vers les données personnalisées.</numerusform></translation>
+ <translation><numerusform>Déplacement de %n clés en données personnalisées réussi.</numerusform><numerusform>Déplacement de %n clés en données personnalisées réussi.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation>KeePassXC : Aucune entrée contenant des attributs KeePassHTTP trouvée !</translation>
+ <translation>KeePassXC : aucune entrée contenant des attributs KeePassHTTP n&apos;a été trouvée !</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
@@ -692,25 +837,29 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation>KeePassXC : Ancienne integration au navigateur détectée</translation>
+ <translation>KeePassXC : ancienne intégration au navigateur détectée</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation>KeePassXC : Créer un nouveau groupe</translation>
+ <translation>KeePassXC : créer un nouveau groupe</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation>Une demande de création pour un nouveau groupe &quot;%1&quot; a été reçue.
-Voulez-vous créer ce groupe ?
+ <translation>Une demande de création pour un nouveau groupe « %1 » a été reçue.
+Voulez-vous créer ce groupe ?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation>Vos réglages pour KeePassXC-Browser doivent être intégrés dans les réglages de la base de données. Ceci est nécessaire pour maintenir vos connexions actuelles avec le navigateur ouvertes. Souhaitez-vous effectuer la migration de vos réglages maintenant ?</translation>
+ <translation>Vos paramètres pour KeePassXC-Browser doivent être déplacés dans ceux de la base de données. Ceci est nécessaire pour conserver l&apos;intégration avec votre navigateur. Voulez-vous effectuer la migration de vos paramètres maintenant ?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Ne plus afficher cet avertissement</translation>
</message>
</context>
<context>
@@ -721,7 +870,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>Ajouter &apos; - Clone&apos; au titre</translation>
+ <translation>Ajouter « - Clone » au titre</translation>
</message>
<message>
<source>Replace username and password with references</source>
@@ -771,12 +920,8 @@ Would you like to migrate your existing settings now?</source>
<translation>Le premier enregistrement contient les noms de champs</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Nombre de lignes d’en-têtes à ignorer</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
- <translation>Considère &apos;\&apos; comme un échappement</translation>
+ <translation>Utiliser « \ » comme caractère d’échappement</translation>
</message>
<message>
<source>Preview</source>
@@ -812,18 +957,34 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation>Des erreurs ont été détectées dans le fichier CSV !</translation>
+ <translation>Des erreurs ont été détectées dans le fichier CSV  !</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n message supplémentaire ignoré]</numerusform><numerusform>[%n messages supplémentaires ignorés]</numerusform></translation>
+ <translation><numerusform>[%n autre message ignoré]</numerusform><numerusform>[%n autres messages ignorés]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
- <translation>Import CSV : scripteur a rencontré des erreurs :
+ <translation>Importation CSV : l&apos;analyseur a rencontré des erreurs :
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Délimitation du texte</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Séparateur de champ</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Nombre de lignes d’en-tête à ignorer</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Aperçu de l&apos;importation CSV</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -865,16 +1026,34 @@ Would you like to migrate your existing settings now?</source>
<translation>Erreur lors de la lecture de la base de données : %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Impossible d&apos;enregistrer car la base de données n&apos;a pas de nom de fichier.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Le fichier ne peut pas être enregistré car il est ouvert en lecture seule.</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
- <translation>La clé n&apos;a pas été transformée. Ceci est un bogue, pouvez-vous s&apos;il vous plaît le signaler aux développeurs ?</translation>
+ <translation>La clé n&apos;a pas été transformée. Ceci est un bogue, veuillez le signaler aux développeurs !</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Copie de sécurité de la base de données située sur %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Impossible d&apos;enregistrer car la base de données ne pointe pas vers un fichier valide.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Impossible d&apos;enregistrer car la base de données pointe vers un fichier en lecture-seule.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Le fichier de la base de données contient des modifications non fusionnées.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Corbeille</translation>
</message>
</context>
<context>
@@ -887,45 +1066,29 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Saisir la clé maîtresse</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Fichier-clé :</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Mot de passe :</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Parcourir</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Actualiser</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Question-réponse :</translation>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation>Format de fichier-clé hérité</translation>
+ <translation>Ancien format de fichier-clé</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation>Vous utilisez un format de fichier-clé hérité qui pourrait ne plus être pris en charge à l’avenir.
+ <translation>Vous utilisez un ancien format de fichier-clé qui pourrait ne plus être pris en charge à l’avenir.
Veuillez envisager de générer un nouveau fichier-clé.</translation>
</message>
<message>
<source>Don&apos;t show this warning again</source>
- <translation>Ne plus afficher cette avertissement</translation>
+ <translation>Ne plus afficher cet avertissement</translation>
</message>
<message>
<source>All files</source>
@@ -933,27 +1096,107 @@ Veuillez envisager de générer un nouveau fichier-clé.</translation>
</message>
<message>
<source>Key files</source>
- <translation>Fichiers-clés</translation>
+ <translation>Fichiers-clé</translation>
</message>
<message>
<source>Select key file</source>
<translation>Sélectionner un fichier-clé</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID pour déverrouiller rapidement</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Impossible d&apos;ouvrir de fichier-clé : %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Impossible d&apos;ouvrir la base de données :
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Sélectionner l&apos;emplacement...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Impossible d’ouvrir le fichier-clé :
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Déverrouiller la base de données KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Saisir un mot de passe :</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Champ de mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Basculer l&apos;affichage du mot de passe</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Saisir d&apos;autres identifiants :</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Sélection du fichier-clé</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Sélection de l&apos;emplacement de la clé matérielle</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Rechercher un fichier-clé</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Parcourir…</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Actualiser les marqueurs matérielles</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Clés matérielles :</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Vous pouvez utiliser une clé de sécurité matérielle comme &lt;strong&gt;YubiKey&lt;/strong&gt; ou &lt;strong&gt;OnlyKey&lt;/strong&gt; avec des emplacements pour HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Cliquez pour plus d&apos;information...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Aide sur les clés matérielles</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID pour déverrouillage rapide</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Effacer</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Effacer le fichier-clé</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Sélectionner un fichier...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Échec du déverrouillage et aucun mot de passe introduit</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Le déverrouillage de la base de données a échoué et vous n&apos;avez pas saisi de mot de passe.
+Voulez-vous essayer sans mot de passe ?
+
+Afin d&apos;éviter cette erreur, vous devez réinitialiser votre mot de passe dans les « Paramètres de base de données / Sécurité ».</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Essayer à nouveau sans mot de passe</translation>
</message>
</context>
<context>
@@ -979,7 +1222,7 @@ Veuillez envisager de générer un nouveau fichier-clé.</translation>
</message>
<message>
<source>Master Key</source>
- <translation>Clé maîtresse</translation>
+ <translation>Clé maître</translation>
</message>
<message>
<source>Encryption Settings</source>
@@ -1018,7 +1261,7 @@ Veuillez envisager de générer un nouveau fichier-clé.</translation>
</message>
<message>
<source>Delete the selected key?</source>
- <translation>Supprimer la clé sélectionnée ?</translation>
+ <translation>Supprimer la clé sélectionnée ?</translation>
</message>
<message>
<source>Do you really want to delete the selected key?
@@ -1045,12 +1288,12 @@ Cela peut empêcher la connexion avec l&apos;extension de navigateur.</translati
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation>Voulez-vous vraiment désactiver tous les navigateurs ?
+ <translation>Voulez-vous vraiment déconnecter tous les navigateurs ?
Cela peut empêcher la connexion avec l&apos;extension de navigateur.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
- <translation>KeePassXC : Aucune clé n’a été trouvée</translation>
+ <translation>KeePassXC : aucune clé n’a été trouvée</translation>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
@@ -1058,11 +1301,11 @@ Cela peut empêcher la connexion avec l&apos;extension de navigateur.</translati
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
- <translation>KeePassXC : Les clés ont été supprimées de la base de données</translation>
+ <translation>KeePassXC : les clés ont été supprimées de la base de données</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>%n clé de chiffrement a été retirée avec succès des paramètres de KeePassXC.</numerusform><numerusform>%n clés de chiffrement ont été retirées avec succès des paramètres de KeePassXC.</numerusform></translation>
+ <translation><numerusform>%n clé de cryptage a bien été supprimée des paramètres de KeePassXC.</numerusform><numerusform>%n clés de cryptage ont bien été supprimées des paramètres de KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1071,27 +1314,27 @@ Cela peut empêcher la connexion avec l&apos;extension de navigateur.</translati
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation>Êtes-vous sûr de vouloir effacer les préférences de site pour toutes les entrées ? Les permissions d&apos;accès aux entrées seront révoquées.</translation>
+ <translation>Êtes-vous sûr de vouloir effacer les préférences de site pour toutes les entrées ? Les permissions d&apos;accès aux entrées seront révoquées.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
- <translation>Retrait des autorisations enregistrées…</translation>
+ <translation>Suppression des autorisations enregistrées…</translation>
</message>
<message>
<source>Abort</source>
- <translation>Annuler</translation>
+ <translation>Abandonner</translation>
</message>
<message>
<source>KeePassXC: Removed permissions</source>
- <translation>KeePassXC : Les autorisations ont été retirées</translation>
+ <translation>KeePassXC : les autorisations ont été supprimées</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Les autorisations de %n entrée a été retirée avec succès.</numerusform><numerusform>Les autorisations de %n entrées ont été retirées avec succès.</numerusform></translation>
+ <translation><numerusform>%n permission a bien été supprimée.</numerusform><numerusform>%n permissions ont bien été supprimées.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
- <translation>KeePassXC : Aucune entrée avec autorisation n’a été trouvée !</translation>
+ <translation>KeePassXC : aucune entrée avec autorisation n’a été trouvée !</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
@@ -1104,9 +1347,17 @@ Permissions to access entries will be revoked.</source>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
- <translation>Voulez-vous convertir toutes les anciennes données d&apos;intégration au navigateur en version plus récente ?
+ <translation>Voulez-vous convertir toutes les anciennes données d&apos;intégration au navigateur en version plus récente ?
Ceci est nécessaire pour assurer la compatibilité de l&apos;extension.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Clés de navigateurs stockées</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Supprimer la clé sélectionnée</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1132,7 +1383,7 @@ Ceci est nécessaire pour assurer la compatibilité de l&apos;extension.</transl
</message>
<message>
<source>Benchmark 1-second delay</source>
- <translation>Benchmark avec 1 seconde de délai</translation>
+ <translation>Mesurer pour un délai d’une seconde</translation>
</message>
<message>
<source>Memory Usage:</source>
@@ -1190,7 +1441,7 @@ Ceci est nécessaire pour assurer la compatibilité de l&apos;extension.</transl
<message>
<source>Number of rounds too high</source>
<comment>Key transformation rounds</comment>
- <translation>Nombre de tours trop élevé</translation>
+ <translation>Nombre de cycles trop élevé</translation>
</message>
<message>
<source>You are using a very high number of key transform rounds with Argon2.
@@ -1198,7 +1449,7 @@ Ceci est nécessaire pour assurer la compatibilité de l&apos;extension.</transl
If you keep this number, your database may take hours or days (or even longer) to open!</source>
<translation>Vous utilisez un très grand nombre de cycles de transformation de clé avec Argon2.
-Si vous conservez ce nombre, votre base de données pourrait prendre des heures voire des jours (ou plus) pour s’ouvrir !</translation>
+Si vous conservez ce nombre, votre base de données pourrait prendre des heures, voire des jours (ou plus) pour s’ouvrir !</translation>
</message>
<message>
<source>Understood, keep number</source>
@@ -1211,7 +1462,7 @@ Si vous conservez ce nombre, votre base de données pourrait prendre des heures
<message>
<source>Number of rounds too low</source>
<comment>Key transformation rounds</comment>
- <translation>Nombre de tours trop faible</translation>
+ <translation>Nombre de cycles trop faible</translation>
</message>
<message>
<source>You are using a very low number of key transform rounds with AES-KDF.
@@ -1219,7 +1470,7 @@ Si vous conservez ce nombre, votre base de données pourrait prendre des heures
If you keep this number, your database may be too easy to crack!</source>
<translation>Vous utilisez un très petit nombre de cycles de transformation de clé avec AES-KDF.
-Si vous conservez ce nombre, votre base de données pourrait être craquées trop facilement !</translation>
+Si vous conservez ce nombre, votre base de données pourrait être piratée trop facilement !</translation>
</message>
<message>
<source>KDF unchanged</source>
@@ -1227,17 +1478,17 @@ Si vous conservez ce nombre, votre base de données pourrait être craquées tro
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation>Échec de la transformation de la clé avec les nouveaux paramètres KDF ; KDF inchangé.</translation>
+ <translation>Échec de la transformation de la clé avec les nouveaux paramètres KDF ; KDF inchangé.</translation>
</message>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
+ <translation><numerusform>MiO</numerusform><numerusform>MiO</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>fils d&apos;exécution</numerusform><numerusform>fils d&apos;exécution</numerusform></translation>
+ <translation><numerusform>processus</numerusform><numerusform>processus</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1249,6 +1500,57 @@ Si vous conservez ce nombre, votre base de données pourrait être craquées tro
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Modifier le temps de déchiffrement existant</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Temps de déchiffrement en secondes</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Format de la base de données</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Algorithme de chiffrement</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Fonction de dérivation de clé</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Cycles de transformation</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Utilisation de la mémoire</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Parallélisme</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Entrées visibles</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Ne pas rendre &amp;visible cette base de données.</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Rendre visible les entrées so&amp;us ce groupe :</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Activez fd.o Secret Service pour accéder à ces paramètres.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1282,7 +1584,7 @@ Si vous conservez ce nombre, votre base de données pourrait être craquées tro
</message>
<message>
<source> MiB</source>
- <translation> MiB</translation>
+ <translation> MiO</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1296,6 +1598,40 @@ Si vous conservez ce nombre, votre base de données pourrait être craquées tro
<source>Enable &amp;compression (recommended)</source>
<translation>Activer la &amp;compression (recommandé)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Champ du nom de la base de données</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Champ de la description de la base de données</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Champ du nom d&apos;utilisateur par défaut</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Nombre maximal d&apos;éléments d&apos;historique par entrée</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Taille maximale d&apos;historique par entrée</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Supprimer la corbeille</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Voulez-vous supprimer la corbeille actuelle et tout son contenu ?
+Cette action est irréversible.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(ancien)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1341,7 +1677,7 @@ Si vous conservez ce nombre, votre base de données pourrait être craquées tro
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation>Vous devez ajouter au moins une clé de chiffrement pour protéger votre base de données !</translation>
+ <translation>Vous devez ajouter au moins une clé de chiffrement pour protéger votre base de données !</translation>
</message>
<message>
<source>No password set</source>
@@ -1351,9 +1687,9 @@ Si vous conservez ce nombre, votre base de données pourrait être craquées tro
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation>ATTENTION ! Vous n&apos;avez pas défini de mot de passe. L&apos;utilisation d&apos;une base de données sans mot de passe est fortement découragée.
+ <translation>ATTENTION ! Vous n&apos;avez pas défini de mot de passe. L&apos;utilisation d&apos;une base de données sans mot de passe est fortement déconseillée.
-Êtes-vous sûr de vouloir continuer sans mot de passe ?</translation>
+Êtes-vous sûr de vouloir continuer sans mot de passe ?</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1361,7 +1697,11 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Failed to change master key</source>
- <translation>Impossible de modifier la clé maîtresse</translation>
+ <translation>Impossible de modifier la clé maître</translation>
+ </message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Continuer sans mot de passe</translation>
</message>
</context>
<context>
@@ -1374,6 +1714,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Description :</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Champ du nom de la base de données</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Champ de la description de la base de données</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statistiques</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Survolez les lignes affichant une icône d&apos;erreur pour plus d&apos;informations.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valeur</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Nom de la base de données</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Description</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Emplacement</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Dernière sauvegarde</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Modifications non enregistrées</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>Oui</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>Non</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>La base de données a été modifiée mais les modifications ne sont pas encore été sauvegardées sur le disque.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Nombre de groupes</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Nombre d&apos;entrées</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Nombre d&apos;entrées expirées</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>La base de données contient des données expirées</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Mots de passes uniques</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Mots de passe non-uniques</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Plus de 10 % des mots de passe sont réutilisés. Lorsque cela est possible, utilisez des mots de passe uniques.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Nombre maximal de réutilisation de mot de passe</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Certains mots de passe sont réutilisés plus de trois fois. Lorsque cela est possible, utilisez des mots de passe uniques.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Nombre de mots de passe courts</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>La longueur minimale recommandée pour un mot de passe est au moins 8 caractères.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Nombre de mots de passe faibles</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Il est recommandé d&apos;utiliser des mots de passe longs et aléatoires ayant une qualité de « bonne » à « excellente ».</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Longueur moyenne des mots de passe</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 caractères</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>La longueur moyenne des mots de passe est de moins de 10 caractères. Des mots de passe plus longs offrent une meilleure sécurité.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1420,12 +1883,8 @@ Are you sure you want to continue without a password?</source>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation>La base de données créée n&apos;a ni clé, ni KDF, elle ne peut pas être enregistrée.
-Ceci est certainement un bogue, merci de le rapporter aux développeurs.</translation>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Le fichier de base de données n&apos;existe pas ou n&apos;est pas accessible.</translation>
+ <translation>La base de données créée n&apos;a ni clé, ni KDF et ne peut pas être enregistrée.
+Il s&apos;agit d&apos;un certainement d&apos;un bogue, veuillez le signaler aux développeurs.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1450,16 +1909,40 @@ Ceci est certainement un bogue, merci de le rapporter aux développeurs.</transl
<comment>Database tab name modifier</comment>
<translation>%1 [Lecture seule]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Impossible d&apos;ouvrir %1. Soit le fichier n&apos;existe pas, soit il n&apos;est pas accessible.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Exporter la base de données au format HTML</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>Fichier HTML</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Échec de l’écriture du fichier HTML.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Confirmation d&apos;export</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Vous allez exporter votre base de données vers un fichier non chiffré. Cela laisse vos mots de passe et vos informations privées vulnérables ! Êtes-vous sûr de vouloir continuer ?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Searching...</source>
- <translation>Recherche...</translation>
+ <translation>Recherche…</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
- <translation>Voulez-vous vraiment supprimer définitivement l’entrée « %1 » ?</translation>
+ <translation>Voulez-vous vraiment supprimer définitivement l’entrée « %1 » ?</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
@@ -1467,15 +1950,15 @@ Ceci est certainement un bogue, merci de le rapporter aux développeurs.</transl
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Voulez-vous vraiment déplacer %n entrée vers la corbeille ?</numerusform><numerusform>Voulez-vous vraiment déplacer %n entrées vers la corbeille ?</numerusform></translation>
+ <translation><numerusform>Voulez-vous vraiment déplacer une entrée dans la corbeille ?</numerusform><numerusform>Voulez-vous vraiment déplacer %n entrées dans la corbeille ?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
- <translation>Exécuter la commande ?</translation>
+ <translation>Exécuter la commande ?</translation>
</message>
<message>
<source>Do you really want to execute the following command?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</source>
- <translation>Voulez-vous vraiment exécuter la commande suivante ?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
+ <translation>Voulez-vous vraiment exécuter la commande suivante ?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
</message>
<message>
<source>Remember my choice</source>
@@ -1483,11 +1966,11 @@ Ceci est certainement un bogue, merci de le rapporter aux développeurs.</transl
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation>Voulez-vous vraiment supprimer définitivement le groupe « %1 » ?</translation>
+ <translation>Voulez-vous vraiment supprimer définitivement le groupe « %1 » ?</translation>
</message>
<message>
<source>No current database.</source>
- <translation>Pas de base de données.</translation>
+ <translation>Aucune base de données.</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
@@ -1499,15 +1982,15 @@ Ceci est certainement un bogue, merci de le rapporter aux développeurs.</transl
</message>
<message>
<source>No Results</source>
- <translation>Pas de résultats</translation>
+ <translation>Aucun résultat</translation>
</message>
<message>
<source>File has changed</source>
- <translation>Le fichier a changé</translation>
+ <translation>Le fichier a été modifié</translation>
</message>
<message>
<source>The database file has changed. Do you want to load the changes?</source>
- <translation>Le fichier de la base de données a été modifiée. Voulez-vous charger les changements ?</translation>
+ <translation>Le fichier de la base de données a été modifié. Voulez-vous le recharger ?</translation>
</message>
<message>
<source>Merge Request</source>
@@ -1516,32 +1999,28 @@ Ceci est certainement un bogue, merci de le rapporter aux développeurs.</transl
<message>
<source>The database file has changed and you have unsaved changes.
Do you want to merge your changes?</source>
- <translation>Le fichier de la base de données a été modifiée et vos changements ne sont pas enregistrés.
-Voulez-vous fusionner vos changements ?</translation>
+ <translation>Le fichier de la base de données a été modifié et vos changements ne sont pas enregistrés.
+Voulez-vous fusionner vos changements ?</translation>
</message>
<message>
<source>Empty recycle bin?</source>
- <translation>Vider la corbeille ?</translation>
+ <translation>Vider la corbeille ?</translation>
</message>
<message>
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
- <translation>Êtes-vous certain de vouloir vider définitivement la corbeille ?</translation>
+ <translation>Êtes-vous certain de vouloir vider définitivement la corbeille ?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Voulez-vous vraiment supprimer définitivement %n entrée ?</numerusform><numerusform>Voulez-vous vraiment supprimer définitivement %n entrées ?</numerusform></translation>
+ <translation><numerusform>Voulez-vous supprimer définitivement %n entrée ?</numerusform><numerusform>Voulez-vous supprimer définitivement %n entrées ?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Supprimer l&apos;entrée ?</numerusform><numerusform>Supprimer les entrées ?</numerusform></translation>
+ <translation><numerusform>Supprimer l&apos;entrée ?</numerusform><numerusform>Supprimer les entrées ?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Déplacer l’entrée vers la corbeille ?</numerusform><numerusform>Déplacer les entrées vers la corbeille ?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Fichier ouvert en lecture seule.</translation>
+ <translation><numerusform>Déplacer l&apos;entrée vers la corbeille ?</numerusform><numerusform>Déplacer les entrées vers la corbeille ?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1549,23 +2028,23 @@ Voulez-vous fusionner vos changements ?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation>Une entrée est en mode édition. Ignorer les changements et verrouiller quand même ?</translation>
+ <translation>Une entrée est cours d&apos;édition. Ignorer les changements et verrouiller quand même ?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation>« %1 » a été modifié.
-Enregistrer les changements ?</translation>
+Enregistrer les changements ?</translation>
</message>
<message>
<source>Database was modified.
Save changes?</source>
<translation>La base de données a été modifiée.
-Enregistrer les changements ?</translation>
+Enregistrer les changements ?</translation>
</message>
<message>
<source>Save changes?</source>
- <translation>Enregistrer les changements ?</translation>
+ <translation>Enregistrer les changements ?</translation>
</message>
<message>
<source>Could not open the new database file while attempting to autoreload.
@@ -1575,19 +2054,13 @@ Erreur : %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
- <translation>Désactiver les enregistrements sécurisées ?</translation>
+ <translation>Désactiver les enregistrements sécurisés ?</translation>
</message>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
- <translation>KeePassXC n’a pas réussi, à plusieurs reprises, à enregistrer la base de données. Cela est probablement causé par le maintien d’un verrou sur le fichier enregistré par les services de synchronisation de fichiers.
-Désactiver les enregistrements sécurisés et ressayer ?</translation>
- </message>
- <message>
- <source>Writing the database failed.
-%1</source>
- <translation>Une erreur s’est produite lors de l’écriture de la base de données.
-%1</translation>
+ <translation>KeePassXC n’a pas réussi à plusieurs reprises à enregistrer la base de données. Ceci est probablement dû au verrouillage du fichier enregistré par les services de synchronisation de fichiers.
+Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Passwords</source>
@@ -1603,11 +2076,11 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Replace references to entry?</source>
- <translation>Remplacer les références vers l&apos;entrée ?</translation>
+ <translation>Remplacer les références vers l&apos;entrée ?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>L&apos;entrée &quot;%1&quot; possède %2 référence. Voulez-vous écraser les références par les valeurs, ignorer cette entrée ou supprimer tout de même ?</numerusform><numerusform>L&apos;entrée « %1 » possède %2 références. Voulez-vous écraser les références par les valeurs, ignorer cette entrée ou supprimer tout de même ?</numerusform></translation>
+ <translation><numerusform>L&apos;entrée « %1 » possède %2 référence. Voulez-vous remplacer la référence par les valeurs, ignorer cette entrée ou la supprimer quand même ?</numerusform><numerusform>L&apos;entrée « %1 » possède %2 références. Voulez-vous remplacer les références par les valeurs, ignorer cette entrée ou la supprimer quand même ?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1615,23 +2088,31 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation>Déplacer le groupe vers la corbeille ?</translation>
+ <translation>Déplacer le groupe vers la corbeille ?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation>Voulez-vous vraiment déplacer le groupe « %1 » vers la corbeille ?</translation>
+ <translation>Voulez-vous vraiment déplacer le groupe « %1 » vers la corbeille ?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation>Fusionné avec succès les fichiers de base de données.</translation>
+ <translation>Les fichiers de base de données ont bien été fusionnés.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation>La base de données n&apos;a pas été modifiée par l&apos;opération de fusion.</translation>
+ <translation>La base de données n&apos;a pas été modifiée lors de l&apos;opération de fusion.</translation>
</message>
<message>
<source>Shared group...</source>
- <translation>Groupe partagé ...</translation>
+ <translation>Groupe partagé...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Échec lors de l&apos;écriture de la base de données : %1.</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Cette base de données est ouverte en lecture-seule. La sauvegarde automatique est désactivée.</translation>
</message>
</context>
<context>
@@ -1674,15 +2155,15 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Select private key</source>
- <translation>Choisir un fichier-clé</translation>
+ <translation>Sélectionner un fichier-clé</translation>
</message>
<message>
<source>File too large to be a private key</source>
- <translation>Le fichier est trop gros pour être un fichier-clé</translation>
+ <translation>Le fichier est trop important pour être un fichier-clé</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>Échec d’ouverture de la clé privée</translation>
+ <translation>Échec lors de l’ouverture de la clé privée</translation>
</message>
<message>
<source>Entry history</source>
@@ -1698,7 +2179,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
- <translation>Les mots de passe insérés sont différents.</translation>
+ <translation>Les mots de passe saisis sont différents.</translation>
</message>
<message>
<source>New attribute</source>
@@ -1706,7 +2187,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>Êtes-vous certain de vouloir supprimer cet attribut ?</translation>
+ <translation>Êtes-vous certain de vouloir supprimer cet attribut ?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1722,19 +2203,19 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Apply generated password?</source>
- <translation>Appliquer le mot de passe généré ?</translation>
+ <translation>Appliquer le mot de passe généré ?</translation>
</message>
<message>
<source>Do you want to apply the generated password to this entry?</source>
- <translation>Voulez-vous appliquer le mot de passe généré à cette entrée ?</translation>
+ <translation>Voulez-vous appliquer le mot de passe généré à cette entrée ?</translation>
</message>
<message>
<source>Entry updated successfully.</source>
- <translation>Entrée mise à jour avec succès.</translation>
+ <translation>L&apos;entrée a bien été mise à jour.</translation>
</message>
<message>
<source>Entry has unsaved changes</source>
- <translation>L&apos;entrée contient des modifications non-enregistrées</translation>
+ <translation>L&apos;entrée contient des modifications non enregistrées</translation>
</message>
<message>
<source>New attribute %1</source>
@@ -1742,22 +2223,34 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>[PROTECTED] Press reveal to view or edit</source>
- <translation>[PROTÉGÉ] Appuyez pour révéler ou éditer</translation>
+ <translation>[PROTÉGÉ] Appuyez pour voir ou modifier</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n année</numerusform><numerusform>%n années</numerusform></translation>
+ <translation><numerusform>%n an</numerusform><numerusform>%n ans</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Confirmer la suppression</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Intégration aux navigateurs</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;URL vide&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Êtes-vous sûr de vouloir supprimer cette URL ?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
<message>
<source>Additional attributes</source>
- <translation>Attributs supplémentaires</translation>
+ <translation>Autres attributs</translation>
</message>
<message>
<source>Add</source>
@@ -1769,7 +2262,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Edit Name</source>
- <translation>Éditer le nom</translation>
+ <translation>Modifier le nom</translation>
</message>
<message>
<source>Protect</source>
@@ -1777,7 +2270,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Reveal</source>
- <translation>Révéler</translation>
+ <translation>Voir</translation>
</message>
<message>
<source>Attachments</source>
@@ -1791,6 +2284,42 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<source>Background Color:</source>
<translation>Couleur de l’arrière-plan :</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Sélection d&apos;attribut</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Valeur d&apos;attribut</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Ajouter un nouvel attribut</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Supprimer l&apos;attribut sélectionné</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Modifier le nom de l&apos;attribut</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Basculer l&apos;affichage de la protection de l&apos;attribut</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Afficher un attribut protégé</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Sélection de la couleur d&apos;avant-plan</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Sélection de la couleur d&apos;arrière-plan</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1800,7 +2329,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation>Utiliser la séquence par défaut de saisie automatique du &amp;groupe</translation>
+ <translation>Utiliser la séquence de saisie automatique par défaut du groupe</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
@@ -1824,7 +2353,78 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Use a specific sequence for this association:</source>
- <translation>Utilisez une séquence précise pour cette association :</translation>
+ <translation>Utiliser une séquence spécifique pour cette association :</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Séquence de saisie automatique personnalisée</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Ouvrir la page Web d&apos;aide sur la saisie automatique</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Associations de fenêtre existantes</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Ajouter une nouvelle association de fenêtre</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Supprimer l&apos;association de fenêtre sélectionnée</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Vous pouvez utiliser un astérisque (*) pour tout inclure</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Définir le titre de l&apos;association de fenêtre</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Vous pouvez utiliser un astérisque pour tout inclure</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Séquence de saisie automatique personnalisée pour cette fenêtre</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Ces paramètres modifieront le fonctionnement de l&apos;entrée avec l&apos;extension du navigateur.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Général</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Ignorer la validation automatique pour cette entrée</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Masquer cette entrée dans l&apos;extension du navigateur</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Autres URL</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Ajouter</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Modifier</translation>
</message>
</context>
<context>
@@ -1845,6 +2445,26 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<source>Delete all</source>
<translation>Supprimer tout</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Sélection de l&apos;historique de l&apos;entrée</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Afficher l&apos;entrée pour l&apos;état d&apos;historique sélectionné</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Restaurer l&apos;entrée pour l&apos;état de l&apos;historique sélectionné</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Supprimer l&apos;état de l&apos;historique sélectionné</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Supprimer tout l&apos;historique</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1870,11 +2490,11 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Presets</source>
- <translation>Valeurs par défaut</translation>
+ <translation>Présélections</translation>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation>Cochez la case pour afficher la section des notes.</translation>
+ <translation>Cochez la case pour basculer l&apos;affichage de la partie réservée aux notes.</translation>
</message>
<message>
<source>Username:</source>
@@ -1884,6 +2504,62 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<source>Expires</source>
<translation>Expiration</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Champ de l&apos;URL</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Télécharger la favicon pour l&apos;URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Champ de confirmation du mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Basculer l&apos;affichage du générateur de mots de passe</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Champ de mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Basculer l&apos;affichage du mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Basculer l&apos;affichage des notes</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Champ d&apos;expiration</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Présélections d&apos;expiration</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Présélections d&apos;expiration</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Champs des notes</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Champ du titre</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Champ du nom d&apos;utilisateur</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Basculer l&apos;affichage de l&apos;expiration</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1897,7 +2573,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source> seconds</source>
- <translation>secondes</translation>
+ <translation> secondes</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -1913,7 +2589,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation>Ajoutez la clé à l’agent lorsque la base de données est ouverte/déverrouillée</translation>
+ <translation>Ajouter la clé à l’agent lorsque la base de données est ouverte/déverrouillée</translation>
</message>
<message>
<source>Comment</source>
@@ -1942,7 +2618,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Parcourir...</translation>
+ <translation>Parcourir…</translation>
</message>
<message>
<source>Attachment</source>
@@ -1960,6 +2636,22 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Requiert une confirmation de l’utilisateur quand cette clé est utilisée</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Retrait de la clé de l’agent après un nombre de secondes spécifié</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Rechercher un fichier-clé</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Fichier-clé externe</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Sélectionner une pièce jointe</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1995,6 +2687,10 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Hériter du groupe parent (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>L&apos;entrée contient des modifications non enregistrées</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2023,68 +2719,98 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<translation>Inactif</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importer depuis le chemin</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Conteneur KeeShare non signé</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>Conteneur KeeShare signé</translation>
+ </message>
+ <message>
+ <source>Select import source</source>
+ <translation>Sélectionner la source à importer</translation>
+ </message>
+ <message>
+ <source>Select export target</source>
+ <translation>Sélectionner la cible à exporter</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exporter vers le chemin</translation>
+ <source>Select import/export file</source>
+ <translation>Sélectionner le fichier d&apos;import/export</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchroniser avec le chemin</translation>
+ <source>Clear</source>
+ <translation>Effacer</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Votre version de KeePassXC ne supporte pas le partage de ce type de conteneur. Veuillez utiliser %1.</translation>
+ <source>Import</source>
+ <translation>Importer</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Le partage de base de données est désactivé</translation>
+ <source>Export</source>
+ <translation>Exporter</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>L&apos;export de base de données est désactivé</translation>
+ <source>Synchronize</source>
+ <translation>Synchroniser</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>L&apos;import de base de données est désactivé</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Votre version de KeePassXC ne prend pas en charge le partage de ce type de conteneur. Les extensions supportées sont : %1.</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare conteneur non signé</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 est déjà exporté par cette base de données.</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare conteneur signé</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 est déjà importé par cette base de données.</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Sélectionner la source pour l&apos;import</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 est exporté et importé par des groupes différents dans cette base de données.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Sélectionner la cible pour l&apos;export</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare est actuellement désactivé. Vous pouvez activer l&apos;import/export dans les paramètres de l&apos;application.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Sélectionner le fichier d&apos;import/export</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>L&apos;export de la base de données est désactivé dans les paramètres de l&apos;application.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Effacer</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>L&apos;import de la base de données et actuellement désactivé dans les paramètres de l&apos;application.</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Le conteneur d&apos;export %1 est déjà référencé.</translation>
+ <source>Sharing mode field</source>
+ <translation>Champ du mode de partage</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Le conteneur d&apos;import %1 est déjà importé.</translation>
+ <source>Path to share file field</source>
+ <translation>Champ du chemin de fichier partagé</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Le conteneur %1 est importé et exporté par des groupes différents.</translation>
+ <source>Browser for share file</source>
+ <translation>Rechercher un fichier partagé</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Champ de mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Basculer l&apos;affichage du mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Basculer l&apos;affichage du générateur de mot de passe</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Effacer les champs</translation>
</message>
</context>
<context>
@@ -2111,12 +2837,40 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
- <translation>&amp;Utiliser la séquence par défaut de saisie automatique du groupe parent</translation>
+ <translation>&amp;Utiliser la séquence de saisie automatique du groupe parent</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Définir la sé&amp;quence par défaut de la saisie automatique</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Champ du nom</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Champs des notes</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Basculer l&apos;affichage de l&apos;expiration</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Basculer la saisie automatique pour ceci et les sous-groupes</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Champ d&apos;expiration</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Basculer la recherche pour ceci et les sous-groupes</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Champ de séquence de saisie automatique</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2138,11 +2892,11 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Download favicon</source>
- <translation>Télécharger la favicône</translation>
+ <translation>Télécharger la favicon</translation>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>Impossible de récupérer la favicône</translation>
+ <translation>Impossible de récupérer la favicon.</translation>
</message>
<message>
<source>Images</source>
@@ -2153,28 +2907,16 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
<translation>Tous les fichiers</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>L’icône personnalisée existe déjà</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirmer la suppression</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Icône personnalisée téléchargée avec succès</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Astuce : Vous pouvez activer DuckDuckGo comme second recours sous Outils &gt; Paramètres &gt; Sécurité</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Sélectionner des images</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>%1 icône sur %n chargée avec succès</numerusform><numerusform>%1 icônes sur %n chargées avec succès</numerusform></translation>
+ <translation><numerusform>Chargement de %1 sur %n icône réussi.</numerusform><numerusform>Chargement de %1 sur %n icônes réussi</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2186,11 +2928,47 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>L&apos;icône suivante a rencontré des erreurs :</numerusform><numerusform>Les icônes suivantes ont rencontré des erreurs :</numerusform></translation>
+ <translation><numerusform>L&apos;icône suivante est défectueuse :</numerusform><numerusform>Les icônes suivantes sont défectueuses :</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Cette icône est utilisée par %1 entrée et sera remplacée par l’icône par défaut. Êtes-vous certain de vouloir l’effacer ?</numerusform><numerusform>Cette icône est utilisée par %1 entrées et sera remplacée par l’icône par défaut. Êtes-vous certain de vouloir l’effacer ?</numerusform></translation>
+ <translation><numerusform>Cette icône est utilisée par %1 entrée et sera remplacée par l’icône par défaut. Êtes-vous sûr de vouloir la supprimer ?</numerusform><numerusform>Cette icône est utilisée par %1 entrées et sera remplacée par l’icône par défaut. Êtes-vous sûr de vouloir la supprimer ?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Vous pouvez activer le service d&apos;icônes de sites Web DuckDuckGo dans Outils &gt; Paramètres &gt; Sécurité</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Télécharger la favicon pour l&apos;URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Appliquer l&apos;icône sélectionnée aux sous-groupes et entrées</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Appliquer l&apos;icône à ...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Appliquer à ceci uniquement</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Appliquer également aux groupes enfants</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Appliquer également aux entrées enfants</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Appliquer également à tous les enfants</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Icône existante sélectionnée.</translation>
</message>
</context>
<context>
@@ -2205,7 +2983,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Accessed:</source>
- <translation>Consulté :</translation>
+ <translation>Dernier accès :</translation>
</message>
<message>
<source>Uuid:</source>
@@ -2213,7 +2991,7 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Plugin Data</source>
- <translation>Données d’extension</translation>
+ <translation>Données de l’extension</translation>
</message>
<message>
<source>Remove</source>
@@ -2221,12 +2999,12 @@ Désactiver les enregistrements sécurisés et ressayer ?</translation>
</message>
<message>
<source>Delete plugin data?</source>
- <translation>Supprimer les données d’extension ?</translation>
+ <translation>Supprimer les données de l’extension ?</translation>
</message>
<message>
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
- <translation>Voulez-vous vraiment supprimer les données d’extension sélectionnées ? Cela peut entraîner un dysfonctionnement des extensions touchées.</translation>
+ <translation>Voulez-vous vraiment supprimer les données de l’extension sélectionnée ? Cela peut entraîner un dysfonctionnement des extensions.</translation>
</message>
<message>
<source>Key</source>
@@ -2236,6 +3014,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>Valeur</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Date et heure de création</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Date et heure de modification</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Date et heure d&apos;accès</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Identifiant unique</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Données de l&apos;extension</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Supprimer les données de l&apos;extension sélectionnée</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2283,7 +3085,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Êtes-vous certain de vouloir supprimer %n pièce jointe ?</numerusform><numerusform>Êtes-vous certain de vouloir supprimer %n pièces jointes ?</numerusform></translation>
+ <translation><numerusform>Êtes-vous sûr de vouloir supprimer %n pièce jointe ?</numerusform><numerusform>Êtes-vous sûr de vouloir supprimer %n pièces jointes ?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2292,12 +3094,12 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to create directory:
%1</source>
- <translation>Impossible de créer le répertoire :
+ <translation>Impossible de créer le répertoire :
%1</translation>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation>Êtes-vous certain de vouloir remplacer le fichier existant « %1 » par la pièce jointe ?</translation>
+ <translation>Êtes-vous certain de vouloir remplacer le fichier existant « %1 » par la pièce jointe ?</translation>
</message>
<message>
<source>Confirm overwrite</source>
@@ -2329,9 +3131,29 @@ This may cause the affected plugins to malfunction.</source>
<source>Unable to open file(s):
%1</source>
<translation><numerusform>Impossible d’ouvrir le fichier :
-%1</numerusform><numerusform>Impossible d’ouvrir les fichiers :
+%1</numerusform><numerusform>Impossible d’ouvrir les fichiers :
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Pièces jointes</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Ajouter une nouvelle pièce jointe</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Supprimer la pièce jointe sélectionnée</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Ouvrir la pièce jointe sélectionnée</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Enregistrer la pièce jointe sélectionnée sur le disque</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2426,10 +3248,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Générer un code TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Fermer</translation>
</message>
@@ -2500,7 +3318,7 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
- <translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
+ <translation>&lt;b&gt;%1&lt;/b&gt; : %2</translation>
</message>
<message>
<source>Enabled</source>
@@ -2514,32 +3332,40 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>Partager</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Afficher la valeur TOTP actuelle</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avancé</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
<message>
<source>Customize View</source>
- <translation>Personnaliser l’affichage</translation>
+ <translation>Personnaliser la vue</translation>
</message>
<message>
<source>Hide Usernames</source>
- <translation>Masquer les noms d’utilisateur</translation>
+ <translation>Cacher les noms d’utilisateurs</translation>
</message>
<message>
<source>Hide Passwords</source>
- <translation>Masquer les mots de passe</translation>
+ <translation>Cacher les mots de passe</translation>
</message>
<message>
<source>Fit to window</source>
- <translation>Ajuster à la fenêtre</translation>
+ <translation>Adapter à la fenêtre</translation>
</message>
<message>
<source>Fit to contents</source>
- <translation>Ajuster au contenu</translation>
+ <translation>Adapter au contenu</translation>
</message>
<message>
<source>Reset to defaults</source>
- <translation>Réinitialiser aux valeurs par défaut</translation>
+ <translation>Remettre les paramètres par défaut</translation>
</message>
<message>
<source>Attachments (icon)</source>
@@ -2547,11 +3373,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Corbeille</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>L&apos;entrée « %1 » de la base de données « %2 » a été utilisée par %3</translation>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Impossible d&apos;enregistrer le service DBus sur %1 : un autre service de secrets est en cours d&apos;exécution.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n entrée utilisée par %1</numerusform><numerusform>%n entrées utilisées par %1</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo Secret Service : %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2562,11 +3410,64 @@ This may cause the affected plugins to malfunction.</source>
<name>HostInstaller</name>
<message>
<source>KeePassXC: Cannot save file!</source>
- <translation>KeePassXC : Impossible d’enregistrer le fichier !</translation>
+ <translation>KeePassXC : impossible d’enregistrer le fichier !</translation>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
- <translation>Impossible d’enregistrer le fichier de script de la messagerie native</translation>
+ <translation>Impossible d’enregistrer le fichier script de la messagerie native</translation>
+ </message>
+</context>
+<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Télécharger les favicons</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Des problèmes pour télécharger les icônes ?
+Vous pouvez activer le service d&apos;icônes de sites Web de DuckDuckGo dans la section sécurité des paramètres de l&apos;application.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>État</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Veuillez patienter durant le traitement de la liste des entrées ...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Téléchargement...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Déjà existant</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Échec du téléchargement</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Téléchargement des favicons (%1/%2) ...</translation>
</message>
</context>
<context>
@@ -2584,19 +3485,15 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx3Reader</name>
<message>
<source>Unable to calculate master key</source>
- <translation>Impossible de calculer la clé maîtresse</translation>
+ <translation>Impossible de calculer la clé maître</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
<translation>Impossible de lancer une question-réponse.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>La clé n’est pas la bonne ou le fichier de base de données est corrompu.</translation>
- </message>
- <message>
<source>missing database headers</source>
- <translation>les en-têtes de la base de données manquent</translation>
+ <translation>en-têtes de la base de données manquantes</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
@@ -2604,15 +3501,21 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid header id size</source>
- <translation>Taille de l’id de l’en-tête non valide</translation>
+ <translation>Taille de l’identifiant d’en-tête invalide</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation>Longueur du champ de l’en-tête invalide</translation>
+ <translation>Longueur de champ d’en-tête invalide</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>Longueur des données de l’en-tête non valide</translation>
+ <translation>Longueur des données d’en-tête invalide</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Identifiants invalides, veuillez réessayer.
+Si le problème persiste, le fichier de la base de données peut être corrompu.</translation>
</message>
</context>
<context>
@@ -2623,30 +3526,26 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Impossible de calculer la clé maîtresse</translation>
+ <translation>Impossible de calculer la clé maître</translation>
</message>
</context>
<context>
<name>Kdbx4Reader</name>
<message>
<source>missing database headers</source>
- <translation>les en-têtes de la base de données manquent</translation>
+ <translation>en-têtes de la base de données manquantes</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Impossible de calculer la clé maîtresse</translation>
+ <translation>Impossible de calculer la clé maître</translation>
</message>
<message>
<source>Invalid header checksum size</source>
- <translation>Taille de la somme de contrôle de l’en-tête non valide</translation>
+ <translation>Taille de la somme de contrôle de d’en-tête invalide</translation>
</message>
<message>
<source>Header SHA256 mismatch</source>
- <translation>SHA256 de l’en-tête ne correspond pas</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>La clé n’est pas la bonne ou le fichier de base de données est corrompu (non-correspondance HMAC).</translation>
+ <translation>En-tête SHA256 incohérent</translation>
</message>
<message>
<source>Unknown cipher</source>
@@ -2654,106 +3553,116 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid header id size</source>
- <translation>Taille de l’id de l’en-tête non valide</translation>
+ <translation>Taille de l’identifiant d’en-tête invalide</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation>Longueur du champ de l’en-tête non valide</translation>
+ <translation>Longueur du champ d’en-tête invalide</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>Longueur des données de l’en-tête non valide</translation>
+ <translation>Longueur des données d’en-tête invalide</translation>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
- <translation>Échec d’ouverture d’une mémoire tampon pour les paramètres KDF dans l’en-tête</translation>
+ <translation>Échec lors de l’ouverture d’une mémoire tampon pour les paramètres KDF dans l’en-tête</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
- <translation>Fonction de dérivation de clé (KDF) non supporté ou paramètres non valides</translation>
+ <translation>Fonction de dérivation de clé (KDF) non prise en charge ou paramètres invalides</translation>
</message>
<message>
<source>Legacy header fields found in KDBX4 file.</source>
- <translation>Champs d’en-tête hérités du fichier KDBX4.</translation>
+ <translation>Anciens champs d’en-tête trouvés dans le fichier KDBX4.</translation>
</message>
<message>
<source>Invalid inner header id size</source>
- <translation>Taille de l’id de l’en-tête interne non valide</translation>
+ <translation>Taille de identifiant d’en-tête interne invalide</translation>
</message>
<message>
<source>Invalid inner header field length</source>
- <translation>Longueur du champ de l’en-tête interne non valide</translation>
+ <translation>Longueur du champ d’en-tête interne invalide</translation>
</message>
<message>
<source>Invalid inner header binary size</source>
- <translation>Taille binaire de l’en-tête interne non valide</translation>
+ <translation>Taille binaire d’en-tête interne invalide</translation>
</message>
<message>
<source>Unsupported KeePass variant map version.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Version de table des variantes non supportée.</translation>
+ <translation>Version de table des variantes non prise en charge.</translation>
</message>
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur du nom de la table des variantes non valide.</translation>
+ <translation>Longueur du nom de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Contenu du nom de la table des variantes non valide.</translation>
+ <translation>Données du nom d&apos;entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée dans la table des variantes non valide.</translation>
+ <translation>Longueur de la valeur d’entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map entry value data</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>Contenu de l’entrée dans la table des variantes non valide.</translation>
+ <translation>Données de la valeur d’entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map Bool entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée de type Booléen dans la table des variantes non valide.</translation>
+ <translation>Longueur de valeur booléenne d&apos;entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map Int32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée de type Int32 dans la table des variantes non valide.</translation>
+ <translation>Longueur de la valeur entière 32 bits d&apos;entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map UInt32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée de type UInt32 dans la table des variantes non valide.</translation>
+ <translation>Longueur de la valeur entière non signée 32 bits d&apos;entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map Int64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée de type Int64 dans la table des variantes non valide.</translation>
+ <translation>Longueur de la valeur entière 64 bits d&apos;entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map UInt64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée de type UInt64 dans la table des variantes non valide.</translation>
+ <translation>Longueur de la valeur entière non signée 64 bits d&apos;entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map entry type</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur de l’entrée dans la table des variantes non valide.</translation>
+ <translation>Type d’entrée de table des variantes invalide</translation>
</message>
<message>
<source>Invalid variant map field type size</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Longueur du type de champ dans la table des variantes non valide.</translation>
+ <translation>Taille du type de champ de table des variantes invalide</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Identifiants invalides, veuillez réessayer.
+Si le problème persiste, le fichier de la base de données peut être corrompu.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC incohérent)</translation>
</message>
</context>
<context>
<name>Kdbx4Writer</name>
<message>
<source>Invalid symmetric cipher algorithm.</source>
- <translation>Algorithme de chiffrement symétrique non valide.</translation>
+ <translation>Algorithme de chiffrement symétrique invalide.</translation>
</message>
<message>
<source>Invalid symmetric cipher IV size.</source>
@@ -2762,23 +3671,23 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Impossible de calculer la clé maîtresse</translation>
+ <translation>Impossible de calculer la clé maître</translation>
</message>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>Échec de sérialisation des paramètres KDF de la table de variantes.</translation>
+ <translation>Échec de sérialisation des paramètres KDF de table des variantes</translation>
</message>
</context>
<context>
<name>KdbxReader</name>
<message>
<source>Unsupported cipher</source>
- <translation>Chiffrement non supporté</translation>
+ <translation>Chiffrement non pris en charge</translation>
</message>
<message>
<source>Invalid compression flags length</source>
- <translation>Longueur des paramètres de compression non valides.</translation>
+ <translation>Longueur des indicateurs de compression invalide</translation>
</message>
<message>
<source>Unsupported compression algorithm</source>
@@ -2786,31 +3695,31 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid master seed size</source>
- <translation>Taille de semence primaire non valide.</translation>
+ <translation>Taille du salage initial invalide</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Taille de la semence germée non valide.</translation>
+ <translation>Taille du salage transformé invalide</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
- <translation>La taille de cycles de transformation est invalide</translation>
+ <translation>Taille des cycles de transformation invalide</translation>
</message>
<message>
<source>Invalid start bytes size</source>
- <translation>Taille des octets de début non valide</translation>
+ <translation>Taille des octets de début invalide</translation>
</message>
<message>
<source>Invalid random stream id size</source>
- <translation>Taille de l’identifiant du flux aléatoire non valide.</translation>
+ <translation>Taille de l’identifiant de flux aléatoire invalide</translation>
</message>
<message>
<source>Invalid inner random stream cipher</source>
- <translation>Taille du chiffrement du flux intérieur aléatoire non valide.</translation>
+ <translation>Taille du chiffrement de flux aléatoire intérieur invalide</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Ce n’est pas une base de données KeePass.</translation>
+ <translation>N’est pas une base de données KeePass.</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
@@ -2819,12 +3728,12 @@ 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 KeePass 1 (.kdb).
-Vous pouvez l’importer en cliquant sur Base de données&gt;&apos;Importer une base de données KeePass 1...&apos;
+Vous pouvez l’importer en cliquant sur Base de données &gt; « Importer une base de données KeePass 1... »
Il s’agit d’une migration à sens unique. Vous ne pourrez pas ouvrir la base de données importée avec l’ancienne version de KeePassX 0.4.</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
- <translation>Version de la base de données KeePass 2 non pris en charge.</translation>
+ <translation>Version de la base de données KeePass 2 non prise en charge.</translation>
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
@@ -2851,51 +3760,51 @@ Il s’agit d’une migration à sens unique. Vous ne pourrez pas ouvrir la base
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>Données ou uuid de l’icône manquant</translation>
+ <translation>Données ou UUID de l’icône manquant</translation>
</message>
<message>
<source>Missing custom data key or value</source>
- <translation>Valeur ou clé de donnée personnalisée manquante</translation>
+ <translation>Valeur ou clé de données personnalisée manquante</translation>
</message>
<message>
<source>Multiple group elements</source>
- <translation>Éléments du groupe multiples</translation>
+ <translation>Éléments de groupe multiples</translation>
</message>
<message>
<source>Null group uuid</source>
- <translation>Uuid du groupe sans valeur</translation>
+ <translation>UUID du groupe nul</translation>
</message>
<message>
<source>Invalid group icon number</source>
- <translation>Numéro de l’icône du groupe non valide</translation>
+ <translation>Numéro de l’icône du groupe invalide</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
- <translation>Valeur EnableAutoType non valide</translation>
+ <translation>Valeur EnableAutoType invalide</translation>
</message>
<message>
<source>Invalid EnableSearching value</source>
- <translation>Valeur de EnableSearching non valide</translation>
+ <translation>Valeur EnableSearching invalide</translation>
</message>
<message>
<source>No group uuid found</source>
- <translation>Aucun uuid de groupe trouvé</translation>
+ <translation>Aucun UUID de groupe trouvé</translation>
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>Uuid de DeleteObject sans valeur</translation>
+ <translation>UUID de DeleteObject nul</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
- <translation>Temps ou uuid de DeletedObject manquant</translation>
+ <translation>Temps ou UUID de DeletedObject manquant</translation>
</message>
<message>
<source>Null entry uuid</source>
- <translation>Uuid de l’entrée sans valeur</translation>
+ <translation>UUID de l’entrée nul</translation>
</message>
<message>
<source>Invalid entry icon number</source>
- <translation>Numéro de l’icône de l’entrée non valide</translation>
+ <translation>Numéro de l’icône de l’entrée invalide</translation>
</message>
<message>
<source>History element in history entry</source>
@@ -2903,11 +3812,11 @@ Il s’agit d’une migration à sens unique. Vous ne pourrez pas ouvrir la base
</message>
<message>
<source>No entry uuid found</source>
- <translation>Aucun uuid d’entrée trouvé</translation>
+ <translation>Aucun UUID d’entrée trouvé</translation>
</message>
<message>
<source>History element with different uuid</source>
- <translation>Élément de l’historique avec un uuid différent</translation>
+ <translation>Élément de l’historique avec un UUID différent</translation>
</message>
<message>
<source>Duplicate custom attribute found</source>
@@ -2919,7 +3828,7 @@ Il s’agit d’une migration à sens unique. Vous ne pourrez pas ouvrir la base
</message>
<message>
<source>Duplicate attachment found</source>
- <translation>Une pièce a été trouvée en double</translation>
+ <translation>Un doublon de pièce jointe a été trouvé</translation>
</message>
<message>
<source>Entry binary key or value missing</source>
@@ -2927,31 +3836,31 @@ Il s’agit d’une migration à sens unique. Vous ne pourrez pas ouvrir la base
</message>
<message>
<source>Auto-type association window or sequence missing</source>
- <translation>Fenêtre ou séquence d’association de saisie automatique manquante</translation>
+ <translation>Association de fenêtre ou séquence de saisie automatique manquante</translation>
</message>
<message>
<source>Invalid bool value</source>
- <translation>Valeur bool non valide</translation>
+ <translation>Valeur booléenne invalide</translation>
</message>
<message>
<source>Invalid date time value</source>
- <translation>Valeur date time non valide</translation>
+ <translation>Valeur d’horodatage invalide</translation>
</message>
<message>
<source>Invalid color value</source>
- <translation>Valeur de couleur non valide</translation>
+ <translation>Valeur de couleur invalide</translation>
</message>
<message>
<source>Invalid color rgb part</source>
- <translation>Partie de couleur RVB non valide</translation>
+ <translation>Plage de couleur RVB invalide</translation>
</message>
<message>
<source>Invalid number value</source>
- <translation>Valeur de nombre non valide</translation>
+ <translation>Valeur de nombre invalide</translation>
</message>
<message>
<source>Invalid uuid value</source>
- <translation>Valeur uuid non valide</translation>
+ <translation>Valeur d&apos;UUID invalide</translation>
</message>
<message>
<source>Unable to decompress binary</source>
@@ -2970,13 +3879,13 @@ Ligne %2, colonne %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importer une base de données au format KeePass 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Impossible d’ouvrir la base de données.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importer une base de données au format KeePass 1</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -2986,15 +3895,15 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Ce n’est pas une base de données KeePass.</translation>
+ <translation>N’est pas une base de données KeePass.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
- <translation>Algorithme de chiffrement non supporté.</translation>
+ <translation>Algorithme de chiffrement non pris en charge.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
- <translation>Version de base de données KeePass non supportée.</translation>
+ <translation>Version de base de données KeePass non prise en charge.</translation>
</message>
<message>
<source>Unable to read encryption IV</source>
@@ -3003,27 +3912,27 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>Invalid number of groups</source>
- <translation>Nombre de groupes non valide</translation>
+ <translation>Nombre de groupes invalide</translation>
</message>
<message>
<source>Invalid number of entries</source>
- <translation>Nombre d’entrées non valide</translation>
+ <translation>Nombre d’entrées invalide</translation>
</message>
<message>
<source>Invalid content hash size</source>
- <translation>La taille de l’empreinte numérique du contenu est invalide</translation>
+ <translation>Taille de l’empreinte numérique du contenu invalide</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Taille de la semence germée non valide.</translation>
+ <translation>Taille du salage transformé invalide</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation>Le nombre de cycles de transformation est invalide</translation>
+ <translation>Nombre de cycles de transformation invalide</translation>
</message>
<message>
<source>Unable to construct group tree</source>
- <translation>Impossible de construire l’arborescence du groupe</translation>
+ <translation>Impossible de créer l’arborescence du groupe</translation>
</message>
<message>
<source>Root</source>
@@ -3031,11 +3940,7 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Impossible de calculer la clé maîtresse</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>La clé n’est pas la bonne ou le fichier de base de données est corrompu.</translation>
+ <translation>Impossible de calculer la clé maître</translation>
</message>
<message>
<source>Key transformation failed</source>
@@ -3043,11 +3948,11 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>Invalid group field type number</source>
- <translation>Numéro du type de champ groupe non valide.</translation>
+ <translation>Numéro du type de champ groupe invalide</translation>
</message>
<message>
<source>Invalid group field size</source>
- <translation>Taille du champ groupe non valide</translation>
+ <translation>Taille du champ groupe invalide</translation>
</message>
<message>
<source>Read group field data doesn&apos;t match size</source>
@@ -3055,129 +3960,147 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>Incorrect group id field size</source>
- <translation>Taille du champ &quot;identifiant du groupe&quot; incorrect</translation>
+ <translation>Taille du champ d&apos;identifiant de groupe incorrect</translation>
</message>
<message>
<source>Incorrect group creation time field size</source>
- <translation>Taille du champ &quot;date du la création du groupe&quot; incorrect.</translation>
+ <translation>Taille du champ de date de création du groupe incorrect</translation>
</message>
<message>
<source>Incorrect group modification time field size</source>
- <translation>Taille du champ heure de modification du groupe non correct</translation>
+ <translation>Taille du champ d&apos;heure de modification du groupe incorrect</translation>
</message>
<message>
<source>Incorrect group access time field size</source>
- <translation>Taille du champ &quot;date d’accès au groupe&quot; incorrect.</translation>
+ <translation>Taille du champ de dernier accès au groupe incorrect</translation>
</message>
<message>
<source>Incorrect group expiry time field size</source>
- <translation>Taille du champ &quot;date d’expiration du groupe&quot; incorrect.</translation>
+ <translation>Taille du champ de date d’expiration du groupe incorrect</translation>
</message>
<message>
<source>Incorrect group icon field size</source>
- <translation>Taille du champ &quot;icône du groupe&quot; incorrect.</translation>
+ <translation>Taille du champ d&apos;icône du groupe incorrect</translation>
</message>
<message>
<source>Incorrect group level field size</source>
- <translation>Taille du champ du niveau du groupe incorrecte</translation>
+ <translation>Taille du champ de niveau du groupe incorrecte</translation>
</message>
<message>
<source>Invalid group field type</source>
- <translation>Type du champ groupe incorrect.</translation>
+ <translation>Type du champ groupe incorrect</translation>
</message>
<message>
<source>Missing group id or level</source>
- <translation>Niveau ou id du groupe manquant</translation>
+ <translation>Niveau ou identifiant du groupe manquant</translation>
</message>
<message>
<source>Missing entry field type number</source>
- <translation>Type du numéro du champ d’entrée manquante</translation>
+ <translation>Type de nombre du champ d’entrée manquant</translation>
</message>
<message>
<source>Invalid entry field size</source>
- <translation>Taille du champ de l’entrée non valide</translation>
+ <translation>Taille du champ d’entrée invalide</translation>
</message>
<message>
<source>Read entry field data doesn&apos;t match size</source>
- <translation>Les données d’entrée lues ne correspondent pas à la taille.</translation>
+ <translation>Les données d’entrée lues ne correspondent pas à la taille</translation>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation>Taille du champ uuid de l’entrée non valide</translation>
+ <translation>Taille du champ UUID de l’entrée invalide</translation>
</message>
<message>
<source>Invalid entry group id field size</source>
- <translation>Taille du champ id du groupe de l’entrée non valide</translation>
+ <translation>Taille du champ identifiant de groupe de l’entrée invalide</translation>
</message>
<message>
<source>Invalid entry icon field size</source>
- <translation>Taille du champ icône de l’entrée non valide</translation>
+ <translation>Taille du champ d&apos;icône de l’entrée invalide</translation>
</message>
<message>
<source>Invalid entry creation time field size</source>
- <translation>Taille du champ date de création de l’entrée non valide</translation>
+ <translation>Taille du champ de date de création d’entrée invalide</translation>
</message>
<message>
<source>Invalid entry modification time field size</source>
- <translation>Taille du champ date de modification de l’entrée non valide</translation>
+ <translation>Taille du champ de date de modification d’entrée invalide</translation>
</message>
<message>
<source>Invalid entry expiry time field size</source>
- <translation>Taille invalide du champ d’entrée heure d’expiration</translation>
+ <translation>Taille du champ de date d&apos;expiration d’entrée invalide</translation>
</message>
<message>
<source>Invalid entry field type</source>
- <translation>Champ d’entrée type est invalide</translation>
+ <translation>Type de champ d&apos;entrée invalide</translation>
</message>
<message>
<source>unable to seek to content position</source>
- <translation>incapable de se déplacer à la position du contenu</translation>
+ <translation>impossible de se déplacer à la position du contenu</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Identifiants invalides, veuillez réessayer.
+Si le problème persiste, le fichier de la base de données peut être corrompu.</translation>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Partage désactivé</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Référence de partage invalide</translation>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation>Partage %1 inactif</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importer de</translation>
+ <source>Imported from %1</source>
+ <translation>Importé depuis %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation>Exporté vers %1</translation>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation>Synchronisé avec %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Exporter vers</translation>
+ <source>Import is disabled in settings</source>
+ <translation>L&apos;importation est désactivée dans les paramètres</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchroniser avec</translation>
+ <source>Export is disabled in settings</source>
+ <translation>L&apos;exportation est désactivée dans les paramètres</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Partage %1 désactivé</translation>
+ <source>Inactive share</source>
+ <translation>Partage inactif</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importer du partage %1</translation>
+ <source>Imported from</source>
+ <translation>Importé de</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exporter vers le partage %1</translation>
+ <source>Exported to</source>
+ <translation>Exporté vers</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synchroniser avec le partage %1</translation>
+ <source>Synchronized with</source>
+ <translation>Synchronisé avec</translation>
</message>
</context>
<context>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation>Élément clé</translation>
+ <translation>Composant clé</translation>
</message>
<message>
<source>Key Component Description</source>
- <translation>Description de l’élément clé</translation>
+ <translation>Description du composant clé</translation>
</message>
<message>
<source>Cancel</source>
@@ -3205,16 +4128,12 @@ Ligne %2, colonne %3</translation>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation>%1 configuré, cliquer pour modifier ou supprimer</translation>
+ <translation>%1 défini, cliquer pour modifier ou supprimer</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Parcourir</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Générer</translation>
</message>
@@ -3224,30 +4143,30 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Vous pouvez ajouter un fichier-clé contenant des bits aléatoires pour une sécurité accrue.&lt;/p&gt;&lt;p&gt;Vous devez le garder secret et ne jamais le perdre ou vous ne pourrez plus vous connecter !&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Vous pouvez ajouter un fichier-clé contenant des données aléatoires pour une sécurité accrue.&lt;/p&gt;&lt;p&gt;Vous devez le conserver secrètement et ne jamais le perdre ou vous ne pourrez plus vous connecter !&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
- <translation>Format de fichier-clé hérité</translation>
+ <translation>Ancien format de fichier-clé</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation>Vous utilisez un format de fichier-clé hérité qui pourrait ne plus être pris en charge à l’avenir.
+ <translation>Vous utilisez un ancien format de fichier-clé qui pourrait ne plus être pris en charge à l’avenir.
-Veuillez ouvrir les paramètres de clé maîtresse et générer un nouveau fichier-clé.</translation>
+Veuillez ouvrir les paramètres de clé maître et générer un nouveau fichier-clé.</translation>
</message>
<message>
<source>Error loading the key file '%1'
Message: %2</source>
- <translation>Erreur durant le chargement du fichier-clé &apos;%1&apos;
+ <translation>Erreur durant le chargement du fichier-clé « %1 »
Message : %2</translation>
</message>
<message>
<source>Key files</source>
- <translation>Fichiers-clés</translation>
+ <translation>Fichiers-clé</translation>
</message>
<message>
<source>All files</source>
@@ -3269,6 +4188,44 @@ Message : %2</translation>
<source>Select a key file</source>
<translation>Sélectionner un fichier-clé</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Sélection du fichier-clé</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Rechercher un fichier-clé</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Parcourir…</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Générer un nouveau fichier-clé</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Note : n&apos;utilisez pas un fichier qui pourrait être modifié au risque de ne pas pouvoir déverrouiller votre base de données !</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Fichier-clé invalide</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Vous ne pouvez pas utiliser la base de données actuelle comme son propre fichier-clé. Veuillez choisir un autre fichier ou générer un nouveau fichier-clé.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Fichier-clé douteux</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Le fichier-clé sélectionné semble être une base de données de mots de passe. Un fichier-clé est un fichier statique qui ne doit jamais être modifié au risque de perdre tout accès à votre base de données.
+Êtes-vous sûr de vouloir continuer avec ce fichier ?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3306,7 +4263,7 @@ Message : %2</translation>
</message>
<message>
<source>&amp;Open database...</source>
- <translation>&amp;Ouvrir la base de données…</translation>
+ <translation>&amp;Ouvrir une base de données…</translation>
</message>
<message>
<source>&amp;Save database</source>
@@ -3330,7 +4287,7 @@ Message : %2</translation>
</message>
<message>
<source>Sa&amp;ve database as...</source>
- <translation>En&amp;registrer la base de données sous...</translation>
+ <translation>Enre&amp;gistrer la base de données sous…</translation>
</message>
<message>
<source>Database settings</source>
@@ -3357,10 +4314,6 @@ Message : %2</translation>
<translation>&amp;Paramètres</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Générateur de mots de passe</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Verrouiller les bases de données</translation>
</message>
@@ -3390,15 +4343,15 @@ Message : %2</translation>
</message>
<message>
<source>&amp;Export to CSV file...</source>
- <translation>&amp;Exporter dans un fichier CSV...</translation>
+ <translation>&amp;Exporter dans un fichier CSV…</translation>
</message>
<message>
<source>Set up TOTP...</source>
- <translation>Configurer TOTP...</translation>
+ <translation>Configurer TOTP…</translation>
</message>
<message>
<source>Copy &amp;TOTP</source>
- <translation>Copie &amp;TOTP</translation>
+ <translation>Copier le &amp;TOTP</translation>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
@@ -3426,29 +4379,29 @@ Message : %2</translation>
</message>
<message>
<source>Please touch the button on your YubiKey!</source>
- <translation>Veuillez appuyez sur le bouton de votre YubiKey !</translation>
+ <translation>Veuillez appuyer sur le bouton de votre YubiKey  !</translation>
</message>
<message>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation>AVERTISSEMENT : Vous utilisez une version instable du KeePassXC !
+ <translation>AVERTISSEMENT : vous utilisez une version instable de KeePassXC  !
Le risque de corruption est élevé, conservez une sauvegarde de vos bases de données.
-Cette version n’est pas destinée à la production.</translation>
+Cette version n’est pas destinée à un usage régulier.</translation>
</message>
<message>
<source>&amp;Donate</source>
- <translation>&amp;Donner</translation>
+ <translation>Faire un &amp;don</translation>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation>Signaler un &amp;bug</translation>
+ <translation>Signaler un &amp;bogue</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
- <translation>ATTENTION : Votre version de Qt pourrait causer un crash de KeePassXC avec un clavier virtuel !
-Nous recommandons l&apos;utilisation de l&apos;AppImage disponible sur notre page de téléchargements.</translation>
+ <translation>ATTENTION : votre version de Qt pourrait provoquer un crash de KeePassXC avec un clavier virtuel !
+Nous recommandons l&apos;utilisation de l&apos;AppImage, disponible sur notre page de téléchargements.</translation>
</message>
<message>
<source>&amp;Import</source>
@@ -3472,7 +4425,7 @@ Nous recommandons l&apos;utilisation de l&apos;AppImage disponible sur notre pag
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation>&amp;Fusionner depuis la base de données...</translation>
+ <translation>&amp;Fusionner depuis une base de données...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
@@ -3504,11 +4457,11 @@ Nous recommandons l&apos;utilisation de l&apos;AppImage disponible sur notre pag
</message>
<message>
<source>Change master &amp;key...</source>
- <translation>Changer la clé &amp;maîtresse…</translation>
+ <translation>Changer la clé &amp;maître…</translation>
</message>
<message>
<source>&amp;Database settings...</source>
- <translation>Paramètres de la base de &amp;données ...</translation>
+ <translation>Paramètres de la base de &amp;données...</translation>
</message>
<message>
<source>Copy &amp;password</source>
@@ -3516,15 +4469,15 @@ Nous recommandons l&apos;utilisation de l&apos;AppImage disponible sur notre pag
</message>
<message>
<source>Perform &amp;Auto-Type</source>
- <translation>Effectuer un remplissage &amp;automatique</translation>
+ <translation>Effectuer une saisie &amp;automatique</translation>
</message>
<message>
<source>Open &amp;URL</source>
- <translation>Ouvrir l&apos;&amp;URL</translation>
+ <translation>Ouvrir une &amp;URL</translation>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation>Base de données KeePass 1 ...</translation>
+ <translation>Base de données KeePass 1...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
@@ -3532,7 +4485,7 @@ Nous recommandons l&apos;utilisation de l&apos;AppImage disponible sur notre pag
</message>
<message>
<source>CSV file...</source>
- <translation>Fichier CSV ...</translation>
+ <translation>Fichier CSV...</translation>
</message>
<message>
<source>Import a CSV file</source>
@@ -3540,38 +4493,98 @@ Nous recommandons l&apos;utilisation de l&apos;AppImage disponible sur notre pag
</message>
<message>
<source>Show TOTP...</source>
- <translation>Afficher TOTP ...</translation>
+ <translation>Afficher le TOTP...</translation>
</message>
<message>
<source>Show TOTP QR Code...</source>
- <translation>Afficher le QR Code TOTP ...</translation>
- </message>
- <message>
- <source>Check for Updates...</source>
- <translation>Vérifier les mises à jour...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Partager l&apos;entrée</translation>
+ <translation>Afficher le QR Code du TOTP...</translation>
</message>
<message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
- <translation>AVERTISSEMENT : Vous utilisez une version préliminaire de KeePassXC  !
-Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas destinée à la production.</translation>
+ <translation>AVERTISSEMENT : vous utilisez une pré-version de KeePassXC  !
+Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas destinée à un usage régulier.</translation>
</message>
<message>
<source>Check for updates on startup?</source>
- <translation>Vérifier les mises à jour au démarrage ?</translation>
+ <translation>Vérifier les mises à jour au démarrage ?</translation>
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation>Voulez-vous que KeePassXC vérifie les mises à jour au démarrage ?</translation>
+ <translation>Voulez-vous que KeePassXC vérifie les mises à jour au démarrage ?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
<translation>Vous pouvez en tout temps vérifier les mises à jour manuellement depuis le menu de l&apos;application.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Exporter</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Vérifier les mises à jour...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Téléch&amp;arger toutes les favicons</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Tri &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Tri &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>Générateur de mot de &amp;passe</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Télécharger la favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Exporter vers un fichier HTML...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>Gestionnaire 1Password...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importer une base de données 1Password</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Guide de démarrage</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Ouvrir le guide de démarrage au format PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>Aide en &amp;ligne...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Consulter la documentation en ligne (ouvre le navigateur internet)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>Guide &amp;utilisateur</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Ouvrir le guide utilisateur au format PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Raccourcis clavier</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3585,11 +4598,11 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Overwriting %1 [%2]</source>
- <translation>Écrasement de %1 [%2]</translation>
+ <translation>Remplacement de %1 [%2]</translation>
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation>ancienne entrée fusionnée de la base de données &quot;%1&quot;</translation>
+ <translation>ancienne entrée fusionnée de la base de données « %1 »</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
@@ -3631,12 +4644,20 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<source>Adding missing icon %1</source>
<translation>Ajout de l&apos;icône manquante %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Données personnalisées %1 [%2] supprimées</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Données personnalisées %1 [%2] ajoutées</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation>Créer une nouvelle base de données KeePassXC</translation>
+ <translation>Créer une nouvelle base de données KeePassXC...</translation>
</message>
<message>
<source>Root</source>
@@ -3648,7 +4669,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<name>NewDatabaseWizardPage</name>
<message>
<source>WizardPage</source>
- <translation>Page d&apos;aide</translation>
+ <translation>Page d&apos;assistant de nouvelle base</translation>
</message>
<message>
<source>En&amp;cryption Settings</source>
@@ -3656,7 +4677,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>Vous pouvez ajuster ici les paramètres de chiffrement de la base de données. Vous pourrez sans problèmes les changer plus tard dans les paramètres de la base de données.</translation>
+ <translation>Vous pouvez ajuster ici les paramètres de chiffrement de la base de données. Vous pourrez sans problème les modifier plus tard dans les paramètres de la base de données.</translation>
</message>
<message>
<source>Advanced Settings</source>
@@ -3675,18 +4696,18 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>Vous pouvez ajuster ici les paramètres de chiffrement de la base de données. Vous pourrez sans problèmes les changer plus tard dans les paramètres de la base de données.</translation>
+ <translation>Vous pouvez ajuster ici les paramètres de chiffrement de la base de données. Vous pourrez sans problème les modifier plus tard dans les paramètres de la base de données.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMasterKey</name>
<message>
<source>Database Master Key</source>
- <translation>Clé maîtresse de la base de données</translation>
+ <translation>Clé maître de la base de données</translation>
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation>Une clé maîtresse connue de vous uniquement qui protège votre base de données.</translation>
+ <translation>Une clé maître connue de vous seul qui protège votre base de données.</translation>
</message>
</context>
<context>
@@ -3697,18 +4718,85 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
- <translation>Veuillez renseigner le nom et optionnellement une description pour votre nouvelle base de données :</translation>
+ <translation>Veuillez indiquer le nom et éventuellement une description pour votre nouvelle base de données :</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>OpData01 invalide, ne contient pas d&apos;en-tête</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Impossible de lire les octets du vecteur d&apos;initialisation, 16 nécessaires, %1 lus</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Impossible d&apos;initialiser le chiffrage pour opdata01 : %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Impossible de lire tous les octets de la signature HMAC</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>OpData01 incorrect dû à un échec HMAC</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Impossible d&apos;activer le traitement de ClearText</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>%2 octets de clearText ont été trouvés sur les %1 requis</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>La base de données lue n&apos;a généré aucune instance
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Le répertoire .opvault doit exister</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>Le répertoire .opvault doit être accessible en lecture</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Le répertoire .opvault/default doit exister</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Le répertoire .opvault/default doit être accessible en lecture</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Impossible de décoder la clé maître : %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Impossible de calculer la clé maître : %1</translation>
</message>
</context>
<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
- <translation>Le fichier-clé est invalide, une clé OpenSSH est attendue</translation>
+ <translation>Une clé OpenSSH est requise, mais le fichier-clé est invalide</translation>
</message>
<message>
<source>PEM boundary mismatch</source>
- <translation>Décalage de la limite PEM</translation>
+ <translation>Plage PEM incohérente</translation>
</message>
<message>
<source>Base64 decoding failed</source>
@@ -3720,11 +4808,11 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Key file magic header id invalid</source>
- <translation>L’identifiant de l’en-tête magique du fichier-clé est invalide</translation>
+ <translation>Identifiant d’en-tête magique du fichier-clé invalide</translation>
</message>
<message>
<source>Found zero keys</source>
- <translation>Zéro clés trouvées</translation>
+ <translation>Acune clé n’a été trouvée</translation>
</message>
<message>
<source>Failed to read public key.</source>
@@ -3732,11 +4820,11 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation>Le fichier-clé est corrompu, échec de lecture de la clé privée</translation>
+ <translation>Le fichier-clé est corrompu. Échec de lecture de la clé privée.</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation>Aucune clé privée à décrypter</translation>
+ <translation>Aucune donnée utile de clé privée à décrypter</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
@@ -3744,23 +4832,23 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
- <translation>Une phrase de passe est exigée pour déchiffrer cette clé</translation>
+ <translation>Une phrase secrète est exigée pour déchiffrer cette clé</translation>
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation>Échec de dérivation de clé. Le fichier-clé est-il corrompu ?</translation>
+ <translation>Échec de calcul de la clé. Fichier-clé corrompu ?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation>Échec de déchiffrement. La phrase de passe serait-elle erronée ?</translation>
+ <translation>Échec de déchiffrement. Phrase secrète erronée ?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation>End-of-file inattendu lors de la lecture de la clé publique</translation>
+ <translation>Fin de fichier inattendue lors de la lecture de la clé publique</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation>End-of-file inattendu lors de la lecture de la clé privée</translation>
+ <translation>Fin de fichier inattendue lors de la lecture de la clé privée</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
@@ -3768,7 +4856,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation>End-of-file inattendu lors de l’écriture de la clé publique</translation>
+ <translation>Fin de fichier inattendue lors de l’écriture de la clé publique</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
@@ -3776,11 +4864,11 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation>End-of-file inattendu lors de l’écriture de la clé privée</translation>
+ <translation>Fin de fichier inattendue lors de l’écriture de la clé privée</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
- <translation>Type de clé non géré : %1</translation>
+ <translation>Type de clé non pris en charge : %1</translation>
</message>
<message>
<source>Unknown cipher: %1</source>
@@ -3800,6 +4888,17 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Les mots de passe ne correspondent pas</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Les mots de passe correspondent jusqu&apos;à présent</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3807,7 +4906,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Confirm password:</source>
- <translation>Confirmation du mot de passe :</translation>
+ <translation>Confirmer le mot de passe :</translation>
</message>
<message>
<source>Password</source>
@@ -3825,6 +4924,22 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<source>Generate master password</source>
<translation>Générer un mot de passe maître</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Champ de mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Basculer l&apos;affichage du mot de passe</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Champ de confirmation du mot de passe</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Basculer l&apos;affichage du générateur de mot de passe</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3851,31 +4966,19 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Character Types</source>
- <translation>Types de caractères:</translation>
- </message>
- <message>
- <source>Upper Case Letters</source>
- <translation>Lettres majuscules</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Lettres minuscules</translation>
+ <translation>Types de caractères :</translation>
</message>
<message>
<source>Numbers</source>
<translation>Chiffres</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caractères spéciaux</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>ASCII étendu</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
- <translation>Exclure les caractères qui se ressemblent</translation>
+ <translation>Exclure les caractères semblables</translation>
</message>
<message>
<source>Pick characters from every group</source>
@@ -3887,7 +4990,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Passphrase</source>
- <translation>Phrase de passe</translation>
+ <translation>Phrase secrète</translation>
</message>
<message>
<source>Wordlist:</source>
@@ -3899,7 +5002,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Copy</source>
- <translation>Copie</translation>
+ <translation>Copier</translation>
</message>
<message>
<source>Accept</source>
@@ -3915,12 +5018,12 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Password Quality: %1</source>
- <translation>Qualité du mot de passe : %1</translation>
+ <translation>Qualité du mot de passe : %1</translation>
</message>
<message>
<source>Poor</source>
<comment>Password quality</comment>
- <translation>Pauvre</translation>
+ <translation>Mauvais</translation>
</message>
<message>
<source>Weak</source>
@@ -3950,18 +5053,10 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<translation>Avancé</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Lettres majuscules de A à F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Lettres minuscules de A à F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3994,24 +5089,16 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Math</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Tirets</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
<message>
<source>Logograms</source>
- <translation>Logogramme</translation>
+ <translation>Logogrammes</translation>
</message>
<message>
<source>#$%&amp;&amp;@^`~</source>
@@ -4027,7 +5114,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Character set to exclude from generated password</source>
- <translation>Ensemble de caractères à exclure du mot de passe généré</translation>
+ <translation>Jeu de caractères à exclure du mot de passe généré</translation>
</message>
<message>
<source>Do not include:</source>
@@ -4035,7 +5122,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Add non-hex letters to &quot;do not include&quot; list</source>
- <translation>Ajouter les lettres non-hexadécimales à la liste &quot;Ne pas inclure&quot;</translation>
+ <translation>Ajouter les lettres non-hexadécimales à la liste « Ne pas inclure »</translation>
</message>
<message>
<source>Hex</source>
@@ -4043,16 +5130,84 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
- <translation>Caractères exclus : &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
+ <translation>Caractères exclus : « 0 », « 1 », « l », « I », « O », « | », « . »</translation>
</message>
<message>
<source>Word Co&amp;unt:</source>
- <translation>No&amp;mbre de mot :</translation>
+ <translation>No&amp;mbre de mots :</translation>
</message>
<message>
<source>Regenerate</source>
<translation>Régénérer</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Mot de passe généré</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Lettres majuscules</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Lettres minuscules</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Caractères spéciaux</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Symboles mathématiques</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Tirets et barres obliques</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Caractères exclus</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Mots de passe hexadécimaux</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Longueur du mot de passe</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Casse du mot :</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Régénérer le mot de passe</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Copier le mot de passe</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Accepter le mot de passe</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>minuscules</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>MAJUSCULES</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Noms Propres</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Basculer l&apos;affichage du mot de passe</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4060,19 +5215,16 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Sélectionner</translation>
+ <source>Statistics</source>
+ <translation>Statistiques</translation>
</message>
</context>
<context>
<name>QMessageBox</name>
<message>
<source>Overwrite</source>
- <translation>Écraser</translation>
+ <translation>Remplacer</translation>
</message>
<message>
<source>Delete</source>
@@ -4102,6 +5254,10 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<source>Merge</source>
<translation>Fusionner</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuer</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4147,7 +5303,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>No logins found</source>
- <translation>Aucuns identifiants trouvés</translation>
+ <translation>Aucun identifiant trouvé</translation>
</message>
<message>
<source>Unknown error</source>
@@ -4159,7 +5315,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Path of the database.</source>
- <translation>Chemin d’accès de la base de données.</translation>
+ <translation>Chemin de la base de données.</translation>
</message>
<message>
<source>Key file of the database.</source>
@@ -4194,10 +5350,6 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<translation>Générer un mot de passe pour l’entrée.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Longueur du mot de passe généré.</translation>
- </message>
- <message>
<source>length</source>
<translation>longueur</translation>
</message>
@@ -4216,7 +5368,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
- <translation>Délai en secondes avant effacement du presse-papiers.</translation>
+ <translation>Temps imparti en secondes avant effacement du presse-papiers.</translation>
</message>
<message>
<source>Edit an entry.</source>
@@ -4247,23 +5399,11 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version n’est pas
<translation>Effectuer une analyse approfondie du mot de passe.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extraire et imprimer le contenu d’une base de données.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Chemin de la base de données à extraire.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Insérer le mot de passe pour déverrouiller %1 : </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation>AVERTISSEMENT : Vous utilisez un format de fichier-clé hérité qui pourrait ne plus être pris en charge à l’avenir.
+ <translation>AVERTISSEMENT : vous utilisez un ancien format de fichier-clé qui pourrait ne plus être pris en charge à l’avenir.
Veuillez envisager de générer un nouveau fichier-clé.</translation>
</message>
@@ -4283,11 +5423,11 @@ Commandes disponibles :
</message>
<message>
<source>List database entries.</source>
- <translation>Lister les entrées de la base.</translation>
+ <translation>Lister les entrées de la base de données.</translation>
</message>
<message>
<source>Path of the group to list. Default is /</source>
- <translation>Chemin du groupe à lister. Par défaut : /</translation>
+ <translation>Chemin du groupe à lister. Par défaut : /</translation>
</message>
<message>
<source>Find entries quickly.</source>
@@ -4295,17 +5435,13 @@ Commandes disponibles :
</message>
<message>
<source>Search term.</source>
- <translation>Terme de recherche.</translation>
+ <translation>Critère de recherche.</translation>
</message>
<message>
<source>Merge two databases.</source>
<translation>Fusionner deux bases de données.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Chemin de la base de données cible.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Chemin de la base de données source.</translation>
</message>
@@ -4335,19 +5471,19 @@ Commandes disponibles :
</message>
<message>
<source>NULL device</source>
- <translation>Périphérique NULL</translation>
+ <translation>Périphérique NUL</translation>
</message>
<message>
<source>error reading from device</source>
- <translation>Erreur de lecture sur le périphérique</translation>
+ <translation>erreur de lecture sur le périphérique</translation>
</message>
<message>
<source>malformed string</source>
- <translation>chaîne de caractères malformée</translation>
+ <translation>chaîne incorrecte</translation>
</message>
<message>
<source>missing closing quote</source>
- <translation>fermeture de citation manquante</translation>
+ <translation>guillemet fermant manquant</translation>
</message>
<message>
<source>Group</source>
@@ -4382,10 +5518,6 @@ Commandes disponibles :
<translation>Intégration aux navigateurs</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] question-réponse - Fente %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Pressez</translation>
</message>
@@ -4403,12 +5535,12 @@ Commandes disponibles :
</message>
<message>
<source>Word count for the diceware passphrase.</source>
- <translation>Nombre de mots de la phrase de passe générée avec la méthode du lancer de dés.</translation>
+ <translation>Nombre de mots de la phrase secrète générés avec la méthode du lancer de dés.</translation>
</message>
<message>
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
- <translation>Liste de mots pour le générateur par dés.
+ <translation>Liste de mots pour le générateur par lancer de dés.
[Par défaut : FFÉ anglais]</translation>
</message>
<message>
@@ -4416,10 +5548,6 @@ Commandes disponibles :
<translation>Générer un nouveau mot de passe aléatoire.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Valeur invalide pour la taille de mot de passe %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Impossible de créer une entrée avec le chemin %1.</translation>
</message>
@@ -4433,15 +5561,15 @@ Commandes disponibles :
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation>Ajouté avec succès l&apos;entrée %1.</translation>
+ <translation>L&apos;entrée %1 a bien été ajoutée.</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
- <translation>Copier le code TOTP courant dans le presse-papiers.</translation>
+ <translation>Copier le TOTP courant dans le presse-papiers.</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation>Valeur d&apos;expiration non valide %1.</translation>
+ <translation>Valeur de temps imparti %1 invalide.</translation>
</message>
<message>
<source>Entry %1 not found.</source>
@@ -4449,36 +5577,32 @@ Commandes disponibles :
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
- <translation>L&apos;entrée avec le chemin %1 n&apos;a pas de configuration TOTP.</translation>
+ <translation>L&apos;entrée avec le chemin %1 n&apos;a pas de TOTP configuré.</translation>
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation>Le code TOTP courant de l&apos;entrée a été copié dans le presse-papiers !</translation>
+ <translation>Le TOTP actuel de l&apos;entrée a été copié dans le presse-papiers !</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation>Mot de passe de l&apos;entrée copié dans le presse-papiers !</translation>
+ <translation>Le mot de passe de l&apos;entrée a été copié dans le presse-papiers !</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Nettoyage du presse-papiers dans %1 seconde ...</numerusform><numerusform>Nettoyage du presse-papiers dans %1 secondes ...</numerusform></translation>
+ <translation><numerusform>Nettoyage du presse-papiers dans %1 seconde...</numerusform><numerusform>Nettoyage du presse-papiers dans %1 secondes...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
- <translation>Presse-papiers vidé !</translation>
+ <translation>Presse-papiers vidé !</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation>Faire taire le champs mot de passe et les autres champs secondaires.</translation>
+ <translation>Désactiver des demandes de saisie de mot de passe et des autres champs.</translation>
</message>
<message>
<source>count</source>
<comment>CLI parameter</comment>
- <translation>Compte</translation>
- </message>
- <message>
- <source>Invalid value for password length: %1</source>
- <translation>Valeur invalide pour la taille de mot de passe : %1</translation>
+ <translation>nombre</translation>
</message>
<message>
<source>Could not find entry with path %1.</source>
@@ -4486,7 +5610,7 @@ Commandes disponibles :
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation>Aucun changement effectué dans les champs de l&apos;entrée %1.</translation>
+ <translation>Aucun champ modifié dans l&apos;entrée %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
@@ -4498,7 +5622,7 @@ Commandes disponibles :
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation>Édité l&apos;entrée %1 avec succès.</translation>
+ <translation>L&apos;entrée %1 a bien été modifiée.</translation>
</message>
<message>
<source>Length %1</source>
@@ -4518,79 +5642,79 @@ Commandes disponibles :
</message>
<message>
<source>Type: Bruteforce</source>
- <translation>Type : Force brute</translation>
+ <translation>Type : méthode en force</translation>
</message>
<message>
<source>Type: Dictionary</source>
- <translation>Type : Dictionnaire</translation>
+ <translation>Type : dictionnaire</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation>Type : Dictionnaire + Leet</translation>
+ <translation>Type : dictionnaire + langage élite</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation>Type : Mots utilisateur</translation>
+ <translation>Type : mots utilisateur</translation>
</message>
<message>
<source>Type: User+Leet</source>
- <translation>Type : Utilisateur + Leet</translation>
+ <translation>Type : utilisateur + langage élite</translation>
</message>
<message>
<source>Type: Repeated</source>
- <translation>Type : Répétition</translation>
+ <translation>Type : répétition</translation>
</message>
<message>
<source>Type: Sequence</source>
- <translation>Type : Séquence</translation>
+ <translation>Type : séquence</translation>
</message>
<message>
<source>Type: Spatial</source>
- <translation>Type : Spatial</translation>
+ <translation>Type : spatial</translation>
</message>
<message>
<source>Type: Date</source>
- <translation>Type : Date</translation>
+ <translation>Type : date</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
- <translation>Type : Bruteforce(Rep)</translation>
+ <translation>Type : méthode en force (Rep)</translation>
</message>
<message>
<source>Type: Dictionary(Rep)</source>
- <translation>Type : Dictionnaire(Rep)</translation>
+ <translation>Type : dictionnaire (Rep)</translation>
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation>Type : Dictionnaire + Leet (rep)</translation>
+ <translation>Type : dictionnaire + langage élite (Rep)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation>Type : Mots Utilisateur(Rep)</translation>
+ <translation>Type : mots utilisateur (Rep)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation>Type : Utilisateur + Leet (rep)</translation>
+ <translation>Type : utilisateur + langage élite (Rep)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
- <translation>Type : Répétition(Rep)</translation>
+ <translation>Type : répétition (Rep)</translation>
</message>
<message>
<source>Type: Sequence(Rep)</source>
- <translation>Type : Séquence(Rep)</translation>
+ <translation>Type : séquence (Rep)</translation>
</message>
<message>
<source>Type: Spatial(Rep)</source>
- <translation>Type : Spatial(Rep)</translation>
+ <translation>Type : spatial (Rep)</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
- <translation>Type : Date(Rep)</translation>
+ <translation>Type : date (Rep)</translation>
</message>
<message>
<source>Type: Unknown%1</source>
- <translation>Type : Inconnu%1</translation>
+ <translation>Type : inconnu%1</translation>
</message>
<message>
<source>Entropy %1 (%2)</source>
@@ -4598,33 +5722,13 @@ Commandes disponibles :
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation>*** Longueur du mot de passe (%1) != longueurs additionnées des morceaux (%2) ***</translation>
+ <translation>*** Longueur du mot de passe (%1) != somme des longueurs des parties (%2) ***</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
<translation>Échec de chargement du fichier-clé %1 : %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Le fichier %1 n&apos;existe pas.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Impossible d&apos;ouvrir le fichier %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Erreur lors de la lecture de la base de données :
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Erreur lors de l&apos;analyse de la base de données :
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Taille du mot de passe généré</translation>
</message>
@@ -4637,10 +5741,6 @@ Commandes disponibles :
<translation>Utiliser les caractères majuscules</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Utiliser des nombres.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Utiliser les caractères spéciaux</translation>
</message>
@@ -4650,7 +5750,7 @@ Commandes disponibles :
</message>
<message>
<source>Exclude character set</source>
- <translation>Exclure les caractères suivants</translation>
+ <translation>Exclure le jeu de caractères</translation>
</message>
<message>
<source>chars</source>
@@ -4658,15 +5758,15 @@ Commandes disponibles :
</message>
<message>
<source>Exclude similar looking characters</source>
- <translation>Exclure les caractères qui se ressemblent</translation>
+ <translation>Exclure les caractères semblables</translation>
</message>
<message>
<source>Include characters from every selected group</source>
- <translation>Inclure des caractères de chaque groupe</translation>
+ <translation>Inclure les caractères de chaque groupe</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
- <translation>Lister récursivement les éléments du groupe</translation>
+ <translation>Lister récursivement les éléments du groupe.</translation>
</message>
<message>
<source>Cannot find group %1.</source>
@@ -4675,7 +5775,7 @@ Commandes disponibles :
<message>
<source>Error reading merge file:
%1</source>
- <translation>Erreur lors de la lecture du fichier fusionner :
+ <translation>Erreur lors de la lecture du fichier fusionné :
%1</translation>
</message>
<message>
@@ -4688,15 +5788,15 @@ Commandes disponibles :
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation>Entrée %1 recyclée avec succès.</translation>
+ <translation>L&apos;entrée %1 a bien été récupérée.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation>Supprimé l&apos;entrée %1 avec succès.</translation>
+ <translation>L&apos;entrée %1 a bien été supprimée.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
- <translation>Afficher le TOTP courant pour l&apos;entrée.</translation>
+ <translation>Afficher le TOTP actuel de l&apos;entrée.</translation>
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
@@ -4704,11 +5804,11 @@ Commandes disponibles :
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation>Aucun logiciel configuré pour la manipulation du presse-papiers</translation>
+ <translation>Aucun programme configuré pour la gestion du presse-papiers</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation>Impossible de démarrer le logiciel %1</translation>
+ <translation>Impossible de démarrer le programme %1</translation>
</message>
<message>
<source>file empty</source>
@@ -4716,7 +5816,7 @@ Commandes disponibles :
</message>
<message>
<source>%1: (row, col) %2,%3</source>
- <translation>%1: (ligne,colonne) %2,%3</translation>
+ <translation>%1 : (ligne, colonne) %2, %3</translation>
</message>
<message>
<source>AES: 256-bit</source>
@@ -4778,27 +5878,19 @@ Commandes disponibles :
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation>Impossible d&apos;enregistrer la base de données: %1.</translation>
+ <translation>Impossible d&apos;enregistrer la base de données : %1.</translation>
</message>
<message>
<source>Successfully created new database.</source>
- <translation>Créé avec succès la nouvelle base de données.</translation>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Introduire le mot de passe pour chiffrer la base de données (Presser retour pour laisser vide) :</translation>
+ <translation>La nouvelle base de données a bien été créée.</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation>Creation du fichier clé %1 échoué : %2 </translation>
+ <translation>Échec lors de la création du fichier clé %1 : %2 </translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation>Chargement du fichier clé %1 échoué : %2</translation>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>Supprimer une entrée de la base de données.</translation>
+ <translation>Échec lors du chargement du fichier-clé %1 : %2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4850,41 +5942,365 @@ Commandes disponibles :
</message>
<message>
<source>Database password: </source>
- <translation>Mot de passe de la base de données :</translation>
+ <translation>Mot de passe de la base de données :</translation>
</message>
<message>
<source>Cannot create new group</source>
- <translation>Impossible de créer de nouveau groupe</translation>
+ <translation>Impossible de créer un nouveau groupe</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Désactiver la clé du mot de passe pour la base de données.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Afficher les informations de débogage.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Désactiver la clé du mot de passe pour la base de données à fusionner.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Version %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Type de version : %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Révision : %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Canal : %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Le mode débogage est désactivé.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Le mode débogage est activé.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Système d’exploitation : %1
+Architecture de l&apos;unité centrale : %2
+Noyau : %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Saisie automatique</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (partage signé et non signé)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (partage signé uniquement)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (partage non signé uniquement)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Aucun</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Extensions activées :</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Bibliothèques cryptographiques :</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Impossible de générer un mot de passe et devoir le confirmer en même temps !</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Ajoute un nouveau groupe à la base de données.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Chemin du groupe à ajouter.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Le groupe %1 existe déjà !</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Groupe %1 introuvable.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Le groupe %1 a bien été ajouté.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Vérifie si l&apos;un de vos mots de passe a fuité publiquement. NOM_DU_FICHIER doit être le chemin d&apos;une liste d&apos;empreintes SHA-1 de mots de passe fuités au format HIBP, disponible à l&apos;adresse https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>NOM_DU_FICHIER</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analyse les mots de passe aux fins de fuite et de problèmes.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Échec de l&apos;ouverture du fichier HIBP %1 : %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Comparaison des entrées de la base de données avec le fichier HIBP, cette opération prend du temps...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Fermer la base de données actuellement ouverte.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Afficher cette aide.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Emplacement Yubikey utilisé pour chiffrer la base de données.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>emplacement</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Nombre de mots %1 invalide</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>La liste de mots est trop courte (moins de 1 000 entrées)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Quitte le mode interactif.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Format à utiliser lors de l&apos;exportation. Les choix disponibles sont xml et csv. La valeur par défaut est xml.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Exporte le contenu de la base de données vers la sortie standard au format spécifié.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Impossible d&apos;exporter la base de données en XML : %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Format %1 non pris en charge</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Utiliser des nombres</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Longueur du mot de passe %1 invalide</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Afficher l&apos;aide de la commande.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Commandes disponibles :</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Importe le contenu d&apos;une base de données XML.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Chemin vers l&apos;exportation de la base de données au format XML.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Chemin vers la nouvelle base de données.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Impossible d&apos;importer le fichier base de données au format XML %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>La base de données a bien été importée.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Commande inconnue %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Fusionne la sortie en une seule ligne.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>N&apos;afficher que les modifications détectées lors de l&apos;opération de fusion.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Emplacement Yubikey pour la seconde base de données.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>%1 a bien été fusionné avec %2.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>La base de données n&apos;a pas été modifiée par l&apos;opération de fusion.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Déplace une entrée vers un nouveau groupe.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Chemin de l&apos;entrée à déplacer.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Chemin du groupe de destination.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Impossible de trouver un groupe avec le chemin %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>L&apos;entrée est déjà dans le groupe %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>L&apos;entrée %1 a bien été déplacée vers le groupe %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Ouvre une base de données.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Chemin vers le groupe à supprimer.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Impossible de supprimer le groupe racine de la base de données.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Le groupe %1 a bien été récupéré.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Le groupe %1 a bien été supprimé.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Impossible d&apos;ouvrir la base de données %1 : introuvable</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Impossible d&apos;ouvrir le fichier de base de données %1 : fichier non standard</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Impossible d&apos;ouvrir la base de données %1 : illisible</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Saisir le mot de passe pour déverrouiller %1 :</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Emplacement YubiKey %1 invalide</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Veuillez appuyer sur le bouton de votre YubiKey pour déverrouiller %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Saisissez le mot de passe pour chiffrer la base de données (optionnel) :</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>Fichier HIBP, ligne %1 : erreur d&apos;analyse</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Intégration au Secret Service</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Nom d&apos;utilisateur</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Question-réponse - Emplacement %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Le mot de passe pour &apos;%1&apos; a fuité %2 fois !</numerusform><numerusform>Le mot de passe pour « %1 » a fuité %2 fois !</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Générateur de mots de passe invalide après l&apos;application de toutes les options</translation>
</message>
</context>
<context>
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
- <translation>Erreur interne zlib lors de la compression :</translation>
+ <translation>Erreur interne zlib lors de la compression :</translation>
</message>
<message>
<source>Error writing to underlying device: </source>
- <translation>Erreur d’écriture sur le périphérique concerné :</translation>
+ <translation>Erreur d’écriture sur le périphérique interne :</translation>
</message>
<message>
<source>Error opening underlying device: </source>
- <translation>Erreur d’ouverture du périphérique concerné :</translation>
+ <translation>Erreur d’ouverture du périphérique interne :</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
- <translation>Erreur de lecture sur le périphérique concerné :</translation>
+ <translation>Erreur de lecture sur le périphérique interne :</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
- <translation>Erreur interne zlib lors de la décompression :</translation>
+ <translation>Erreur interne zlib lors de la décompression :</translation>
</message>
</context>
<context>
<name>QtIOCompressor::open</name>
<message>
<source>The gzip format not supported in this version of zlib.</source>
- <translation>Le format gzip n’est pas supporté dans cette version de zlib.</translation>
+ <translation>Le format gzip n’est pas pris en charge dans cette version de zlib.</translation>
</message>
<message>
<source>Internal zlib error: </source>
@@ -4923,7 +6339,7 @@ Commandes disponibles :
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
- <translation>Une demande de confirmation n&apos;est pas supportée par l&apos;agent (vérifier les paramètres).</translation>
+ <translation>Une demande de confirmation n&apos;est pas prise en charge par l&apos;agent (vérifier les paramètres).</translation>
</message>
</context>
<context>
@@ -4934,11 +6350,11 @@ Commandes disponibles :
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation>Les termes de recherche sont construits comme suit : [modificateurs][champ:][&quot;]terme[&quot;]</translation>
+ <translation>Les critères de recherche sont les suivants : [modificateurs][champ:][&quot;]terme[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation>Tous les termes doivent correspondre (ET logique)</translation>
+ <translation>Tous les mots-clé doivent correspondre (ex. : ET logique)</translation>
</message>
<message>
<source>Modifiers</source>
@@ -4946,7 +6362,7 @@ Commandes disponibles :
</message>
<message>
<source>exclude term from results</source>
- <translation>exclure le terme des résultats</translation>
+ <translation>exclure le critère des résultats</translation>
</message>
<message>
<source>match term exactly</source>
@@ -4954,7 +6370,7 @@ Commandes disponibles :
</message>
<message>
<source>use regex in term</source>
- <translation>utiliser les expressions régulières dans le terminal</translation>
+ <translation>utiliser les expressions régulières le critère</translation>
</message>
<message>
<source>Fields</source>
@@ -4962,7 +6378,7 @@ Commandes disponibles :
</message>
<message>
<source>Term Wildcards</source>
- <translation>Caractères spéciaux</translation>
+ <translation>Jokers de critères</translation>
</message>
<message>
<source>match anything</source>
@@ -4985,7 +6401,7 @@ Commandes disponibles :
<name>SearchWidget</name>
<message>
<source>Search</source>
- <translation>Recherche</translation>
+ <translation>Rechercher</translation>
</message>
<message>
<source>Clear</source>
@@ -5006,7 +6422,94 @@ Commandes disponibles :
</message>
<message>
<source>Case sensitive</source>
- <translation>Sensible à la casse</translation>
+ <translation>Casse différenciée</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Activer l’intégration de KeePassXC à Freedesktop.org Secret Service</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Général</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Afficher une notification lors que les identifiants sont demandés</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Si la corbeille est activée pour la base de données, les entrées seront déplacées dans la corbeille directement. Sinon, elles seront supprimées sans confirmation.&lt;/p&gt;&lt;p&gt;Une confirmation sera toujours demandée si l&apos;entrée est référencée par d&apos;autres.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Ne pas confirmer lorsque les entrées sont supprimées par des clients.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Groupes de la base de données visibles :</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Groupe</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Gérer</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorisation</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Ces applications sont actuellement connectées :</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Application</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Déconnecter</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Paramètres de la base de données</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Modifier les paramètres de la base de données</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Déverrouiller la base de données</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Déverrouiller la base de données pour afficher plus d&apos;informations</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Verrouiller la base de données</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Déverrouiller pour afficher</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Aucun</translation>
</message>
</context>
<context>
@@ -5017,11 +6520,11 @@ Commandes disponibles :
</message>
<message>
<source>Allow export</source>
- <translation>Autoriser l&apos;export</translation>
+ <translation>Autoriser l&apos;exportation</translation>
</message>
<message>
<source>Allow import</source>
- <translation>Autoriser l&apos;import</translation>
+ <translation>Autoriser l&apos;importation</translation>
</message>
<message>
<source>Own certificate</source>
@@ -5033,7 +6536,7 @@ Commandes disponibles :
</message>
<message>
<source>Certificate:</source>
- <translation>Certificat :</translation>
+ <translation>Certificat :</translation>
</message>
<message>
<source>Signer</source>
@@ -5041,7 +6544,7 @@ Commandes disponibles :
</message>
<message>
<source>Key:</source>
- <translation>Clé :</translation>
+ <translation>Clé :</translation>
</message>
<message>
<source>Generate</source>
@@ -5106,7 +6609,7 @@ Commandes disponibles :
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation>cle.share</translation>
+ <translation>key.share</translation>
</message>
<message>
<source>KeeShare key file</source>
@@ -5126,28 +6629,123 @@ Commandes disponibles :
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation>Le certificat exporté est différent de celui en cours d&apos;utilisation. Voulez-vous exporter le certificat actuel ?</translation>
+ <translation>Le certificat exporté est différent de celui en cours d&apos;utilisation. Voulez-vous exporter le certificat actuel ?</translation>
</message>
<message>
<source>Signer:</source>
- <translation>Signataire :</translation>
+ <translation>Signataire :</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Autoriser les imports KeeShare</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Autoriser les exports KeeShare</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Afficher uniquement les avertissements et erreurs</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Clé</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Champ du nom du signataire</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Régénérer un nouveau certificat</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importer un certificat existant</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Exporter son propre certificat</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Partages connus</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Approuver le certificat sélectionné</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Demander systématiquement l&apos;approbation du certificat sélectionné</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Désapprouver le certificat sélectionné</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Supprimer le certificat sélectionné</translation>
</message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Remplacer le conteneur de partage signé s&apos;il n&apos;est pas pris en charge - empêche l&apos;exportation</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Impossible d&apos;exporter le conteneur (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Impossible d&apos;intégrer la signature : le fichier n&apos;a pas pu être ouvert en écriture (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Impossible d&apos;intégrer la signature : problème d&apos;écriture dans le fichier (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Impossible d&apos;intégrer la base de données : le fichier n&apos;a pas pu être ouvert en écriture (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Impossible d&apos;intégrer la base de données : problème d&apos;écriture dans le fichier (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Remplacer le conteneur de partage non signé s&apos;il n&apos;est pas pris en charge - empêche l&apos;exportation</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Impossible d&apos;exporter le conteneur</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Une erreur inattendue est survenue lors de l&apos;exportation</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importer depuis le conteneur sans signature</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
- <translation>Nous ne pouvons vérifier la source du conteneur partagé car celui-ci n&apos;est pas signé. Êtes-vous sûr de vouloir importer depuis %1 ?</translation>
+ <translation>Impossible de vérifier la source du conteneur partagé car celui-ci n&apos;est pas signé. Êtes-vous sûr de vouloir l&apos;importer depuis %1 ?</translation>
</message>
<message>
<source>Import from container with certificate</source>
<translation>Importer depuis le conteneur avec certificat</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Voulez-vous approuver %1 avec l&apos;empreinte de %2 à %3 ? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Pas cette fois</translation>
</message>
@@ -5164,24 +6762,12 @@ Commandes disponibles :
<translation>Cette fois uniquement</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Échec de l&apos;import depuis %1 (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Importé avec succès depuis %1 (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Imprté depuis %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
- <translation>Conteneur de partage signé non pris en charge - importation annulée</translation>
+ <translation>Conteneur de partage signé non pris en charge - empêche l&apos;importation</translation>
</message>
<message>
<source>File is not readable</source>
- <translation>Le fichier n&apos;est pas lisible</translation>
+ <translation>Le fichier est illisible</translation>
</message>
<message>
<source>Invalid sharing container</source>
@@ -5189,7 +6775,7 @@ Commandes disponibles :
</message>
<message>
<source>Untrusted import prevented</source>
- <translation>Importation non sécurisée annulée</translation>
+ <translation>Importation non approuvée bloquée</translation>
</message>
<message>
<source>Successful signed import</source>
@@ -5201,7 +6787,7 @@ Commandes disponibles :
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation>Conteneur de partage non signé non pris en charge - importation annulée</translation>
+ <translation>Conteneur de partage non signé non pris en charge - empêche l&apos;importation</translation>
</message>
<message>
<source>Successful unsigned import</source>
@@ -5215,43 +6801,34 @@ Commandes disponibles :
<source>Unknown share container type</source>
<translation>Type de conteneur de partage non reconnu</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Remplacement de conteneur de partage signé non pris en charge - exportation annulée</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Impossible d&apos;exporter le conteneur (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Remplacement de conteneur non signé non pris en charge - exportation annulée</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Échec de l&apos;importation depuis %1 (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Impossible d&apos;exporter le conteneur</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>%1 a bien été importé (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Une erreur inattendue est survenue lors de l&apos;exportation</translation>
+ <source>Imported from %1</source>
+ <translation>Importé depuis %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
- <translation>Échec de l&apos;export vers %1 (%2)</translation>
+ <translation>L&apos;exportation vers %1 a échoué (%2)</translation>
</message>
<message>
<source>Export to %1 successful (%2)</source>
- <translation>Réussite de l&apos;export vers %1 (%2)</translation>
+ <translation>%1 a bien été importé (%2)</translation>
</message>
<message>
<source>Export to %1</source>
<translation>Exporter vers %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Voulez-vous autoriser %1 avec l&apos;empreinte de %2 à %3 ? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Chemin source d&apos;importation multiple de %1 dans %2</translation>
</message>
@@ -5259,28 +6836,12 @@ Commandes disponibles :
<source>Conflicting export target path %1 in %2</source>
<translation>Conflit du chemin cible d&apos;exportation %1 dans %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Impossible d&apos;intégrer la signature : le fichier (%1) n&apos;a pas pu être ouvert en écriture</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Impossible d&apos;intégrer la signature : problème d&apos;écriture dans le fichier (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Impossible d&apos;intégrer la base de données : le fichier (%1) n&apos;a pas pu être ouvert en écriture</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Impossible d&apos;intégrer la base de données : problème d&apos;écriture dans le fichier (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
<message>
<source>Timed Password</source>
- <translation>Mot de passe programmé</translation>
+ <translation>Mot de passe à usage limité</translation>
</message>
<message>
<source>000000</source>
@@ -5288,27 +6849,27 @@ Commandes disponibles :
</message>
<message>
<source>Copy</source>
- <translation>Copie</translation>
+ <translation>Copier</translation>
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Expiration dans &lt;b&gt;%n&lt;/b&gt;seconde</numerusform><numerusform>Expiration dans &lt;b&gt;%n&lt;/b&gt;secondes</numerusform></translation>
+ <translation><numerusform>Expire dans &lt;b&gt;%n&lt;/b&gt;seconde</numerusform><numerusform>Expire dans &lt;b&gt;%n&lt;/b&gt;secondes</numerusform></translation>
</message>
</context>
<context>
<name>TotpExportSettingsDialog</name>
<message>
<source>Copy</source>
- <translation>Copie</translation>
+ <translation>Copier</translation>
</message>
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation>NOTE: Les paramètres TOTP sont personnalisés et peuvent ne pas être compatibles avec d&apos;autres logiciels.</translation>
+ <translation>NOTE : les paramètres TOTP sont personnalisés et peuvent ne pas fonctionner avec d&apos;autres authentificateurs.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation>Une erreur est survenue lors de la création du QR Code.</translation>
+ <translation>Une erreur est survenue lors de la création du QR code.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
@@ -5322,16 +6883,12 @@ Commandes disponibles :
<translation>Configuration TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Clé :</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
- <translation>Paramètres de base des codes RFC 6238</translation>
+ <translation>Paramètres par défaut des jetons RFC 6238</translation>
</message>
<message>
<source>Steam token settings</source>
- <translation>Paramètres du code éphémère Steam</translation>
+ <translation>Paramètres du jeton Steam</translation>
</message>
<message>
<source>Use custom settings</source>
@@ -5343,7 +6900,7 @@ Commandes disponibles :
</message>
<message>
<source>Time step:</source>
- <translation>Période de temps :</translation>
+ <translation>Intervalle :</translation>
</message>
<message>
<source> sec</source>
@@ -5355,16 +6912,46 @@ Commandes disponibles :
<translation>Taille du code :</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 chiffres</translation>
+ <source>Secret Key:</source>
+ <translation>Clé secrète :</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>La clé secrète doit être au format Base32</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Champ de la clé secrète</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 chiffres</translation>
+ <source>Algorithm:</source>
+ <translation>Algorithme :</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 chiffres</translation>
+ <source>Time step field</source>
+ <translation>Champ de l&apos;intervalle</translation>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation>chiffres</translation>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation>Secret TOTP invalide</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Vous avez introduit une clé secrète invalide. La clé doit être au format Base32.
+Exemple : JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Confirmer la suppression des paramètres TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Êtes-vous sûr de vouloir supprimer les paramètres TOTP pour cette entrée ?</translation>
</message>
</context>
<context>
@@ -5375,7 +6962,7 @@ Commandes disponibles :
</message>
<message>
<source>Checking for updates...</source>
- <translation>Vérification des mises à jour ...</translation>
+ <translation>Vérification des mises à jour...</translation>
</message>
<message>
<source>Close</source>
@@ -5383,7 +6970,7 @@ Commandes disponibles :
</message>
<message>
<source>Update Error!</source>
- <translation>Erreur de mise à jour !</translation>
+ <translation>Erreur de mise à jour !</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
@@ -5399,7 +6986,7 @@ Commandes disponibles :
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation>Une nouvelle version de KeePassXC est disponible !</translation>
+ <translation>Une nouvelle version de KeePassXC est disponible !</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
@@ -5411,18 +6998,18 @@ Commandes disponibles :
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation>Votre version est à jour !</translation>
+ <translation>Votre version est à jour !</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation>KeePassXC %1 est la dernière version disponible.</translation>
+ <translation>KeePassXC %1 est la dernière version en date</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
- <translation>Gardez vos mots de passe en sécurité dans une base de données KeePassXC</translation>
+ <translation>Conservez vos mots de passe en sécurité dans une base de données KeePassXC</translation>
</message>
<message>
<source>Create new database</source>
@@ -5438,7 +7025,7 @@ Commandes disponibles :
</message>
<message>
<source>Import from CSV</source>
- <translation>Importer depuis un CSV</translation>
+ <translation>Importer depuis un fichier CSV</translation>
</message>
<message>
<source>Recent databases</source>
@@ -5446,7 +7033,15 @@ Commandes disponibles :
</message>
<message>
<source>Welcome to KeePassXC %1</source>
- <translation>Bienvenue sur KeePassXC %1</translation>
+ <translation>Bienvenue dans KeePassXC %1</translation>
+ </message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importer depuis 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Ouvrir une base de données récente</translation>
</message>
</context>
<context>
@@ -5461,7 +7056,7 @@ Commandes disponibles :
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Si vous possédez une &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, vous pouvez l&apos;utiliser afin d&apos;améliorer la sécurité.&lt;/p&gt;&lt;p&gt;Cela nécessite qu&apos;un slot de votre YubiKey soit programmé comme &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;Question-réponse HMAC-SHA1&lt;/a&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Si vous possédez une &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, vous pouvez l&apos;utiliser afin d&apos;améliorer la sécurité.&lt;/p&gt;&lt;p&gt;Cela nécessite qu&apos;un emplacement de votre YubiKey soit programmé comme &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;question-réponse HMAC-SHA1&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
@@ -5471,5 +7066,13 @@ Commandes disponibles :
<source>No YubiKey inserted.</source>
<translation>Aucune YubiKey insérée.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Actualiser les clés matérielles</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Sélection de l&apos;emplacement de la clé matérielle</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_hu.ts b/share/translations/keepassx_hu.ts
index 5173dbf0c..94e198647 100644
--- a/share/translations/keepassx_hu.ts
+++ b/share/translations/keepassx_hu.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Stílus követése</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Beállítások visszaállítása?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Biztos, hogy vissza akarja állítani az összes általános és biztonsági beállítást az alapértelmezésre?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>A KeePassXC többszörös indításának tiltása</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Utolsó adatbázis megjegyzése</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Az utolsó kulcsfájlok és biztonsági hardverkulcsok megjegyzése</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Előző adatbázisok betöltése indításkor</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Indításkor az ablak kicsinyítése</translation>
</message>
@@ -163,10 +159,6 @@
<translation>A csoport ikonjának használata a bejegyzés létrehozásakor</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Kicsinyítés a vágólapra történő másoláskor</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>A bejegyzés előnézeti panel elrejtése</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Az ablak rendszertálcára rejtése kicsinyítéskor</translation>
</message>
<message>
- <source>Language</source>
- <translation>Nyelv</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Automatikus beírás</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Automatikus beírás kezdésének késleltetése</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Frissítések keresése a program indulásakor</translation>
+ <source>Movable toolbar</source>
+ <translation>Mozgatható eszköztár</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>Az előzőleg használt adatbázisok megjegyzése</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>A frissítések keresése az előzetes kiadásokra is terjedjen ki</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Az előzőleg feloldott adatbázisok betöltése indításkor</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Mozgatható eszköztár</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Adatbázis-kulcsfájlok és biztonsági hardverkulcsok megjegyzése</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Frissítések keresése hetente egyszer az alkalmazás indulásakor</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>A frissítések keresése a béta kiadásokra is terjedjen ki</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Gombstílus:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Nyelv:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(újraindítás után akitválódik)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Ablak kicsinyítése az adatbázis feloldása után </translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Kicsinyítés URL megnyitásakor</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Ablak elrejtése a vágólapra történő másoláskor</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Kicsinyítés</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Háttérbe dobás</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Favicon letöltési időtúllépés:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Weboldalikon letöltésének időtúllépése másodpercben</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> mp</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Gombstílus</translation>
+ <source>Toolbar button style</source>
+ <translation>Eszköztár gombstílusa</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Jegyzetek rögzített szélességű betűkészlettel</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Nyelvválasztás</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Beállítások visszaállítása az alapértelmezettre </translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Globális automatikus beírás gyorsbillentyűje</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Automatikus karakterbeírás késleltetése milliszekundumban</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Automatikus beírás indításának késleltetése milliszekundumban</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Adatvédelem</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>A DuckDuckGo használata tartalékként, a webhelyikonok letöltésére</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>A DuckDuckGo alkalmazása a webhelyikonok letöltésére</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Vágólap törlése másodpercben</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>A TouchID tétlenségi visszaállítás</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Adatbázis zárolási időtúllépése másodpercben</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Keresési kifejezés törlése ennyi idő után</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>&amp;Felhasználónév másolása</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>&amp;Jelszó másolása</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Bejegyzés kijelölése automatikus beírásra:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Keresés…</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>A %1 jelszóengedélyt kér a következő elem(ek) számára.
Válassza ki, hogy engedélyezi-e a hozzáférést.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Hozzáférés megadása</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Hozzáférés megtiltása</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Válassza ki a helyes adatbázist a hitelesítő adatok mentéséhez.</translati
<translation>Ez szükséges az adatbázis KeePassXC-böngészőből történő eléréséhez</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>KeepassXC böngészőintegráció engedélyezése</translation>
- </message>
- <message>
<source>General</source>
<translation>Általános</translation>
</message>
@@ -534,10 +643,6 @@ Válassza ki a helyes adatbázist a hitelesítő adatok mentéséhez.</translati
<translation>Hozzáférési adatok &amp;frissítése előtt soha ne kérdezzen</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Csak a kijelölt adatbázishoz kell kapcsolódnia egy klienssel.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>&amp;Keresés minden megnyitott adatbázis hitelesítési adataiban</translation>
@@ -593,10 +698,6 @@ Válassza ki a helyes adatbázist a hitelesítő adatok mentéséhez.</translati
<translation>&amp;Tor böngésző</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Figyelem&lt;/b&gt;, a keepassxc-proxy alkalmazás nem található!&lt;br /&gt;Ellenőrizze a KeePassXC telepítési könyvtárat, vagy erősítse meg az egyéni útvonalat a speciális beállításokban.&lt;br /&gt;A böngészőintegráció NEM FOG MŰKÖDNI a proxy alkalmazás nélkül.&lt;br /&gt;Várt útvonal:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Végrehajtható fájlok</translation>
</message>
@@ -621,6 +722,50 @@ Válassza ki a helyes adatbázist a hitelesítő adatok mentéséhez.</translati
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>A böngészőintegráció működéséhez a KeePassXC-böngészőre van szükség. &lt;br /&gt;Letölthető ezen böngészőkre: %1 és %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>A lejárt hitelesítési adatok visszaadása. A [lejárt] szöveg hozzá lesz adva a címhez.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Lejárt hitelesítési adatok visszaadásának engedélyezése</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Böngészőintegráció engedélyezése</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>A snappal telepített böngészők jelenleg nem támogatottak. </translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Minden a kiterjesztéshez csatlakoztatott böngésző visszaadja az illeszkedő hitelesítési adatokat.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Ne jelenjen meg a felugró ablak a örökölt KeePassHTTP beállításokból való költözésről.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Ne kérdezzen a KeePassHTTP beállításokból való költözésről</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Egyedi proxyhely mező</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Egyedi proxyfájl böngészője</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Figyelem&lt;/b&gt;, a keepassxc-proxy alkalmazás nem található!&lt;br /&gt;Ellenőrizze a KeePassXC telepítési könyvtárat, vagy erősítse meg az egyéni útvonalat a speciális beállításokban.&lt;br /&gt;A böngészőintegráció NEM FOG MŰKÖDNI a proxy alkalmazás nélkül.&lt;br /&gt;Várt útvonal: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -712,6 +857,10 @@ Would you like to migrate your existing settings now?</source>
Ez szükséges a jelenlegi böngészőkapcsolatok fenntartásához.
Biztos, hogy migrálja most a meglévő beállításokat?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Ne jelenjen meg többé a figyelmeztetés</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -771,10 +920,6 @@ Biztos, hogy migrálja most a meglévő beállításokat?</translation>
<translation>Az első sor fejléc</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Kihagyandó fejléc sorok száma</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>„\” feloldójelnek értelmezve</translation>
</message>
@@ -824,6 +969,22 @@ Biztos, hogy migrálja most a meglévő beállításokat?</translation>
<translation>CSV importálás: a mentés hibába ütközött:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Szöveghatároló</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Mezőhatároló</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Kihagyandó fejléc sorok száma</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV-import előnézete</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -865,10 +1026,6 @@ Biztos, hogy migrálja most a meglévő beállításokat?</translation>
<translation>Hiba az adatbázis megnyitásakor: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Nem menthető, az adatbázisnak nincs fájlneve.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>A fájlba nem lehet írni, mert csak olvasható módban van megnyitva.</translation>
</message>
@@ -876,6 +1033,28 @@ Biztos, hogy migrálja most a meglévő beállításokat?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>A kulcs nincs átalakítva. Ez egy hiba, jelezze a fejlesztőknek!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Az adatbázis biztonsági másolata: %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Nem menthető, az adatbázis nem érvényes fájlra mutat.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Nem menthető, az adatbázisfájl csak olvasható.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Az adatbázisfájlban nem egyesített változások vannak.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Kuka</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -887,30 +1066,14 @@ Biztos, hogy migrálja most a meglévő beállításokat?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Mesterkulcs megadása</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Kulcsfájl:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Jelszó:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Tallózás</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Frissítés</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Kihívás-válasz:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Örökölt kulcsfájl formátum</translation>
</message>
@@ -940,20 +1103,100 @@ Megfontolandó egy új kulcsfájl készítése.</translation>
<translation>Kulcsfájl kiválasztása</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID a gyors feloldáshoz</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>A kulcsfájl megnyitása sikertelen: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Az adatbázis nem nyitható meg:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Foglalat kijelölése…</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>A kulcsfájl nem nyitható meg:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>KeePassXC adatbázis feloldása</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Jelszó megadása:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Jelszó mező</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Jelszó láthatóságának átváltása</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>További hitelesítési adatok megadása:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Kulcsfájl kijelölése</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardverkulcsfoglalat kijelölése</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Kulcsfájl böngészése</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Tallózás…</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Hardveres jelsorok frissítése</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Hardverkulcs:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;A &lt;strong&gt;YubiKey&lt;/strong&gt; vagy az &lt;strong&gt;OnlyKey&lt;/strong&gt; biztonsági hardverkulcsok alkalmazhatóak a HMAC-SHA1-re konfigurált foglalattal.&lt;/p&gt;
+ &lt;p&gt;További információk...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Hardverkulcs súgó</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID a Quick Unlockhoz</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Törlés</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Kulcsfájl törlése</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Fájl kijelölése…</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Feloldás sikertelen, jelszót nem adott</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Az adatbázis feloldása sikertelen és jelszót nem lett megadva.
+Próbáljuk meg inkább „üres” jelszóval?
+
+Ezen hiba megjelenése megelőzhető az Adatbázis-beállítások → Biztonság pontban a jelszó alapállapotba helyezésével.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Üres jelszó megpróbálása</translation>
</message>
</context>
<context>
@@ -1108,6 +1351,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Valóban átállítja az összes örökölt böngészőintegrációs adatot a legfrissebb szabványra?
Ez szükséges a böngészőbővítmény kompatibilitásának fenntartásához.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Tárolt böngészőkulcs</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Kijelölt kulcs eltávolítása</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1233,7 +1484,7 @@ Ezt a számot megtartva az adatbázis nagyon könnyen törhető lesz.</translati
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
+ <translation><numerusform>MiB</numerusform><numerusform>MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
@@ -1250,6 +1501,57 @@ Ezt a számot megtartva az adatbázis nagyon könnyen törhető lesz.</translati
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Meglévő visszafejtése idő módosítása</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Visszafejtési idő másodpercben</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Adatbázis-formátum</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Titkosítási algoritmus</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Kulcsszármaztatási függvény</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Átalakítási fordulók száma</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Memóriahasználat</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Párhuzamosság</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Nyitott bejegyzések</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Ne legyen megnyitva ez az adatbázis</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>A csoport &amp;alatti bejegyzések legyenek megnyitva:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Az fd.o titkos szolgáltatás engedélyezésével aktiválhatók ezek a beállítások.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1297,6 +1599,40 @@ Ezt a számot megtartva az adatbázis nagyon könnyen törhető lesz.</translati
<source>Enable &amp;compression (recommended)</source>
<translation>&amp;Tömörítés engedélyezése (ajánlott)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Adatbázisnév mező</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Adatbázisleírás mező</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Alapértelmezett felhasználónév mező</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Előzményelemek maximális száma bejegyzésenként</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Előzmények maximális mérete bejegyzésenként</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Kuka törlése</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Valóban törölhető az aktuállis kuka minden elemével együtt?
+Ez vissza nem vonható!</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(régi)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1364,6 +1700,10 @@ Valóban jelszó nélkül folytatja?</translation>
<source>Failed to change master key</source>
<translation>A mesterkulcs módosítása meghiúsult</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Folytatás jelszó nélkül</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1375,6 +1715,129 @@ Valóban jelszó nélkül folytatja?</translation>
<source>Description:</source>
<translation>Leírás:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Adatbázisnév mező</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Adatbázisleírás mező</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statisztika</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>További információk a hibaikonokkal rendelkező vonalak fölé vitt egérrel nyerhetők.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Név</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Érték</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Adatbázisnév</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Leírás</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Hely</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Legutóbb mentve</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Nem mentett módosítsok</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>igen</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>nem</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Az adatbázis módosítva lett, de még nem lett lemezre mentve.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Csoportszám</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Bejegyzésszám</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Lejárt bejegyzések száma</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Az adatbázis lejárt bejegyzéseket tartalmaz.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Egyedi jelszavak</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Nem egyedi jelszavak</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>A jelszavak több, mint 10%-a újrahasznosított. Egyedi jelszavakat kellene használni, ahol csak lehetséges.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Maximális jelszó-újrahasznosítás</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Néhány jelszó több, mint háromszor lett újrahasznosítva. Egyedi jelszavakat kellene használni, ahol csak lehetséges.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Rövid jelszavak száma</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>A jelszavak javasolt minimális hosszúsága legalább 8 karakter.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Gyenge jelszavak száma</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Olyan hosszú és véletlenszerű jelszavak használata javasolt, melyek besorolása „jó” és „kiváló”.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Átlagos jelszóhossz</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 karakter</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Az átlagos jelszóhossz kevesebb, mint 10 karakter. A hosszabb jelszavak nagyobb biztonságot szavatolnak.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1425,10 +1888,6 @@ This is definitely a bug, please report it to the developers.</source>
Ez határozottan hiba, jelentse a fejlesztőknek.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Az adatbázisfájl nem létezik, vagy nem lehet hozzáférni.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Válasszon CSV-fájlt</translation>
</message>
@@ -1451,6 +1910,30 @@ Ez határozottan hiba, jelentse a fejlesztőknek.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Csak olvasható]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Az adatbázisfájl megnyitása sikertelen: %. Vagy nem létezik, vagy nem lehet hozzáférni.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Adatbázis exportálása HTML-fájlba</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML-fájl</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>A HTML-fájl mentése sikertelen.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Exportálás megerősítése</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Az adatbázis nem titkosított fájlba lesz exportálva. Így sebezhetőek lesznek a jelszavak és más érzékeny információk. Valóban folytatható a művelet?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1468,7 +1951,7 @@ Ez határozottan hiba, jelentse a fejlesztőknek.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Valóban a kukába szeretne dobni %n elemet?</numerusform><numerusform>Valóban a kukába szeretne dobni %n elemet?</numerusform></translation>
+ <translation><numerusform>Biztos, hogy a kukába dob %n elemet?</numerusform><numerusform>Biztos, hogy a kukába dob %n elemet?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1530,7 +2013,7 @@ Egyesíti a módosításokat?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Valóban végleg szeretné törölni a(z) %n bejegyzést?</numerusform><numerusform>Valóban végleg szeretné törölni a(z) %n bejegyzést?</numerusform></translation>
+ <translation><numerusform>Biztos, hogy végleg töröl %n elemet?</numerusform><numerusform>Biztos, hogy végleg töröl %n elemet?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
@@ -1541,10 +2024,6 @@ Egyesíti a módosításokat?</translation>
<translation><numerusform>Kukába dobja a bejegyzést?</numerusform><numerusform>Kukába dobja a bejegyzéseket?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Fájl megnyitva csak olvashatóként</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Zárolja az adatbázist?</translation>
</message>
@@ -1585,12 +2064,6 @@ Disable safe saves and try again?</source>
Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Az adatbázis írása meghiúsult.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Jelszavak</translation>
</message>
@@ -1604,7 +2077,7 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Replace references to entry?</source>
- <translation>Lecseréli a bejegyzésre mutató hivatkozásokat?</translation>
+ <translation>Lecserélhető a bejegyzésre való hivatkozás?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
@@ -1616,11 +2089,11 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation>Áthelyezi a csoportot a kukába?</translation>
+ <translation>Legyen a csoport áthelyezve a kukába?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation>Valóban áthelyezi a(z) „%1” csoportok a kukába?</translation>
+ <translation>Valóban legyen a(z) „%1” csoport áthelyezve a kukába?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
@@ -1634,6 +2107,14 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Shared group...</source>
<translation>Megosztott csoport…</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Az adatbázis kiírása sikertelen: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Az adatbázis csak olvasható módban lett megnyitva. Az automatikus mentés le van tiltva.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1753,6 +2234,18 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Confirm Removal</source>
<translation>Törlés jóváhagyása</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Böngészőintegráció</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Valóban eltávolítja ezt az URL?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1786,12 +2279,48 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Foreground Color:</source>
- <translation>Előtérszín</translation>
+ <translation>Előtérszín:</translation>
</message>
<message>
<source>Background Color:</source>
<translation>Háttérszín:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Attribútumválasztó</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Attribútum érték</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Új attribútum hozzáadása</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Kijelölt attribútum törlése</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Attribútumnév szerkesztése</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Attribútumvédelem átváltása</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Védett attribútum megjelenítése</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Előtérszínválasztás</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Háttérszínválasztás</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1827,6 +2356,77 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Use a specific sequence for this association:</source>
<translation>Adjon meg egy jellemző sorozatot ehhez a társításhoz:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Egyéni automatikus beírási sorrend</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Automatikus beírás súgó weboldalának megnyitása</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Létező ablaktársítások</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Új ablaktársítás hozzáadása</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Kijelölt ablaktársítás eltávolítása</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Csillaggal(*) mindent ki lehet jelölni</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Ablaktársítás címének beállítása</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Csillaggal mindent ki lehet jelölni</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Egyéni automatikus beírási sorrend ehhez az ablakhoz</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Ezek a beállítások befolyásolják a bejegyzés viselkedését a böngésző kiterjesztésével.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Általános</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Automatikus küldés kihagyása ennél a bejegyzésnél</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Bejegyzés elrejtése a böngésző kiterjesztés elől</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>További URL-ek</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Hozzáadás</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Eltávolítás</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Szerkesztés</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1846,6 +2446,26 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Delete all</source>
<translation>Összes törlése</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Előzmény-bejegyzés kijelölése</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Bejegyzés és kijelölt előzményállapot megjelenítése</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Bejegyzés visszaállítása a kijelölt előzményállapotra</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Kijelölt előzményállapot törlése</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Minden előzmény törlése</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1885,6 +2505,62 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Expires</source>
<translation>Lejárat</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>URL mező</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>URL faviconjának letöltése</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Jelszómező ismétlése</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Jelszógenerátor átváltása</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Jelszó mező</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Jelszó láthatóságának átváltása</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Jegyzetek láthatóságának átváltása</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Lejárati mező</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Lejárati előbeállítások</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Lejárati előbeállítások</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Jegyzetek mező</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Cím mező</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Felhasználónév mező</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Lejárat átváltása</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1961,6 +2637,22 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Require user confirmation when this key is used</source>
<translation>Felhasználói megerősítés szükséges a kulcs alkalmazásakor</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Kulcs eltávolítása az ügynöktől a megadott másodperc után</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Kulcsfájl böngészése</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Külső kulcsfájl</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Mellékletfájl kijelölése</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1996,6 +2688,10 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Inherit from parent group (%1)</source>
<translation>Öröklés a szülőcsoporttól (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>A bejegyzésnek mentetlen változásai vannak</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2024,68 +2720,99 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<translation>Inaktív</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importálás útvonalról</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare aláíratlan tároló</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportálás útvonalra</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare aláírt tároló</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Útvonallal való szinkronizálás</translation>
+ <source>Select import source</source>
+ <translation>Importálási forrás kijelölése</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>A KeePassXC jelen verziója nem támogatja ennek a tárolótípusnak a megosztását. Javasolt ezen verzió alkalmazása: %1.</translation>
+ <source>Select export target</source>
+ <translation>Exportálási cél kijelölése</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Adatbázis-megosztás tiltva</translation>
+ <source>Select import/export file</source>
+ <translation>Importálási vagy exportálási fájl kijelölése</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Adatbázis export tiltva</translation>
+ <source>Clear</source>
+ <translation>Törlés</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Adatbázis import tiltva</translation>
+ <source>Import</source>
+ <translation>Importálás</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare aláíratlan tároló</translation>
+ <source>Export</source>
+ <translation>Exportálás</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare aláírt tároló</translation>
+ <source>Synchronize</source>
+ <translation>Szinkronizálás</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Importálási forrás kijelölése</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>A KeePassXC jelen verziója nem támogatja ennek a tárolótípusnak a megosztását.
+Támogatott kiterjesztések: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Exportálási cél kijelölése</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>Ez az adatbázis már exportálja: %1.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Importálási vagy exportálási fájl kijelölése</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>Ez az adatbázis már importálja: %1.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Törlés</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>Több csoport ebben adatbázisban már importálja és exportálja: %1.</translation>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>A KeeShare jelenleg le van tiltva. Az alkalmazás beállításai között az import, export szekcióban lehet engedélyezni.</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Az adatbázisok exportálása jelenleg le van tiltva az alkalmazás beállításaiban.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Az adatbázisok importálása jelenleg le van tiltva az alkalmazás beállításaiban.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Megosztási mód mező</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Megosztási fájl mező útvonala</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Megosztási fájl böngészése</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Jelszó mező</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>A(z) %1 exportálása konténerre már van hivatkozás.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Jelszó láthatóságának átváltása</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>A(z) %1 importálási konténer már be lett importálva.</translation>
+ <source>Toggle password generator</source>
+ <translation>Jelszógenerátor átváltása</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>A(z) %1 konténer importálva, és exportálás különböző csoportoknak.</translation>
+ <source>Clear fields</source>
+ <translation>Mezők törlése</translation>
</message>
</context>
<context>
@@ -2118,6 +2845,34 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>Set default Auto-Type se&amp;quence</source>
<translation>&amp;Egyéni automatikus beírási sorrend beállítása</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Névmező</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Jegyzetek mező</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Lejárat átváltása</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Automatikus beírás átváltó ehhez a csoporthoz és alcsoportjaihoz</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Lejárati mező</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Keresés átváltó ehhez a csoporthoz és alcsoportjaihoz</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Alapértelmezett automatikus beírási sorrend mező</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2154,22 +2909,10 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<translation>Minden fájl</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Az egyéni ikon már létezik</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Törlés megerősítése</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Egyéni ikon sikeresen letöltve</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Tipp: A DuckDuckGót tartalékként az Eszközök&gt;Beállítások&gt;Biztonság menüpontban engedélyezheti</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Kép kiválasztása</translation>
</message>
@@ -2193,6 +2936,42 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Ezt az ikont %n elem használja, és le lesz cserélve az alapértelmezett ikonra. Valóban törli?</numerusform><numerusform>Ezt az ikont %n elem használja, és le lesz cserélve az alapértelmezett ikonra. Valóban törli?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>A DuckDuckGo weboldal ikon szolgáltatást az Eszközök → Beállítások → Biztonság pontban lehet engedélyezni</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>URL faviconjának letöltése</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Kijelölt ikon alkalmazása az alcsoportokra és bejegyzésekre</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Ikon alkalmazása &amp;ehhez…</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Alkalmazás csak ehhez</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Alkalmazás az alcsoportokra is</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Alkalmazás az albejegyzésekre is</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Alkalmazás minden alegységre is</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Létező ikon kijelölve.</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2214,7 +2993,7 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Plugin Data</source>
- <translation>Beépülő adati</translation>
+ <translation>Bővítmény adati</translation>
</message>
<message>
<source>Remove</source>
@@ -2238,6 +3017,30 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<source>Value</source>
<translation>Érték</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Dátum és idő létrehozva</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Dátum és idő módosítva</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Hozzáférés történt a dátumhoz és időhöz</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Unique ID</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Bővítmény adatai</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Kijelölt bővítményadat eltávolítása</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2330,10 +3133,30 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>A fájl nem megnyitható:
-%1</numerusform><numerusform>A fájlok nem megnyithatóak:
+ <translation><numerusform>A fájl nem nyitható meg:
+%1</numerusform><numerusform>A fájlok nem nyithatóak meg:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Mellékletek</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Új melléklet hozzáadása</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Kijelölt melléklet eltávolítása</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Kijelölt melléklet megnyitása</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Kijelölt melléklet lemezre mentése</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2428,10 +3251,6 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>TOTP jelsor előállítása</translation>
- </message>
- <message>
<source>Close</source>
<translation>Bezárás</translation>
</message>
@@ -2516,6 +3335,14 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<source>Share</source>
<translation>Megosztás</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Aktuális TOTP-érték megjelenítése</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Speciális</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2549,11 +3376,33 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Kuka</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>%3 használta a(z) „%2” adatbázis bejegyzését: „%1”,</translation>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Nem sikerült regisztrálni a DBus-szolgáltatást, mivel egy másik szolgáltatás már fut: %1.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%1 használt %n bejegyzést</numerusform><numerusform>%1 használt %n bejegyzést</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo titkos szolgáltatás: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2572,6 +3421,59 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Faviconok letöltése</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Mégse</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Probléma van az ikonok letöltésével?
+A DuckDuckGo weboldal ikon szolgáltatást az alkalmazás beállításai között a biztonság szekcióban lehet engedélyezni</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Bezárás</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Állapot</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Türelem, a bejegyzéslista feldolgozás alatt áll…</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Letöltés…</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Már létezik</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Letöltés sikertelen</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Faviconok letöltése (%1/%2)…</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2593,10 +3495,6 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<translation>Nem lehet kiutalni a kihívás-választ.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Rossz kulcs vagy sérült adatbázisfájl.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>hiányzó adatbázis fejlécek</translation>
</message>
@@ -2616,6 +3514,12 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<source>Invalid header data length</source>
<translation>Érvénytelen fejlécadathossz</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Érvénytelenek a hitelesítési adatok, újra kell próbálkozni.
+Ha ez újból előfordul, lehet hogy az adatbázisfájl sérült.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2647,10 +3551,6 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<translation>Fejléc SHA256 eltérés</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Rossz kulcs vagy az adatbázisfájl sérült. (HMAC eltérés)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Ismeretlen titkosító</translation>
</message>
@@ -2750,6 +3650,16 @@ Ez a kijelölt bővítmény hibás működését eredményezheti.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Érvénytelen változattérkép mezőtípusméret</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Érvénytelenek a hitelesítési adatok, újra kell próbálkozni.
+Ha ez újból előfordul, lehet hogy az adatbázisfájl sérült.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC eltérés)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2972,13 +3882,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>KeePass1 adatbázis importálása</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Nem lehet megnyitni az adatbázist.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>KeePass1 adatbázis importálása</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3036,10 +3946,6 @@ Line %2, column %3</source>
<translation>Nem lehet kiszámítani a mesterkulcsot</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Rossz kulcs vagy sérült adatbázisfájl.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Kulcsátalakítás sikertelen</translation>
</message>
@@ -3135,40 +4041,58 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>nem lehet a tartalom pozíciójához lépni</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Érvénytelenek a hitelesítési adatok, újra kell próbálkozni.
+Ha ez újból előfordul, lehet hogy az adatbázisfájl sérült.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Letiltott megosztás</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Érvénytelen megosztási hivatkozás</translation>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation>Inaktív megosztás: %1</translation>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importálva innen: %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation>Exportálva ide: %1</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importálás innen</translation>
+ <source>Synchronized with %1</source>
+ <translation>Szinkronizálva ezzel: %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Exportálás ide</translation>
+ <source>Import is disabled in settings</source>
+ <translation>Importálás letiltva a beállításokban</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Szinkronizálás ezzel</translation>
+ <source>Export is disabled in settings</source>
+ <translation>Exportálás letiltva a beállításokban</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>%1 megosztás letiltva</translation>
+ <source>Inactive share</source>
+ <translation>Inaktív megosztás</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importálás a(z) %1 megosztásból</translation>
+ <source>Imported from</source>
+ <translation>Importálva innen</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportálás a(z) %1 megosztásba</translation>
+ <source>Exported to</source>
+ <translation>Exportálva ide</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Szinkronizálás a(z) %1 megosztásssal</translation>
+ <source>Synchronized with</source>
+ <translation>Szinkronizálva ezzel</translation>
</message>
</context>
<context>
@@ -3213,10 +4137,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Tallózás</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Előállítás</translation>
</message>
@@ -3271,6 +4191,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>Kulcsfájl kiválasztása</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Kulcsfájl kijelölése</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Kulcsfájl böngészése</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Tallózás…</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Új kulcsfájl előállítása</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Megjegyzés: Nem szabad olyan fájlt használni, amely megváltozhat, mivel ez megakadályozza az adatbázis feloldását!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Érvénytelen kulcsfájl</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Nem lehet e jelenlegi adatbázist használnia saját kulcsfájljaként. Egy másik fájlt kell választani vagy egy kulcsfájlt előállítani.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Gyanús kulcsfájl</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3359,10 +4316,6 @@ Message: %2</source>
<translation>&amp;Beállítások</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Jelszógenerátor</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>Adatbázisok &amp;zárolása</translation>
</message>
@@ -3548,14 +4501,6 @@ Javasoljuk az AppImage alkalmazását, amely elérhető a letöltések oldalon.<
<translation>TOTP QR-kód megjelenítése…</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Frissítések keresése...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Bejegyzés megosztása</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>MEGJEGYZÉS: Ez egy előzetes kiadású KeePassXC verzió!
@@ -3563,15 +4508,83 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
</message>
<message>
<source>Check for updates on startup?</source>
- <translation>Keressen a program induláskor frissítéseket?</translation>
+ <translation>Keressen az alkalmazás induláskor frissítéseket?</translation>
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation>Valóban keressen a program induláskor frissítéseket?</translation>
+ <translation>Valóban keressen az alkalmazás induláskor frissítéseket?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
- <translation>A program menüjéből bármikor saját kezűleg is indítható a frissítések keresése.</translation>
+ <translation>Az alkalmazás menüjéből bármikor saját kezűleg is indítható a frissítések keresése.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Favicon letöltése</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>Felhasználói &amp;kézikönyv</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>PDF felhasználói kézikönyv megnyitása</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Gyorsbillentyűk</translation>
</message>
</context>
<context>
@@ -3632,6 +4645,14 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>Adding missing icon %1</source>
<translation>Hiányzó %1 ikon hozzáadása</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3702,6 +4723,72 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3801,6 +4888,17 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>A jelszavak nem egyeznek</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>A jelszavak eddig megegyeznek</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3826,6 +4924,22 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>Generate master password</source>
<translation>Mesterjelszó előállítása</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Jelszó mező</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Jelszó láthatóságának átváltása</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Jelszómező ismétlése</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Jelszógenerátor átváltása</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3855,22 +4969,10 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<translation>Karaktertípusok</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Nagybetűk</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Kisbetűk</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Számok</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Speciális karakterek</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Bővített ASCII</translation>
</message>
@@ -3951,18 +5053,10 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<translation>Speciális</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Nagybetűk A-tól F-ig</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Kisbetűk a-tól f-ig</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3995,18 +5089,10 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematika</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Kötőjelek</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4054,6 +5140,74 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>Regenerate</source>
<translation>Újra előállítás</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Előállított jelszó</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Nagybetűk</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Kisbetűk</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Speciális karakterek</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Matematikai szimbólumok</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Kötőjelek és perjelek</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Kizárt karakterek</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Hexadecimális jelszavak</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Jelszóhossz</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Jelszó újraelőállítása</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Jelszó másolása</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Jelszó elfogadása</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>kisbetű</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>NAGYBETŰ</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Cím</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Jelszó láthatóságának átváltása</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4061,12 +5215,9 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Kijelölés</translation>
+ <source>Statistics</source>
+ <translation>Statisztika</translation>
</message>
</context>
<context>
@@ -4103,6 +5254,10 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>Merge</source>
<translation>Egyesítés</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4195,10 +5350,6 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<translation>Jelszó előállítása a bejegyzés számára.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Előállított jelszó hossza.</translation>
- </message>
- <message>
<source>length</source>
<translation>hosszúság</translation>
</message>
@@ -4248,18 +5399,6 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<translation>A jelszó speciális elemzése.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Adatbázis tartalmának kibontása és kiírása.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Kibontandó adatbázis útvonala.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Jelszó beszúrása a feloldásához: %1</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4303,10 +5442,6 @@ Elérhető parancsok:
<translation>Két adatbázis egyesítése.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Az egyesítés céladatbázisának útvonala.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Az egyesítés forrásadatbázisának útvonala.</translation>
</message>
@@ -4383,10 +5518,6 @@ Elérhető parancsok:
<translation>Böngészőintegráció</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] kihívás-válasz – %2. foglalat – %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Lenyomás</translation>
</message>
@@ -4417,10 +5548,6 @@ Elérhető parancsok:
<translation>Véletlenszerű új jelmondat előállítása.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Érvénytelen jelszóhossz érték: %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Nem hozható létre bejegyzés a(z) %1 útvonallal.</translation>
</message>
@@ -4478,10 +5605,6 @@ Elérhető parancsok:
<translation>szám</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Érvénytelen jelszóhossz érték: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Nem található bejegyzés a(z) %1 útvonalon.</translation>
</message>
@@ -4606,26 +5729,6 @@ Elérhető parancsok:
<translation>A(z) %1 kulcsfájl betöltése sikertelen: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>A(z) %1 fájl nem létezik</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>A(z) %1 fájl nem nyitható meg.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Hiba az adatbázis olvasásakor:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Hiba az adatbázis feldolgozásakor:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Az előállított jelszó hossza</translation>
</message>
@@ -4638,10 +5741,6 @@ Elérhető parancsok:
<translation>Nagybetűs karakterek használata</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Számok használata.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Különleges karakterek használata</translation>
</message>
@@ -4786,10 +5885,6 @@ Elérhető parancsok:
<translation>Az adatbázis sikeresen létre lett hozva.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>A beírt jelszóval lesz titkosítva az adatbázis (Entert ütve üres marad):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>A(z) %1 KeyFile létrehozása sikertelen: %2</translation>
</message>
@@ -4798,10 +5893,6 @@ Elérhető parancsok:
<translation>A(z) %1 KeyFile betöltése sikertelen: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Egy bejegyzés eltávolítása az adatbázisból.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Az eltávolítandó bejegyzés útvonala.</translation>
</message>
@@ -4857,6 +5948,330 @@ Elérhető parancsok:
<source>Cannot create new group</source>
<translation>Nem hozható létre új csoport</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Verzió: %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Összeállítás típusa: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revízió: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Disztribúció: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operációs rendszer: %1
+CPU architektúra: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Automatikus beírás</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (aláírt és nem aláírt megosztás)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (csak aláírt megoszás)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (csak nem aláírt megosztás)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nincs</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Engedélyezett kiterjesztések:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Az adatbázis nem változott az összeolvasztási művelet során.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4920,7 +6335,7 @@ Elérhető parancsok:
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation>Az ügynök nem támogatja a korlátozott élettartamot (lásd a lehetőségek).</translation>
+ <translation>Az ügynök nem támogatja a korlátozott élettartamot (lásd a lehetőségeket).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
@@ -5011,6 +6426,93 @@ Elérhető parancsok:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Általános</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Csoport</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Ezek az alkalmazások kapcsolódnak jelenleg:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Alkalmazás</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Adatbázis-beállítások</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Adatbázis feloldása</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Adatbázis zárolása</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nincs</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5133,9 +6635,100 @@ Elérhető parancsok:
<source>Signer:</source>
<translation>Aláíró:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Kulcs</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Az aláírt tárolók felülírása nem támogatott – az exportálás megakadályozva</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Nem írható az exportálási tároló (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Az aláírás nem ágyazható be: A fájl nem nyitható meg írásra (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Az aláírás nem ágyazható be: A fájl nem írható (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Az adatbázis nem ágyazható be: A fájl nem nyitható meg írásra (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Az adatbázis nem ágyazható be: A fájl nem írható (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>A nem aláírt tárolók felülírása nem támogatott – az exportálás megakadályozva</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Az exportálási tároló nem írható</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Váratlan exportálás hiba történt</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importálás a tárolóból aláírás nélkül</translation>
@@ -5149,6 +6742,10 @@ Elérhető parancsok:
<translation>Importálás a tárolóból aláírással</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Megbízhatónak minősíthető a(z) %1, melynek ujjlenyomata %2 / %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Most nem</translation>
</message>
@@ -5165,18 +6762,6 @@ Elérhető parancsok:
<translation>Csak most</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>%1 importálása sikeretlen (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>%1 importálása sikeres (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importálva innen: %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Az aláírt tárolók nem támogatottak – az importálás megakadályozva</translation>
</message>
@@ -5216,25 +6801,20 @@ Elérhető parancsok:
<source>Unknown share container type</source>
<translation>Ismeretlen megosztási tárolótípus</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Az aláírt tárolók felülírása nem támogatott – az exportálás megakadályozva</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Nem írható az exportálási tároló (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>A nem aláírt tárolók felülírása nem támogatott – az exportálás megakadályozva</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>%1 importálása sikeretlen (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Az exportálási tároló nem írható</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>%1 importálása sikeres (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Váratlan exportálás hiba történt</translation>
+ <source>Imported from %1</source>
+ <translation>Importálva innen: %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5249,10 +6829,6 @@ Elérhető parancsok:
<translation>Exportálás: %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Megbízhatónak minősíthető a(z) %1, melynek ujjlenyomata %2 / %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Több importálási forrásútvonal ehhez: %1, itt: %2</translation>
</message>
@@ -5260,22 +6836,6 @@ Elérhető parancsok:
<source>Conflicting export target path %1 in %2</source>
<translation>Ütköző %1 exportálási célútvonal itt: %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Az aláírás nem ágyazható be: A fájl nem nyitható meg írásra (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Az aláírás nem ágyazható be: A fájl nem írható (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Az adatbázis nem ágyazható be: A fájl nem nyitható meg írásra (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Az adatbázis nem ágyazható be: A fájl nem írható (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5323,10 +6883,6 @@ Elérhető parancsok:
<translation>TOTP beállítása</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Kulcs:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Alapértelmezett RFC 6238-jelsor beállítás</translation>
</message>
@@ -5356,16 +6912,45 @@ Elérhető parancsok:
<translation>Kódméret:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6-számjegyű</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritmus:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7-számjegyű</translation>
+ <source> digits</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8-számjegyű</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5449,6 +7034,14 @@ Elérhető parancsok:
<source>Welcome to KeePassXC %1</source>
<translation>Üdvözöljük a KeePassXC %1 verzióban!</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5472,5 +7065,13 @@ Elérhető parancsok:
<source>No YubiKey inserted.</source>
<translation>Nincs YubiKey behelyezve.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Hardveres jelsorok frissítése</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardverkulcsfoglalat kijelölése</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_id.ts b/share/translations/keepassx_id.ts
index 555aa987c..21075238d 100644
--- a/share/translations/keepassx_id.ts
+++ b/share/translations/keepassx_id.ts
@@ -54,7 +54,7 @@
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
- <translation type="unfinished"/>
+ <translation>Gunakan OpenSSH untuk Windows dari pada Pageant</translation>
</message>
</context>
<context>
@@ -77,22 +77,30 @@
</message>
<message>
<source>Icon only</source>
- <translation type="unfinished"/>
+ <translation>Hanya ikon</translation>
</message>
<message>
<source>Text only</source>
- <translation type="unfinished"/>
+ <translation>Hanya teks</translation>
</message>
<message>
<source>Text beside icon</source>
- <translation type="unfinished"/>
+ <translation>Teks disebelah ikon</translation>
</message>
<message>
<source>Text under icon</source>
- <translation type="unfinished"/>
+ <translation>Teks di bawah ikon</translation>
</message>
<message>
<source>Follow style</source>
+ <translation>Ikuti gaya</translation>
+ </message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -111,18 +119,6 @@
<translation>Hanya mulai satu aplikasi KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Ingat basis data terakhir</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Ingat berkas kunci dan dongle keamanan terakhir</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Muat basis data sebelumnya saat mulai</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimalkan jendela saat memulai aplikasi</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Gunakan ikon grup pada pembuatan entri</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimalkan ketika menyalin ke papan klip</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Sembunyikan panel pratinjau entri</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Sembunyikan jendela ke baki sistem ketika diminimalkan</translation>
</message>
<message>
- <source>Language</source>
- <translation>Bahasa</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Ketik-Otomatis</translation>
</message>
@@ -220,7 +208,7 @@
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation type="unfinished"/>
+ <translation>Tundaan pengetikan Ketik-Otomatis</translation>
</message>
<message>
<source> ms</source>
@@ -229,22 +217,103 @@
</message>
<message>
<source>Auto-Type start delay</source>
+ <translation>Tundaan mulai Ketik-Otomatis</translation>
+ </message>
+ <message>
+ <source>Movable toolbar</source>
+ <translation>Bilah perkakas dapat dipindah</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates at application startup</source>
+ <source>Load previously open databases on startup</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
+ <source>Remember database key files and security dongles</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>det</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
+ <source>Auto-type start delay milliseconds</source>
<translation type="unfinished"/>
</message>
</context>
@@ -273,7 +342,7 @@
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation type="unfinished"/>
+ <translation>Lupakan TouchID setelah tidak aktif selama</translation>
</message>
<message>
<source>Convenience</source>
@@ -285,7 +354,7 @@
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation type="unfinished"/>
+ <translation>Lupakan TouchID ketika sesi dikunci atau lid ditutup</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@@ -320,8 +389,29 @@
<translation>Privasi</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Gunakan DuckDuckGo sebagai cadangan untuk mengunduh ikon website</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Salin &amp;nama pengguna</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Salin &amp;sandi</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Pilih entri untuk Ketik-Otomatis:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Cari...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 telah meminta akses sandi untuk item berikut.
Silakan pilih apakah Anda ingin mengizinkannya.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -442,7 +555,8 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
- <translation type="unfinished"/>
+ <translation>Ada beberapa basis data yang terbuka.
+Silakan pilih basis data yang digunakan untuk menyimpan kredensial.</translation>
</message>
</context>
<context>
@@ -456,10 +570,6 @@ Please select the correct database for saving credentials.</source>
<translation>Ini dibutuhkan untuk mengakses basis data Anda menggunakan KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Aktifkan integrasi peramban KeePassXC</translation>
- </message>
- <message>
<source>General</source>
<translation>Umum</translation>
</message>
@@ -533,10 +643,6 @@ Please select the correct database for saving credentials.</source>
<translation>Jangan pernah bertanya sebelum memper&amp;barui kredensial</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Hanya basis data terpilih yang harus terkoneksi dengan klien.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Cari kredensial yang cocok di semua basis data yang terbuka</translation>
@@ -592,12 +698,8 @@ Please select the correct database for saving credentials.</source>
<translation>Peramban &amp;Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Executable Files</source>
- <translation type="unfinished"/>
+ <translation>Berkas Executable</translation>
</message>
<message>
<source>All Files</source>
@@ -606,11 +708,11 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation type="unfinished"/>
+ <translation>Jangan minta izin untuk HTTP &amp;Basic Auth</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation type="unfinished"/>
+ <translation>Karena adanya sandbox Snap, anda harus menjalankan skrip untuk mengaktifkan integrasi peramban.&lt;br /&gt;Anda bisa mendapatkan skrip ini dari %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
@@ -618,6 +720,50 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
+ <translation>Memerlukan KeePassXC-Browser agar integrasi peramban bisa bekerja. &lt;br /&gt;Unduh %1 dan %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -669,12 +815,13 @@ Apakah Anda ingin menimpanya ulang?</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Konversi atribut KeePassHTTP</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>Berhasil mengonversi atribut dari %1 entri.
+Memindahkan %2 ke data khusus.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
@@ -682,31 +829,39 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Tidak ada entri dengan atribut KeePassHTTP yang ditemukan!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation type="unfinished"/>
+ <translation>Basis data yang aktif tidak berisi entri dengan atribut KeePassHTTP.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Mendeteksi pengaturan integrasi peramban lama</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Buat grup baru</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation type="unfinished"/>
+ <translation>Permintaan untuk membuat grup &quot;%1&quot; telah diterima.
+Apakah anda ingin membuat grup ini?
+</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation type="unfinished"/>
+ <translation>Pengaturan KeePassXC-Browser anda perlu dipindahkan ke dalam pengaturan basis data.
+Hal ini diperlukan untuk mempertahankan koneksi peramban anda saat ini.
+Apakah anda ingin memindahkan pengaturan yang ada sekarang?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Jangan tampilkan peringatan ini lagi</translation>
</message>
</context>
<context>
@@ -767,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Rekam pertama memiliki nama ruas</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Jumlah baris tajuk untuk dibuang</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Anggap &apos;\&apos; sebagai karakter escape</translation>
</message>
@@ -800,7 +951,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Empty fieldname %1</source>
- <translation type="unfinished"/>
+ <translation>Ruas nama %1 kosong</translation>
</message>
<message>
<source>column %1</source>
@@ -808,7 +959,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation type="unfinished"/>
+ <translation>Mendeteksi kesalahan di dalam berkas CSV!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
@@ -819,12 +970,28 @@ Would you like to migrate your existing settings now?</source>
%1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n kolom</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -833,11 +1000,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n baris</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -860,17 +1027,34 @@ Would you like to migrate your existing settings now?</source>
<translation>Terjadi kesalahan saat membaca basis data: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
+ <source>File cannot be written as it is opened in read-only mode.</source>
+ <translation>Berkas tidak bisa disimpan karena terbuka dalam mode baca-saja.</translation>
+ </message>
+ <message>
+ <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File cannot be written as it is opened in read-only mode.</source>
+ <source>Could not save, database does not point to a valid file.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <source>Could not save, database file is read-only.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Tong Sampah</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -882,30 +1066,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Masukkan kunci utama</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Berkas Kunci:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Sandi:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Telusuri</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Segarkan</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Format berkas kunci legacy</translation>
</message>
@@ -936,20 +1104,96 @@ Harap pertimbangkan membuat berkas kunci baru.</translation>
<translation>Pilih berkas kunci</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID untuk membuka kunci cepat</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Tidak bisa membuka basis data:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Tidak bisa membuka berkas kunci:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Telusuri...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Bersihkan</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -998,11 +1242,11 @@ Harap pertimbangkan membuat berkas kunci baru.</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Lu&amp;pakan semua pengaturan spesifik situs pada entri</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation type="unfinished"/>
+ <translation>Pindahkan atribut KeePassHTTP ke data &amp;khusus KeePassXC-Browser</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1019,7 +1263,8 @@ Harap pertimbangkan membuat berkas kunci baru.</translation>
<message>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Apakah anda ingin menghapus kunci yang dipilih?
+Hal ini mungkin dapat mencegah koneksi ke plugin peramban.</translation>
</message>
<message>
<source>Key</source>
@@ -1040,7 +1285,8 @@ This may prevent connection to the browser plugin.</source>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Apakah anda ingin memutus koneksi semua peramban?
+Tindakan ini akan memutus koneksi ke plugin peramban.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
@@ -1048,7 +1294,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>TIdak ada kunci enkripsi bersama yang ditemukan di dalam pengaturan KeePassXC.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
@@ -1056,16 +1302,17 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Berhasil membuang %n kunci enkripsi dari pengaturan KeePassXC.</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Lupakan semua pengaturan spesifik situs pada entri</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation type="unfinished"/>
+ <translation>Apakah anda ingin melupakan semua pengaturan spesifik situs pada semua entri?
+Izin untuk mengakses entri akan dicabut.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
@@ -1081,7 +1328,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Berhasil membuang perizinan dari %n entri.</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1098,6 +1345,15 @@ Permissions to access entries will be revoked.</source>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
+ <translation>Apakah anda ingin memindahkan semua data integrasi peramban lama ke standar baru?
+Hal ini diperlukan untuk mempertahankan kompatibilitas dengan plugin peramban.</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1121,7 +1377,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Transform rounds:</source>
- <translation type="unfinished"/>
+ <translation>Jumlah transformasi:</translation>
</message>
<message>
<source>Benchmark 1-second delay</source>
@@ -1157,7 +1413,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>Nilai yang lebih tinggi memberikan perlindungan lebih, tetapi membuka basis data akan menjadi lebih lama.</translation>
</message>
<message>
<source>Database format:</source>
@@ -1183,13 +1439,15 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<message>
<source>Number of rounds too high</source>
<comment>Key transformation rounds</comment>
- <translation type="unfinished"/>
+ <translation>Nilai transformasi terlalu tinggi</translation>
</message>
<message>
<source>You are using a very high number of key transform rounds with Argon2.
If you keep this number, your database may take hours or days (or even longer) to open!</source>
- <translation type="unfinished"/>
+ <translation>Jumlah transformasi kunci yang anda gunakan dengan Argon2 terlalu tinggi.
+
+Jika anda tetap mempertahankan jumlah setinggi ini, basis data mungkin akan membutuhkan waktu berjam-jam atau bahkan berhari-hari untuk bisa dibuka!</translation>
</message>
<message>
<source>Understood, keep number</source>
@@ -1202,13 +1460,15 @@ If you keep this number, your database may take hours or days (or even longer) t
<message>
<source>Number of rounds too low</source>
<comment>Key transformation rounds</comment>
- <translation type="unfinished"/>
+ <translation>Jumlah transformasi terlalu rendah</translation>
</message>
<message>
<source>You are using a very low number of key transform rounds with AES-KDF.
If you keep this number, your database may be too easy to crack!</source>
- <translation type="unfinished"/>
+ <translation>Jumlah transformasi kunci yang anda gunakan dengan AES-KDF terlalu rendah.
+
+Jika anda tetap mempertahankan jumlah serendah ini, basis data anda mungkin akan menjadi terlalu mudah untuk di retas!</translation>
</message>
<message>
<source>KDF unchanged</source>
@@ -1221,7 +1481,7 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
@@ -1231,12 +1491,63 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation><numerusform>%1 md</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 d</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1285,12 +1596,45 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>Aktifkan &amp;kompresi (direkomendasikan)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
<message>
<source>Sharing</source>
- <translation type="unfinished"/>
+ <translation>Berbagi</translation>
</message>
<message>
<source>Breadcrumb</source>
@@ -1298,11 +1642,11 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Type</source>
- <translation type="unfinished"/>
+ <translation>Tipe</translation>
</message>
<message>
<source>Path</source>
- <translation type="unfinished"/>
+ <translation>Jalur</translation>
</message>
<message>
<source>Last Signer</source>
@@ -1310,12 +1654,12 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Certificates</source>
- <translation type="unfinished"/>
+ <translation>Sertifikat</translation>
</message>
<message>
<source> &gt; </source>
<comment>Breadcrumb separator</comment>
- <translation type="unfinished"/>
+ <translation> &gt; </translation>
</message>
</context>
<context>
@@ -1326,21 +1670,23 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>No encryption key added</source>
- <translation type="unfinished"/>
+ <translation>Tidak ada kunci enkripsi yang ditambahkan</translation>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation type="unfinished"/>
+ <translation>Anda harus menambahkan paling tidak satu kunci enkripsi untuk mengamankan basis data anda!</translation>
</message>
<message>
<source>No password set</source>
- <translation type="unfinished"/>
+ <translation>Sandi belum di atur</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation type="unfinished"/>
+ <translation>PERINGATAN! Anda belum mengatur sandi. Menggunakan basis data tanpa sandi amat sangat tidak disarankan!
+
+Apakah anda tetap ingin melanjutkan tanpa mengatur sandi?</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1350,6 +1696,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>Gagal mengubah kunci master</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1361,6 +1711,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Deskripsi:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nama</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Nilai</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1402,16 +1875,13 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Database creation error</source>
- <translation type="unfinished"/>
+ <translation>Kesalahan dalam membuat basis data</translation>
</message>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
+ <translation>Basis data yang dibuat tidak memiliki kunci atau KDF, aplikasi tidak bisa menyompannya.
+Masalah ini jelas sebuah bug, silakan laporkan ke pengembang.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1436,6 +1906,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [Hanya-baca]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1453,7 +1947,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Apakah Anda benar-benar ingin memindahkan %n entri ke keranjang sampah?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1519,15 +2013,11 @@ Apakah Anda ingin menggabungkan ubahan Anda?</translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Hapus entri?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Pindahkan entri ke keranjang sampah?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Berkas terbuka dalam mode baca-saja.</translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1535,7 +2025,7 @@ Apakah Anda ingin menggabungkan ubahan Anda?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>Anda sedang menyunting entri. Abaikan ubahan dan tetap mengunci?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1556,7 +2046,8 @@ Simpan perubahan?</translation>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa membuka berkas basis data baru saat mencoba untuk memuat ulang.
+Galat: %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
@@ -1569,11 +2060,6 @@ Disable safe saves and try again?</source>
Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Passwords</source>
<translation>Sandi</translation>
</message>
@@ -1587,7 +2073,7 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>Ganti referensi ke entri?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
@@ -1599,22 +2085,30 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Pindahkan grup ke keranjang sampah?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Apakah anda ingin memindahkan grup &quot;%1&quot; ke keranjang sampah?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation type="unfinished"/>
+ <translation>Berhasil menggabungkan berkas basis data.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation type="unfinished"/>
+ <translation>Basis data tidak diubah oleh proses penggabungan.</translation>
</message>
<message>
<source>Shared group...</source>
+ <translation>Grup bersama...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Gagal menyimpan basis data: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1698,11 +2192,11 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n minggu</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n bulan</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1730,10 +2224,22 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n tahun</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
+ <translation>Konfirmasi Penghapusan</translation>
+ </message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integrasi Peramban</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1775,6 +2281,42 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>Background Color:</source>
<translation>Warna Latar Belakang:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1808,10 +2350,81 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>Use a specific sequence for this association:</source>
+ <translation>Gunakan sekuens spesifik untuk asosiasi ini:</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
<translation type="unfinished"/>
</message>
</context>
<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Umum</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Tambah</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Buang</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Sunting</translation>
+ </message>
+</context>
+<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
@@ -1829,6 +2442,26 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>Delete all</source>
<translation>Hapus semua</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1868,6 +2501,62 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>Expires</source>
<translation>Kedaluwarsa</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1944,6 +2633,22 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Membutuhkan konfirmasi pengguna saat kunci ini digunakan</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1979,6 +2684,10 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Mengikuti grup induk (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Entri memiliki perubahan yang belum disimpan</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -1988,15 +2697,15 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>Type:</source>
- <translation type="unfinished"/>
+ <translation>Tipe:</translation>
</message>
<message>
<source>Path:</source>
- <translation type="unfinished"/>
+ <translation>Jalur:</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"/>
+ <translation>...</translation>
</message>
<message>
<source>Password:</source>
@@ -2004,70 +2713,100 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>Inactive</source>
+ <translation>Tidak aktif</translation>
+ </message>
+ <message>
+ <source>KeeShare unsigned container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from path</source>
+ <source>KeeShare signed container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to path</source>
+ <source>Select import source</source>
+ <translation>Pilih sumber impor</translation>
+ </message>
+ <message>
+ <source>Select export target</source>
+ <translation>Pilih target ekspor</translation>
+ </message>
+ <message>
+ <source>Select import/export file</source>
+ <translation>Pilih berkas impor/ekspor</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Bersihkan</translation>
+ </message>
+ <message>
+ <source>Import</source>
+ <translation>Impor</translation>
+ </message>
+ <message>
+ <source>Export</source>
+ <translation>Ekspor</translation>
+ </message>
+ <message>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
+ <source>%1 is already being imported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
+ <source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database import is disabled</source>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>Database export is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
+ <source>Sharing mode field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
+ <source>Path to share file field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
+ <source>Browser for share file</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Bersihkan</translation>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2101,6 +2840,34 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Tetapkan uru&amp;tan baku Ketik-Otomatis</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2137,36 +2904,24 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<translation>Semua Berkas</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Ikon khusus sudah ada</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Konfirmasi Hapus</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Ikon khusus berhasil diunduh</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Pilih Gambar</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Berhasil memuat %1 dari %n ikon</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation type="unfinished"/>
+ <translation>Tidak ada ikon yang dimuat</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n ikon sudah ada didalam basis data</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
@@ -2176,6 +2931,42 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2221,6 +3012,30 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
<source>Value</source>
<translation>Nilai</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2268,7 +3083,7 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Apakah Anda yakin ingin membuang %n lampiran?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2308,13 +3123,33 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
</message>
<message>
<source>Confirm remove</source>
- <translation type="unfinished"/>
+ <translation>Konfirmasi buang</translation>
</message>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Lampiran</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2409,10 +3244,6 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Buat Token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Tutup</translation>
</message>
@@ -2495,8 +3326,16 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
</message>
<message>
<source>Share</source>
+ <translation>Bagikan</translation>
+ </message>
+ <message>
+ <source>Display current TOTP value</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Advanced</source>
+ <translation>Tingkat Lanjut</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2530,11 +3369,33 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Tong Sampah</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2553,6 +3414,58 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Batal</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Tutup</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2574,10 +3487,6 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
<translation type="unfinished"/>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Kunci salah atau berkas basis data rusak.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>kehilangan tajuk basis data</translation>
</message>
@@ -2597,6 +3506,11 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
<source>Invalid header data length</source>
<translation>Panjang data tajuk tidak valid</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2628,10 +3542,6 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
<translation>Tajuk SHA256 tidak cocok</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Kunci salah atau berkas basis data rusak. (HMAC tidak cocok)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Cipher tidak dikenal</translation>
</message>
@@ -2731,6 +3641,15 @@ Ini mungkin akan menyebabkan plugin terkait tidak berfungsi.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Ukuran tipe entri map variasi tidak valid</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2819,7 +3738,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp
</message>
<message>
<source>Failed to read database file.</source>
- <translation type="unfinished"/>
+ <translation>Gagal membaca berkas basis data.</translation>
</message>
</context>
<context>
@@ -2953,13 +3872,13 @@ Baris %2, kolom %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Impor basis data KeePass1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Tidak bisa membuka basis data.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3017,10 +3936,6 @@ Baris %2, kolom %3</translation>
<translation>Tidak bisa mengkalkulasi kunci utama</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Kunci salah atau berkas basis data rusak.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Transformasi kunci gagal</translation>
</message>
@@ -3116,39 +4031,56 @@ Baris %2, kolom %3</translation>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
+ <source>Inactive share %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
+ <source>Imported from %1</source>
+ <translation>Diimpor dari %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
+ <source>Export is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
+ <source>Inactive share</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Imported from</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Exported to</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3156,11 +4088,11 @@ Baris %2, kolom %3</translation>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation type="unfinished"/>
+ <translation>Komponen Kunci</translation>
</message>
<message>
<source>Key Component Description</source>
- <translation type="unfinished"/>
+ <translation>Deskripsi Komponen Kunci</translation>
</message>
<message>
<source>Cancel</source>
@@ -3168,7 +4100,7 @@ Baris %2, kolom %3</translation>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation type="unfinished"/>
+ <translation>Komponen Kunci sudah diatur, klik untuk mengubah atau buang</translation>
</message>
<message>
<source>Add %1</source>
@@ -3188,16 +4120,12 @@ Baris %2, kolom %3</translation>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>%1 telah diatur, klik untuk mengganti atau menghapus</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Telusuri</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Buat</translation>
</message>
@@ -3207,7 +4135,7 @@ Baris %2, kolom %3</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Anda bisa menambahkan berkas kunci yang berisi byte acak untuk jaminan keamanan lebih.&lt;/p&gt;&lt;p&gt;Anda harus menjaga kerahasiannya dan jangan pernah menghilangkannya atau anda akan terkunci dan dicekal selamanya!&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
@@ -3218,7 +4146,10 @@ Baris %2, kolom %3</translation>
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Anda menggunakan format berkas kunci lama yang mungkin
+tidak akan lagi didukung di masa depan.
+
+Kunjungi pengaturan kunci utama dan buat berkas kunci baru.</translation>
</message>
<message>
<source>Error loading the key file '%1'
@@ -3250,6 +4181,43 @@ Pesan: %2</translation>
<source>Select a key file</source>
<translation>Pilih berkas kunci</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Telusuri...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3338,10 +4306,6 @@ Pesan: %2</translation>
<translation>&amp;Pengaturan</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Pembuat Sandi</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Kunci basis data</translation>
</message>
@@ -3452,7 +4416,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Gabung dari basis data...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
@@ -3527,28 +4491,90 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation>Tampilkan Kode QR TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <translation>CATATAN: Anda menggunakan versi pra-rilis KeePassXC!
+
+Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaan harian.</translation>
+ </message>
+ <message>
+ <source>Check for updates on startup?</source>
+ <translation>Periksa pembaruan saat memulai?</translation>
+ </message>
+ <message>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
+ <translation>Apakah anda ingin KeePassXC memeriksa pembaruan setiap memulai aplikasi?</translation>
+ </message>
+ <message>
+ <source>You can always check for updates manually from the application menu.</source>
+ <translation>Anda selalu bisa memeriksa pembaruan secara manual dari menu aplikasi.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Share entry</source>
+ <source>&amp;Check for Updates...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Downlo&amp;ad all favicons</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>Sort &amp;A-Z</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>Sort &amp;Z-A</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Unduh favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3564,19 +4590,19 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Overwriting %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Menyimpan ulang %1 [%2]</translation>
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation type="unfinished"/>
+ <translation>entri lama yang digabung dari basis data &quot;%1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Menambahkan cadangan untuk target lama %1 [%2]</translation>
</message>
<message>
<source>Adding backup for older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Menambahkan cadangan untuk sumber lama %1 [%2]</translation>
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
@@ -3608,6 +4634,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Adding missing icon %1</source>
+ <translation>Menambahkan ikon %1 yang hilang</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3635,7 +4669,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Di sini anda bisa menyesuaikan pengaturan enkripsi basis data. Jangan khawatir, anda bisa mengubahnya lagi nanti di pengaturan basis data.</translation>
</message>
<message>
<source>Advanced Settings</source>
@@ -3654,7 +4688,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Di sini anda bisa menyesuaikan pengaturan enkripsi basis data. Jangan khawatir, anda bisa mengubahnya lagi nanti di pengaturan basis data.</translation>
</message>
</context>
<context>
@@ -3676,6 +4710,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
+ <translation>Silakan masukkan nama dan deskripsi opsional untuk basis data anda yang baru:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3779,6 +4879,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3804,6 +4915,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Buat sandi master</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3833,22 +4960,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Tipe Karakter</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Huruf Besar</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Huruf Kecil</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Angka</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Karakter Spesial</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>ASCII Lanjutan</translation>
</message>
@@ -3929,18 +5044,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Tingkat Lanjut</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Huruf Besar A sampai F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Huruf Kecil A sampai F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3973,18 +5080,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Tanda Hitung</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4032,18 +5131,83 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>Buat ulang</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Salin sandi</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
<message>
<source>KeeShare</source>
- <translation type="unfinished"/>
+ <translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4059,11 +5223,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation type="unfinished"/>
+ <translation>Pindah</translation>
</message>
<message>
<source>Empty</source>
- <translation type="unfinished"/>
+ <translation>Kosong</translation>
</message>
<message>
<source>Remove</source>
@@ -4071,7 +5235,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Skip</source>
- <translation type="unfinished"/>
+ <translation>Lewati</translation>
</message>
<message>
<source>Disable</source>
@@ -4079,6 +5243,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Merge</source>
+ <translation>Gabung</translation>
+ </message>
+ <message>
+ <source>Continue</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4173,10 +5341,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Buat sandi entri.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Panjang sandi yang akan dibuat.</translation>
- </message>
- <message>
<source>length</source>
<translation>panjang</translation>
</message>
@@ -4226,18 +5390,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Jalankan analisis tingkat lanjut pada sandi.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Ekstrak dan tampilkan isi basis data.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Jalur basis data untuk diekstrak.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Masukkan sandi untuk membuka %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4282,10 +5434,6 @@ Perintah yang tersedia:
<translation>Gabungkan dua basis data.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Jalur tujuan basis data untuk digabungkan.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Jalur sumber basis data untuk digabungkan.</translation>
</message>
@@ -4362,10 +5510,6 @@ Perintah yang tersedia:
<translation>Integrasi Peramban</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Press</source>
<translation>Tekan</translation>
</message>
@@ -4396,12 +5540,8 @@ Perintah yang tersedia:
<translation>Buat kata sandi baru secara acak.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa membuat entri dengan jalur %1.</translation>
</message>
<message>
<source>Enter password for new entry: </source>
@@ -4409,15 +5549,15 @@ Perintah yang tersedia:
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation type="unfinished"/>
+ <translation>Gagal menyimpan basis data %1.</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Berhasil menambahkan entri %1.</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Salin TOTP ke papan klip.</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
@@ -4425,7 +5565,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Entry %1 not found.</source>
- <translation type="unfinished"/>
+ <translation>Entri %1 tidak ditemukan.</translation>
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
@@ -4433,11 +5573,11 @@ Perintah yang tersedia:
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>TOTP entri telah disalin ke papan klip.</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>Sandi entri telah disalin ke papan klip!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
@@ -4445,7 +5585,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Clipboard cleared!</source>
- <translation type="unfinished"/>
+ <translation>Entri papan klip dihapus!</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
@@ -4457,12 +5597,8 @@ Perintah yang tersedia:
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa menemukan entri dengan jalur %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
@@ -4470,23 +5606,23 @@ Perintah yang tersedia:
</message>
<message>
<source>Enter new password for entry: </source>
- <translation type="unfinished"/>
+ <translation>Masukkan sandi baru untuk entri:</translation>
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Gagal menyimpan basis data: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Berhasil menyunting entri %1.</translation>
</message>
<message>
<source>Length %1</source>
- <translation type="unfinished"/>
+ <translation>Panjang %1</translation>
</message>
<message>
<source>Entropy %1</source>
- <translation type="unfinished"/>
+ <translation>Entropi %1</translation>
</message>
<message>
<source>Log10 %1</source>
@@ -4530,7 +5666,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Type: Date</source>
- <translation type="unfinished"/>
+ <translation>Tipe: Tanggal</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
@@ -4574,7 +5710,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Entropy %1 (%2)</source>
- <translation type="unfinished"/>
+ <translation>Entropi %1 (%2)</translation>
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
@@ -4582,86 +5718,65 @@ Perintah yang tersedia:
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation>Berkas %1 tidak ada.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Tidak bisa membuka berkas %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
+ <translation>Gagal memuat berkas kunci %1: %2</translation>
</message>
<message>
<source>Length of the generated password</source>
- <translation type="unfinished"/>
+ <translation>Panjang dari sandi yang dibuat</translation>
</message>
<message>
<source>Use lowercase characters</source>
- <translation type="unfinished"/>
+ <translation>Gunakan karakter huruf kecil</translation>
</message>
<message>
<source>Use uppercase characters</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
+ <translation>Gunakan karakter huruf besar</translation>
</message>
<message>
<source>Use special characters</source>
- <translation type="unfinished"/>
+ <translation>Gunakan karakter spesial</translation>
</message>
<message>
<source>Use extended ASCII</source>
- <translation type="unfinished"/>
+ <translation>Gunakan ASCII lanjutan</translation>
</message>
<message>
<source>Exclude character set</source>
- <translation type="unfinished"/>
+ <translation>Kecualikan karakter</translation>
</message>
<message>
<source>chars</source>
- <translation type="unfinished"/>
+ <translation>karakter</translation>
</message>
<message>
<source>Exclude similar looking characters</source>
- <translation type="unfinished"/>
+ <translation>Kecualikan karakter yang mirip</translation>
</message>
<message>
<source>Include characters from every selected group</source>
- <translation type="unfinished"/>
+ <translation>Sertakan karakter dari setiap grup yang dipilih</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
- <translation type="unfinished"/>
+ <translation>Tampilkan daftar semua elemen dari grup.</translation>
</message>
<message>
<source>Cannot find group %1.</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa menemukan grup %1.</translation>
</message>
<message>
<source>Error reading merge file:
%1</source>
- <translation type="unfinished"/>
+ <translation>Terjadi kesalahan saat menggabungkan berkas:
+%1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa menyimpan basis data ke berkas : %1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa menyimpan basis data ke berkas: %1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
@@ -4669,31 +5784,31 @@ Perintah yang tersedia:
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Berhasil menghapus entri %1.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
- <translation type="unfinished"/>
+ <translation>Tampilkan TOTP entri.</translation>
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
- <translation type="unfinished"/>
+ <translation>GALAT: atribut tidak diketahui %1.</translation>
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation type="unfinished"/>
+ <translation>Tidak ada program yang bisa digunakan untuk manipulasi papan klip</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation type="unfinished"/>
+ <translation>Tidak bisa memulai program %1</translation>
</message>
<message>
<source>file empty</source>
- <translation type="unfinished"/>
+ <translation>berkas kosong</translation>
</message>
<message>
<source>%1: (row, col) %2,%3</source>
- <translation type="unfinished"/>
+ <translation>%1: (baris, kolom) %2,%3</translation>
</message>
<message>
<source>AES: 256-bit</source>
@@ -4722,48 +5837,44 @@ Perintah yang tersedia:
<message>
<source>Invalid Settings</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>Pengaturan Tidak Valid</translation>
</message>
<message>
<source>Invalid Key</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>Kunci Tidak Valid</translation>
</message>
<message>
<source>Message encryption failed.</source>
- <translation type="unfinished"/>
+ <translation>Enkripsi pesan gagal.</translation>
</message>
<message>
<source>No groups found</source>
- <translation type="unfinished"/>
+ <translation>Tidak ada grup yang ditemukan</translation>
</message>
<message>
<source>Create a new database.</source>
- <translation type="unfinished"/>
+ <translation>Buat basis data baru.</translation>
</message>
<message>
<source>File %1 already exists.</source>
- <translation type="unfinished"/>
+ <translation>Berkas %1 sudah ada.</translation>
</message>
<message>
<source>Loading the key file failed</source>
- <translation type="unfinished"/>
+ <translation>Pemuatan berkas kunci gagal</translation>
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation type="unfinished"/>
+ <translation>Tidak ada kunci yang diatur. Membatalkan pembuatan basis data</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation type="unfinished"/>
+ <translation>Gagal menyimpan basis data: %1.</translation>
</message>
<message>
<source>Successfully created new database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
+ <translation>Berhasil membuat basis data baru.</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
@@ -4774,10 +5885,6 @@ Perintah yang tersedia:
<translation type="unfinished"/>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Buang sebuah entri dari basis data.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Jalur entri untuk dibuang.</translation>
</message>
@@ -4811,7 +5918,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Parent window handle</source>
- <translation type="unfinished"/>
+ <translation>Handel jendela induk</translation>
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
@@ -4831,6 +5938,330 @@ Perintah yang tersedia:
</message>
<message>
<source>Cannot create new group</source>
+ <translation>Tidak bisa membuat grup baru</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versi %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Tipe Build: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisi: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribusi: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistem operasi: %1
+Arsitektur CPU: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Ketik-Otomatis</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nihil</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Ekstensi aktif:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Basis data tidak ada perubahan yang diakibatkan oleh proses penggabungan.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4872,11 +6303,11 @@ Perintah yang tersedia:
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation type="unfinished"/>
+ <translation>Koneksi agen gagal.</translation>
</message>
<message>
<source>Agent protocol error.</source>
- <translation type="unfinished"/>
+ <translation>Galat protokol agen.</translation>
</message>
<message>
<source>No agent running, cannot add identity.</source>
@@ -4892,7 +6323,7 @@ Perintah yang tersedia:
</message>
<message>
<source>The key has already been added.</source>
- <translation type="unfinished"/>
+ <translation>Kunci sudah ditambahkan.</translation>
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
@@ -4907,11 +6338,11 @@ Perintah yang tersedia:
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Cari Bantuan</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>Kata pencarian seperti berikut ini: [modifiers][field:][&quot;]term[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
@@ -4923,7 +6354,7 @@ Perintah yang tersedia:
</message>
<message>
<source>exclude term from results</source>
- <translation type="unfinished"/>
+ <translation>kecualikan kata dari hasil pencarian</translation>
</message>
<message>
<source>match term exactly</source>
@@ -4955,7 +6386,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Examples</source>
- <translation type="unfinished"/>
+ <translation>Contoh</translation>
</message>
</context>
<context>
@@ -4974,12 +6405,12 @@ Perintah yang tersedia:
</message>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Cari Bantuan</translation>
</message>
<message>
<source>Search (%1)...</source>
<comment>Search placeholder text, %1 is the keyboard shortcut</comment>
- <translation type="unfinished"/>
+ <translation>Cari (%1)...</translation>
</message>
<message>
<source>Case sensitive</source>
@@ -4987,30 +6418,117 @@ Perintah yang tersedia:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Umum</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grup</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Pengaturan basis data</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Buka kunci basis data</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Kunci basis data</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nihil</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
- <translation type="unfinished"/>
+ <translation>Aktif</translation>
</message>
<message>
<source>Allow export</source>
- <translation type="unfinished"/>
+ <translation>Izinkan ekspor</translation>
</message>
<message>
<source>Allow import</source>
- <translation type="unfinished"/>
+ <translation>Izinkan impor</translation>
</message>
<message>
<source>Own certificate</source>
- <translation type="unfinished"/>
+ <translation>Sertifikat milik pribadi</translation>
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>Sidik Jari:</translation>
</message>
<message>
<source>Certificate:</source>
- <translation type="unfinished"/>
+ <translation>Sertifikat:</translation>
</message>
<message>
<source>Signer</source>
@@ -5030,19 +6548,19 @@ Perintah yang tersedia:
</message>
<message>
<source>Export</source>
- <translation type="unfinished"/>
+ <translation>Ekspor</translation>
</message>
<message>
<source>Imported certificates</source>
- <translation type="unfinished"/>
+ <translation>Sertifikat yang diimpor</translation>
</message>
<message>
<source>Trust</source>
- <translation type="unfinished"/>
+ <translation>Percaya</translation>
</message>
<message>
<source>Ask</source>
- <translation type="unfinished"/>
+ <translation>Tanya</translation>
</message>
<message>
<source>Untrust</source>
@@ -5054,11 +6572,11 @@ Perintah yang tersedia:
</message>
<message>
<source>Path</source>
- <translation type="unfinished"/>
+ <translation>Jalur</translation>
</message>
<message>
<source>Status</source>
- <translation type="unfinished"/>
+ <translation>Status</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -5066,19 +6584,19 @@ Perintah yang tersedia:
</message>
<message>
<source>Certificate</source>
- <translation type="unfinished"/>
+ <translation>Sertifikat</translation>
</message>
<message>
<source>Trusted</source>
- <translation type="unfinished"/>
+ <translation>Dipercaya</translation>
</message>
<message>
<source>Untrusted</source>
- <translation type="unfinished"/>
+ <translation>Tidak dipercaya</translation>
</message>
<message>
<source>Unknown</source>
- <translation type="unfinished"/>
+ <translation>Tidak diketahui</translation>
</message>
<message>
<source>key.share</source>
@@ -5087,7 +6605,7 @@ Perintah yang tersedia:
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>Berkas kunci KeeShare</translation>
</message>
<message>
<source>All files</source>
@@ -5095,11 +6613,11 @@ Perintah yang tersedia:
</message>
<message>
<source>Select path</source>
- <translation type="unfinished"/>
+ <translation>Pilih jalur</translation>
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>Mengekspor sertifikat yang diubah</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
@@ -5109,147 +6627,205 @@ Perintah yang tersedia:
<source>Signer:</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ShareObserver</name>
<message>
- <source>Import from container without signature</source>
+ <source>Allow KeeShare imports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Allow KeeShare exports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Only show warnings and errors</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
+ <source>Key</source>
+ <translation>Kunci</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Never</source>
- <translation>Tidak Pernah</translation>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Always</source>
+ <source>Import existing certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Just this time</source>
+ <source>Export own certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Known shares</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Trust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Imported from %1</source>
+ <source>Ask whether to trust the selected certificate every time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Signed share container are not supported - import prevented</source>
+ <source>Untrust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File is not readable</source>
+ <source>Remove selected certificate</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareExport</name>
<message>
- <source>Invalid sharing container</source>
+ <source>Overwriting signed share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Untrusted import prevented</source>
+ <source>Could not write export container (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful signed import</source>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unexpected error</source>
+ <source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unsigned share container are not supported - import prevented</source>
+ <source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful unsigned import</source>
+ <source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File does not exist</source>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unknown share container type</source>
+ <source>Could not write export container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
+ <source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
- <source>Could not write export container (%1)</source>
+ <source>Import from container without signature</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container</source>
+ <source>Import from container with certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unexpected export error occurred</source>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Apakah anda ingin mempercayai %1 dengan sidik jari %2 dari %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
+ <source>Not this time</source>
+ <translation>Tidak sekarang</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation>Tidak Pernah</translation>
+ </message>
+ <message>
+ <source>Always</source>
+ <translation>Selalu</translation>
+ </message>
+ <message>
+ <source>Just this time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1 failed (%2)</source>
+ <source>Signed share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
+ <source>File is not readable</source>
+ <translation>Berkas tidak bisa dibaca</translation>
+ </message>
+ <message>
+ <source>Invalid sharing container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to %1</source>
+ <source>Untrusted import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <source>Successful signed import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Multiple import source path to %1 in %2</source>
+ <source>Unexpected error</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Conflicting export target path %1 in %2</source>
+ <source>Unsigned share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
+ <source>Successful unsigned import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not write file (%1)</source>
+ <source>File does not exist</source>
+ <translation>Berkas tidak ada</translation>
+ </message>
+ <message>
+ <source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Could not embed database: Could not open file to write (%1)</source>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Impor dari %1 gagal (%2)</translation>
+ </message>
+ <message>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Impor dari %1 berhasil (%2)</translation>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Diimpor dari %1</translation>
+ </message>
+ <message>
+ <source>Export to %1 failed (%2)</source>
+ <translation>Ekspor ke %1 gagal (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1 successful (%2)</source>
+ <translation>Ekspor ke %1 berhasil (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1</source>
+ <translation>Ekspor ke %1</translation>
+ </message>
+ <message>
+ <source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed database: Could not write file (%1)</source>
+ <source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5281,15 +6857,15 @@ Perintah yang tersedia:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>CATATAN: Pengaturan TOTP ini sangat khusus dan mungkin tidak akan bekerja dengan otentikator lainnya.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation type="unfinished"/>
+ <translation>Ada kesalahan saat membuat kode QR.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation type="unfinished"/>
+ <translation>Akan ditutup dalam %1 detik.</translation>
</message>
</context>
<context>
@@ -5299,10 +6875,6 @@ Perintah yang tersedia:
<translation>Siapkan TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Kunci:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Pengaturan bawaan token RFC 6238</translation>
</message>
@@ -5316,7 +6888,7 @@ Perintah yang tersedia:
</message>
<message>
<source>Custom Settings</source>
- <translation type="unfinished"/>
+ <translation>Pengaturan Khusus</translation>
</message>
<message>
<source>Time step:</source>
@@ -5332,27 +6904,56 @@ Perintah yang tersedia:
<translation>Ukuran kode:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 angka</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritma:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source>Confirm Remove TOTP Settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 angka</translation>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation type="unfinished"/>
+ <translation>Memeriksa pembaruan</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation type="unfinished"/>
+ <translation>Memeriksa pembaruan...</translation>
</message>
<message>
<source>Close</source>
@@ -5360,39 +6961,39 @@ Perintah yang tersedia:
</message>
<message>
<source>Update Error!</source>
- <translation type="unfinished"/>
+ <translation>Pembaruan Gagal!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation type="unfinished"/>
+ <translation>Terjadi kesalahan saat mengambil informasi pembaruan.</translation>
</message>
<message>
<source>Please try again later.</source>
- <translation type="unfinished"/>
+ <translation>Silakan coba lagi nanti.</translation>
</message>
<message>
<source>Software Update</source>
- <translation type="unfinished"/>
+ <translation>Pembaruan Perangkat Lunak</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation type="unfinished"/>
+ <translation>Versi baru KeePassXC telah tersedia!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 telah tersedia — yang anda miliki %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation type="unfinished"/>
+ <translation>Unduh di keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation type="unfinished"/>
+ <translation>Sudah yang paling baru!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 saat ini adalah versi yang paling baru</translation>
</message>
</context>
<context>
@@ -5425,6 +7026,14 @@ Perintah yang tersedia:
<source>Welcome to KeePassXC %1</source>
<translation>Selamat datang di KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5448,5 +7057,13 @@ Perintah yang tersedia:
<source>No YubiKey inserted.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_it.ts b/share/translations/keepassx_it.ts
index b56e7c2bc..6c8b8c236 100644
--- a/share/translations/keepassx_it.ts
+++ b/share/translations/keepassx_it.ts
@@ -93,7 +93,15 @@
</message>
<message>
<source>Follow style</source>
- <translation type="unfinished"/>
+ <translation>Segui stile</translation>
+ </message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Ripristinare le impostazioni?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Sei sicuro di voler ripristinare tutte le impostazioni generali e di sicurezza predefinite?</translation>
</message>
</context>
<context>
@@ -111,18 +119,6 @@
<translation>Avvia una sola istanza di KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Ricorda ultimo database</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Ricorda gli ultimi file chiave e dongle di sicurezza</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Carica i database precedenti all&apos;avvio</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimizza la finestra all&apos;avvio della applicazione</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Usa icona del gruppo alla creazione di una voce</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimizza quando si copia negli appunti</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Nascondere il pannello di anteprima della voce</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Nascondi la finestra nell&apos;area di notifica di sistema quando viene minimizzata</translation>
</message>
<message>
- <source>Language</source>
- <translation>Lingua</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Completamento automatico</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Ritardo di avvio della compilazione automatica</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Cerca aggiornamenti all&apos;avvio dell&apos;applicazione</translation>
+ <source>Movable toolbar</source>
+ <translation>Barra degli strumenti spostabile</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Includi versioni preliminari nella ricerca degli aggiornamenti</translation>
+ <source>Remember previously used databases</source>
+ <translation>Ricordare i database usati in precedenza</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Barra degli strumenti spostabile</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Carica database aperti in precedenza all&apos;avvio</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation>Memorizzare i file di chiave del database e i dongle di sicurezza</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Verificare la disponibilità di aggiornamenti all&apos;avvio dell&apos;applicazione una volta alla settimana</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Includi versioni beta durante il controllo della disponibilità di aggiornamenti</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Stile pulsante:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Lingua:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(riavviare il programma per attivare)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Riduci a icona la finestra dopo lo sblocco del database</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Riduci a icona all&apos;apertura di un URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Nascondi la finestra durante la copia negli Appunti</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimizzare</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Stile dei pulsanti</translation>
+ <source>Drop to background</source>
+ <translation>Rilascia su sfondo</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Timeout scaricamento Favicon:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Timeout scaricamento icona sito Web in secondi</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sec</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Stile pulsante della barra degli strumenti</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Utilizzare il tipo di carattere monospazio per le note</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Selezione della lingua</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Ripristina impostazioni predefinite</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Scorciatoia globale di tipo automatico</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Ritardo in millisecondi di digitazione automatica dei caratteri</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Ritardo di avvio in millisecondi della digitazione automatica</translation>
</message>
</context>
<context>
@@ -273,7 +342,7 @@
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation type="unfinished"/>
+ <translation>Dimentica TouchID dopo inattività di</translation>
</message>
<message>
<source>Convenience</source>
@@ -285,7 +354,7 @@
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation type="unfinished"/>
+ <translation>Dimentica TouchID quando la sessione è bloccata o il coperchio è chiuso</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@@ -320,8 +389,29 @@
<translation>Riservatezza</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Usa DuckDuckGo come alternativa per scaricare le icone dal sito web</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Utilizzare il servizio DuckDuckGo per scaricare le icone del sito web</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Secondi per la cancellazione degli appunti</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Ripristino per inattività del Touch ID </translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Secondi di timeout per il blocco del database</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Cancella query di ricerca dopo</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copia &amp;nome utente</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copia &amp;password</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Seleziona una voce per il completamento automatico:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Ricerca...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -408,7 +513,7 @@
</message>
<message>
<source>Remember this decision</source>
- <translation>Ricorda questa decisione</translation>
+ <translation>Ricorda questa scelta</translation>
</message>
<message>
<source>Allow</source>
@@ -424,12 +529,20 @@ Please select whether you want to allow access.</source>
<translation>%1 ha richiesto accesso alle password per il seguente elemento/i.
Seleziona se vuoi consentire l&apos;accesso.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Consenti accesso</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Nega accesso</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
<message>
<source>KeePassXC-Browser Save Entry</source>
- <translation type="unfinished"/>
+ <translation>Voce di salvataggio del browser KeePassXC</translation>
</message>
<message>
<source>Ok</source>
@@ -457,10 +570,6 @@ Selezionare il database corretto dove salvare le credenziali</translation>
<translation>Questo è necessario per accedere al tuo database con KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Abilita l&apos;integrazione con i browser di KeepassXC</translation>
- </message>
- <message>
<source>General</source>
<translation>Generale</translation>
</message>
@@ -534,10 +643,6 @@ Selezionare il database corretto dove salvare le credenziali</translation>
<translation>Non &amp;chiedere conferma prima di &amp;aggiornare le credenziali</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Solo il database selezionato deve essere collegato con un client.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Cerca le credenziali corrispondenti in tutti i database aperti</translation>
@@ -593,10 +698,6 @@ Selezionare il database corretto dove salvare le credenziali</translation>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Executable Files</source>
<translation>File eseguibili</translation>
</message>
@@ -607,19 +708,63 @@ Selezionare il database corretto dove salvare le credenziali</translation>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation type="unfinished"/>
+ <translation>Non chiedere l&apos;autorizzazione per l&apos;autenticazione HTTP e basic</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation type="unfinished"/>
+ <translation>A causa del sandboxing di Snap, è necessario eseguire uno script per abilitare l&apos;integrazione del browser. &lt;br /&gt;È possibile ottenere questo script da %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation type="unfinished"/>
+ <translation>Si prega di consultare le istruzioni speciali per l&apos;uso dell&apos;estensione del browser di seguito</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC-Browser è necessario per far funzionare l&apos;integrazione del browser. &lt;br /&gt;Scaricarlo per %1 e %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Restituisce le credenziali scadute. La stringa [scaduto] viene aggiunta al titolo.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Consenti la restituzione delle credenziali scadute.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Abilitare l&apos;integrazione del browser</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>I browser installati come snap non sono attualmente supportati.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Tutti i database connessi all&apos;estensione restituiranno le credenziali corrispondenti.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Non visualizzare il popup che suggerisce la migrazione delle impostazioni KeePassHTTP legacy.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Non richiedere la migrazione delle impostazioni KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Campo percorso proxy personalizzato</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Browser per file proxy personalizzato</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Avvertenza&lt;/b&gt;, l&apos;applicazione keepassxc-proxy non è stata trovata!&lt;br /&gt;Si prega di controllare la directory di installazione di KeePassXC o confermare il percorso personalizzato nelle opzioni avanzate.&lt;br /&gt;L&apos;integrazione del browser NON funzionerà senza l&apos;applicazione proxy.&lt;br /&gt;Percorso previsto: %1</translation>
</message>
</context>
<context>
@@ -665,48 +810,57 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation type="unfinished"/>
+ <translation>Conversione di attributi in dati personalizzati in corso...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: attributi KeePassHTTP convertiti</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>Attributi convertiti correttamente da %1 voce(i).
+Sono stati spostati %2 chiavi nei dati personalizzati.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Sono stati spostati %n chiavi in dati personalizzati.</numerusform><numerusform>Sono state spostate %n chiavi nei dati personalizzati.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Nessuna voce trovata con gli attributi KeePassHTTP!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation type="unfinished"/>
+ <translation>Il database attivo non contiene una voce con attributi KeePassHTTP.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: rilevate le impostazioni di integrazione del browser legacy</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Creare un nuovo gruppo</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation type="unfinished"/>
+ <translation>È stata ricevuta una richiesta di creazione di un nuovo gruppo &quot;%1&quot;.
+Si desidera creare questo gruppo?
+</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation type="unfinished"/>
+ <translation>Le impostazioni di KeePassXC-Browser devono essere spostate nelle impostazioni del database.
+Ciò è necessario per mantenere le connessioni del browser corrente.
+Si desidera eseguire ora la migrazione delle impostazioni esistenti?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Non mostrare nuovamente questo avviso</translation>
</message>
</context>
<context>
@@ -767,10 +921,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Il primo record contiene i nomi dei campi</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Numero righe di intestazione da scartare</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Considera &apos;\&apos; un carattere escape</translation>
</message>
@@ -812,19 +962,36 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n altro messaggio saltato]</numerusform><numerusform>[altri %n messaggi saltati]</numerusform></translation>
+ <translation><numerusform>[%n più messaggi ignorati]</numerusform><numerusform>[%n più messaggi ignorati]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
- <translation type="unfinished"/>
+ <translation>Importazione CSV: lo scrittore ha errori:
+%1</translation>
+ </message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Qualifica del testo</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Separazione dei campi</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Numero di righe di intestazione da eliminare</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Anteprima importazione CSV</translation>
</message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n colonna</numerusform><numerusform>%n colonne</numerusform></translation>
+ <translation><numerusform>%n colonne</numerusform><numerusform>%n colonne</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -833,11 +1000,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte (s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
+ <translation><numerusform>%n byte</numerusform><numerusform>%n byte</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>righe: %n</numerusform><numerusform>%n riga(e)</numerusform></translation>
+ <translation><numerusform>%n righe</numerusform><numerusform>%n righe</numerusform></translation>
</message>
</context>
<context>
@@ -860,16 +1027,34 @@ Would you like to migrate your existing settings now?</source>
<translation>Errore durante la lettura del database: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Impossibile salvare, il database non ha nessun nome di file.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Il file non può essere scritto perché aperto in modalità di sola lettura.</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
- <translation type="unfinished"/>
+ <translation>Chiave non trasformata. Questo è un bug, si prega di segnalarlo agli sviluppatori!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Database di backup che si trova in %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Impossibile salvare, il database non punta a un file valido.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Impossibile salvare, il file di database è di sola lettura.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Il file di database ha apportato modifiche non unite.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Cestino</translation>
</message>
</context>
<context>
@@ -882,30 +1067,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Inserisci la chiave principale</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>File chiave:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Password:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Sfoglia</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Aggiorna</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Risposta di verifica:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Formato di file chiave legacy</translation>
</message>
@@ -936,18 +1105,100 @@ Considera l&apos;opzione di generarne uno nuovo</translation>
<translation>Seleziona file chiave</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation type="unfinished"/>
+ <source>Failed to open key file: %1</source>
+ <translation>Impossibile aprire il file di chiave: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Impossibile aprire il database: %1</translation>
+ <source>Select slot...</source>
+ <translation>Seleziona slot...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Impossibile aprire il file chiave: %1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Sblocca il database KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Inserisci password:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo Password</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Attiva/disattiva la visibilità della password</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Immettere credenziali aggiuntive:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Selezione del file di chiave</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Selezione degli slot dei tasti hardware</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Cercare il file di chiave</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Sfoglia...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Aggiornare i token hardware</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Chiave hardware:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;È possibile utilizzare una chiave di sicurezza hardware, ad esempio &lt;strong&gt;YubiKey&lt;/strong&gt; o &lt;strong&gt;OnlyKey&lt;/strong&gt; con slot configurati per HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Clicca per maggiori informazioni...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Guida alla chiave hardware</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID per lo sblocco rapido</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Azzera</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Cancella file di chiave</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Seleziona file...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Sblocco non riuscito e nessuna password specificata</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Sblocco del database non riuscito e non è stata immessa una password.
+Si desidera riprovare con una password &quot;vuota&quot;?
+
+Per evitare che questo errore venga visualizzato, è necessario andare alle &quot;Impostazioni database / Sicurezza&quot; e reimpostare la password.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Riprova con password vuota</translation>
</message>
</context>
<context>
@@ -996,11 +1247,11 @@ Considera l&apos;opzione di generarne uno nuovo</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Dimenti&amp;ca tutte le impostazioni specifiche del sito sulle voci</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation type="unfinished"/>
+ <translation>Spostare gli attributi KeePassHTTP in KeePassXC-Browser &amp;personalizzato</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1017,7 +1268,8 @@ Considera l&apos;opzione di generarne uno nuovo</translation>
<message>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vuoi davvero eliminare la chiave selezionata?
+Ciò potrebbe impedire la connessione al plug-in del browser.</translation>
</message>
<message>
<source>Key</source>
@@ -1038,7 +1290,8 @@ This may prevent connection to the browser plugin.</source>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vuoi davvero scollegare tutti i browser?
+Ciò potrebbe impedire la connessione al plug-in del browser.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
@@ -1046,7 +1299,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>Nessuna chiave di crittografia condivisa trovata nelle impostazioni KeePassXC.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
@@ -1054,16 +1307,17 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform> Rimossa con successo %n chiave di cifratura dalle impostazioni di KeePassXC. </numerusform><numerusform> Rimosse con successo %n chiavi di cifratura dalle impostazioni di KeePassXC. </numerusform></translation>
+ <translation><numerusform>Le %n chiavi di crittografia sono state rimosse correttamente dalle impostazioni KeePassXC.</numerusform><numerusform>Le %n chiavi di crittografia sono state rimosse correttamente dalle impostazioni KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Dimenticare tutte le impostazioni specifiche del sito nelle voci</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation type="unfinished"/>
+ <translation>Vuoi davvero dimenticare tutte le impostazioni specifiche del sito su ogni voce?
+Le autorizzazioni per accedere alle voci verranno revocate.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
@@ -1079,7 +1333,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Permessi rimossi con successo da %n voce.</numerusform><numerusform>Permessi rimossi con successo da %n voci.</numerusform></translation>
+ <translation><numerusform>Le autorizzazioni sono state rimosse correttamente da %n voci.</numerusform><numerusform>Le autorizzazioni sono state rimosse correttamente da %n voci.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1091,12 +1345,21 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation type="unfinished"/>
+ <translation>Spostare gli attributi KeePassHTTP in dati personalizzati</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vuoi davvero spostare tutti i dati di integrazione del browser legacy allo standard più recente?
+Questo è necessario per mantenere la compatibilità con il plugin del browser.</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Chiavi del browser archiviate</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Rimuovere la chiave selezionata</translation>
</message>
</context>
<context>
@@ -1155,7 +1418,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>I valori più elevati offrono una maggiore protezione, ma l&apos;apertura del database richiederà più tempo.</translation>
</message>
<message>
<source>Database format:</source>
@@ -1223,12 +1486,12 @@ Se continui con questo numero, il tuo database potrebbe essere decifrato molto f
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
+ <translation><numerusform>Mib</numerusform><numerusform>Mib</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform> iscritto (i)</numerusform><numerusform>thread(s)</numerusform></translation>
+ <translation><numerusform>thread/i</numerusform><numerusform>thread</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1240,6 +1503,57 @@ Se continui con questo numero, il tuo database potrebbe essere decifrato molto f
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Modificare il tempo di decrittografia esistente</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Tempo di decrittografia in secondi</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Formato del database</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Algoritmo di crittografia</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Funzione di derivazione della chiave</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Giri di trasformazione</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Utilizzo della memoria</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Parallelismo</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Voci esposte</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Non e&amp;sporre questo database</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Esporre le voci &amp;sotto questo gruppo:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Abilitare fd.o dei servizi segreti per accedere a queste impostazioni.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1273,7 +1587,7 @@ Se continui con questo numero, il tuo database potrebbe essere decifrato molto f
</message>
<message>
<source> MiB</source>
- <translation> MB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1287,16 +1601,50 @@ Se continui con questo numero, il tuo database potrebbe essere decifrato molto f
<source>Enable &amp;compression (recommended)</source>
<translation>Abilita &amp;compressione (consigliata)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Campo nome database</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Campo descrizione database</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Campo nome utente predefinito</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Numero massimo di elementi della cronologia per voce</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Dimensione massima della cronologia per voce</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Elimina Cestino</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Vuoi eliminare il cestino corrente e tutto il suo contenuto?
+Questa azione non è reversibile.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(vecchio)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
<message>
<source>Sharing</source>
- <translation type="unfinished"/>
+ <translation>Condivisione</translation>
</message>
<message>
<source>Breadcrumb</source>
- <translation type="unfinished"/>
+ <translation>Percorso di navigazione</translation>
</message>
<message>
<source>Type</source>
@@ -1354,6 +1702,10 @@ Siete sicuri di voler continuare senza password?</translation>
<source>Failed to change master key</source>
<translation>Modifica della chiave master fallita</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Continua senza password</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1365,6 +1717,129 @@ Siete sicuri di voler continuare senza password?</translation>
<source>Description:</source>
<translation>Descrizione:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Campo nome database</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Campo descrizione database</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>statistiche</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Passare il mouse sulle righe con icone di errore per ulteriori informazioni.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valore</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Nome del database</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>descrizione</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Posizione</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Ultimo salvataggio</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Modifiche non salvate</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>sì</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>No</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Il database è stato modificato, ma le modifiche non sono ancora state salvate su disco.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Numero di gruppi</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Numero di voci</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Numero di voci scadute</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Il database contiene voci scadute.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Password univoche</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Password non univoche</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Più del 10% delle password vengono riutilizzate. Utilizzare password univoche quando possibile.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Massimo riutilizzo della password</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Alcune password vengono utilizzate più di tre volte. Utilizzare password univoche quando possibile.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Numero di password brevi</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>La lunghezza minima consigliata per la password è di almeno 8 caratteri.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Numero di password deboli</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Consiglia di utilizzare password lunghe e randomizzate con una valutazione &quot;buona&quot; o &quot;eccellente&quot;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Lunghezza media password</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 caratteri</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>La lunghezza media della password è inferiore a dieci caratteri. Le password più lunghe offrono maggiore sicurezza.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1411,11 +1886,8 @@ Siete sicuri di voler continuare senza password?</translation>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Il file di database non esiste o non è accessibile.</translation>
+ <translation>Il database creato non ha chiave o KDF, rifiutando di salvarlo.
+Questo è sicuramente un bug, si prega di segnalarlo agli sviluppatori.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1440,6 +1912,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [sola lettura]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Impossibile aprire %1. Non esiste o non è accessibile.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Esportare il database in un file HTML</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>File HTML</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Scrittura del file HTML non riuscita.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Conferma esportazione</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Si sta per esportare il database in un file non crittografato. Questo lascerà le password e le informazioni sensibili vulnerabili! Sei sicuro di voler continuare?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1457,7 +1953,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Vuoi veramente cestinare %n voce?</numerusform><numerusform>Vuoi veramente cestinare %n voci?</numerusform></translation>
+ <translation><numerusform>Vuoi davvero spostare %n voci nel cestino?</numerusform><numerusform>Vuoi davvero spostare %n voci nel cestino?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1519,19 +2015,15 @@ Vuoi fondere i cambiamenti?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Vuoi davvero eliminare %n voci per sempre?</numerusform><numerusform>Vuoi davvero eliminare %n voci per sempre?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Elimina ha?</numerusform><numerusform>Cancellare la voce(i)?</numerusform></translation>
+ <translation><numerusform>Eliminare le voci?</numerusform><numerusform>Eliminare le voci?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Spostare la creazione nel cestino?</numerusform><numerusform>Spostare la voce(i) nel cestino?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>File aperto in modalità di sola lettura.</translation>
+ <translation><numerusform>Spostare le voci nel cestino?</numerusform><numerusform>Spostare le voci nel cestino?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1539,7 +2031,7 @@ Vuoi fondere i cambiamenti?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>Si sta modificando una voce. Eliminare le modifiche e bloccare comunque?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1560,7 +2052,8 @@ Salvare le modifiche?</translation>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation type="unfinished"/>
+ <translation>Impossibile aprire il nuovo file di database durante il tentativo di ricaricamento.
+Errore: %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
@@ -1573,12 +2066,6 @@ Disable safe saves and try again?</source>
Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Scrittura nel database non riuscita.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Password</translation>
</message>
@@ -1592,11 +2079,11 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>Sostituire i riferimenti alla voce?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>La voce &quot;%1&quot; ha %2 riferimento/i. Sovrascrivere i riferimenti con i valori, ignorare questa voce o eliminare comunque?</numerusform><numerusform>La voce &quot;%1&quot; ha %2 riferimento/i. Sovrascrivere i riferimenti con i valori, ignorare questa voce o eliminare comunque?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1612,7 +2099,7 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation type="unfinished"/>
+ <translation>I file di database sono uniti correttamente.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
@@ -1620,7 +2107,15 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
<source>Shared group...</source>
- <translation type="unfinished"/>
+ <translation>Gruppo condiviso...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Scrittura del database non riuscita: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Questo database viene aperto in modalità di sola lettura. Il salvataggio automatico è disabilitato.</translation>
</message>
</context>
<context>
@@ -1703,11 +2198,11 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n settimana</numerusform><numerusform>%n settimane</numerusform></translation>
+ <translation><numerusform>%n settimana/e</numerusform><numerusform>%n settimana/e</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n mese</numerusform><numerusform>%n mesi</numerusform></translation>
+ <translation><numerusform>%n mese/i</numerusform><numerusform>%n mese/i</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1735,12 +2230,24 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>anno (i) %n</numerusform><numerusform>%n anno(i)</numerusform></translation>
+ <translation><numerusform>%n anno/i</numerusform><numerusform>%n anno/i</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Conferma rimozione</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integrazione con i browser</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Sei sicuro di voler rimuovere questo URL?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1780,6 +2287,42 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Background Color:</source>
<translation>Colore di sfondo:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Selezione degli attributi</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Valore attributo</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Aggiungere un nuovo attributo</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Rimuovi attributo selezionato</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Modifica nome attributo</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Attivare o disattivare la protezione degli attributi</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Visualizzare un attributo protetto</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Selezione del colore di primo piano</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Selezione del colore di sfondo</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1815,6 +2358,77 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Usa una sequenza specifica per questa associazione:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Sequenza di tipo automatico personalizzata</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Aprire la pagina Web di aiuto per le sequenze automatiche</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Associazioni delle finestre esistenti</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Aggiungi nuova associazione finestra</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Rimuovere l&apos;associazione della finestra selezionata</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>È possibile utilizzare un asterisco (*) per abbinare tutto</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Impostare il titolo dell&apos;associazione della finestra</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>È possibile utilizzare un asterisco per abbinare tutto</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Sequenza di tipo automatico personalizzata per questa finestra</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Queste impostazioni influiscono sul comportamento della voce con l&apos;estensione del browser.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generale</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Ignora invio automatico per questa voce</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Nascondi questa voce dall&apos;estensione del browser</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>URL aggiuntivi</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Aggiungi</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Rimuovi</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Modifica</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1834,6 +2448,26 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Delete all</source>
<translation>Elimina tutti</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Selezione della cronologia delle voci</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Mostra voce nello stato della cronologia selezionato</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Ripristinare la voce allo stato della cronologia selezionato</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Eliminare lo stato della cronologia selezionato</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Elimina tutta la cronologia</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1873,6 +2507,62 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Expires</source>
<translation>Scade</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Campo Url</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Scarica favicon per URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Campo ripeti password</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Attiva/disattiva generatore di password</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo password</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Attiva/disattiva la visibilità della password</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Attiva/disattiva visibilità delle note</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Campo scadenza</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Scadenza delle preimpostazioni</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Scadenza delle preimpostazioni</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo note</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Campo del titolo</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Campo nome utente</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Attiva/disattiva scadenza</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1949,6 +2639,22 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Richiesta conferma dell&apos;utente quando questa chiave è usata</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Rimuovi chiave dall&apos;agente dopo i secondi specificati</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Ricerca del file di chiave</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>File di chiave esterna</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Seleziona file allegato</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1984,6 +2690,10 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Eredita dal gruppo genitore (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>La voce contiene modifiche non salvate</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2012,68 +2722,99 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<translation>Inattivo</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importa da percorso</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Contenitore non firmato KeeShare</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>Contenitore firmato KeeShare</translation>
+ </message>
+ <message>
+ <source>Select import source</source>
+ <translation>Selezionare l&apos;origine di importazione</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Esporta su percorso</translation>
+ <source>Select export target</source>
+ <translation>Seleziona destinazione di esportazione</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation type="unfinished"/>
+ <source>Select import/export file</source>
+ <translation>Selezionare il file di importazione/esportazione</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation type="unfinished"/>
+ <source>Clear</source>
+ <translation>Azzera</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation type="unfinished"/>
+ <source>Import</source>
+ <translation>Importazione</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation type="unfinished"/>
+ <source>Export</source>
+ <translation>Esportare</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation type="unfinished"/>
+ <source>Synchronize</source>
+ <translation>Sincronizzare</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation type="unfinished"/>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>La tua versione di KeePassXC non supporta la condivisione di questo tipo di contenitore.
+Le estensioni supportate sono: %1.</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation type="unfinished"/>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 è già stato esportato da questo database.</translation>
</message>
<message>
- <source>Select import source</source>
- <translation type="unfinished"/>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 è già stato importato da questo database.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation type="unfinished"/>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 viene importato ed esportato da gruppi diversi in questo database.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation type="unfinished"/>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare è attualmente disabilitato. È possibile abilitare l&apos;importazione/esportazione nelle impostazioni dell&apos;applicazione.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Azzera</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>L&apos;esportazione del database è attualmente disabilitata dalle impostazioni dell&apos;applicazione.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>L&apos;importazione del database è attualmente disabilitata dalle impostazioni dell&apos;applicazione.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Campo modalità di condivisione</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation type="unfinished"/>
+ <source>Path to share file field</source>
+ <translation>Campo percorso per condividere il file</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation type="unfinished"/>
+ <source>Browser for share file</source>
+ <translation>Ricerca del file di condivisione</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation type="unfinished"/>
+ <source>Password field</source>
+ <translation>Campo password</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Attiva/disattiva la visibilità della password</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Attiva/disattiva generatore di password</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Cancellare i campi</translation>
</message>
</context>
<context>
@@ -2106,6 +2847,34 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Imposta se&amp;quenza predefinita di completamento automatico</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Campo nome</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo note</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Attiva/disattiva scadenza</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Attiva/disattiva il completamento automatico per questo e i sottogruppi</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Campo scadenza</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Attiva/disattiva ricerca per questo e per i sottogruppi</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Campo di sequenza di tipo automatico predefinito</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2142,28 +2911,16 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
<translation>Tutti i file</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>L&apos;icona personalizzata esiste già</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Conferma eliminazione</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Icona personalizzata scaricata correttamente</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Selezionare immagine(i)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Caricate con successo %1 di %n icona.</numerusform><numerusform>Caricate con successo %1 di %n icone.</numerusform></translation>
+ <translation><numerusform>Caricamento riuscito %1 dell&apos;icona/ia/e %n</numerusform><numerusform>Caricamento riuscito di %1 di %n icone</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2171,15 +2928,51 @@ Disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n icona esiste già nel database</numerusform><numerusform>%n icone esistono già nel database</numerusform></translation>
+ <translation><numerusform>%n icona/e già esistente nel database</numerusform><numerusform>%n icona/e già esistente nel database</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>La seguente icona presenta degli errori:</numerusform><numerusform>Le seguenti icone presentano degli errori:</numerusform></translation>
+ <translation><numerusform>Le seguenti icone non sono riuscite:</numerusform><numerusform>Le seguenti icone non sono riuscite:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Questa icona viene utilizzata da %n voci e verrà sostituita dall&apos;icona predefinita. Sei sicuro di volerlo eliminare?</numerusform><numerusform>Questa icona viene utilizzata da %n voci e verrà sostituita dall&apos;icona predefinita. Sei sicuro di volerla eliminare?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>È possibile attivare il servizio per le icone del sito Web DuckDuckGo in Strumenti -&gt; Impostazioni -&gt; Sicurezza</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Scarica favicon per URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Applicare l&apos;icona selezionata a sottogruppi e voci</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Applicare icona &amp;a ...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Applica solo a questo</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Applica anche ai gruppi figli</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Si applicano anche alle voci figlio</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Si applicano anche a tutti i figli</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Icona esistente selezionata.</translation>
</message>
</context>
<context>
@@ -2226,6 +3019,30 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<source>Value</source>
<translation>Valore</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Data e ora di creazione</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Data/ora di modifica</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Data/ora acceduto</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>ID univoco</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Dati del plug-in</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Rimuovere i dati selezionati del plug-in</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2273,7 +3090,7 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Sei sicuro di voler rimuovere %n allegato?</numerusform><numerusform>Sei sicuro di voler rimuovere %n allegati?</numerusform></translation>
+ <translation><numerusform>Sei sicuro di voler rimuovere %n allegati?</numerusform><numerusform>Sei sicuro di voler rimuovere %n allegati?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2318,10 +3135,30 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Impossibile aprire il file:
+ <translation><numerusform>Impossibile aprire i file:
%1</numerusform><numerusform>Impossibile aprire i file:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Allegati</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Aggiungi nuovo allegato</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Rimuovere l&apos;allegato selezionato</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Aprire l&apos;allegato selezionato</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Salva l&apos;allegato selezionato su disco</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2416,10 +3253,6 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generare un token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Chiudi</translation>
</message>
@@ -2502,7 +3335,15 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
</message>
<message>
<source>Share</source>
- <translation type="unfinished"/>
+ <translation>Condividi</translation>
+ </message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Visualizza il valore TOTP corrente</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avanzate</translation>
</message>
</context>
<context>
@@ -2537,11 +3378,33 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Cestino</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>La voce &quot;%1&quot; dal database &quot;%2&quot; è stata utilizzata da %3</translation>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Impossibile registrare il servizio DBus in %1: è in esecuzione un altro servizio segreto.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n Voci utilizzate da %1</numerusform><numerusform>%n voci utilizzate da %1</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Servizio segreto Fdo: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2560,6 +3423,59 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Scarica Favicons</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Hai problemi a scaricare le icone?
+È possibile attivare il servizio per le icone del sito Web DuckDuckGo nella sezione relativa alla sicurezza delle impostazioni dell&apos;applicazione.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Stato</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Si prega di attendere, elenco delle voci in elaborazione...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Scaricamento...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Esiste già</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Download non riuscito</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Scaricamento delle favicon (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2581,16 +3497,12 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<translation>Non in grado dare la risposta di verifica.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chiave errata o file del database danneggiato.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>intestazioni del database mancanti</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation type="unfinished"/>
+ <translation>L&apos;intestazione non corrisponde all&apos;hash</translation>
</message>
<message>
<source>Invalid header id size</source>
@@ -2604,6 +3516,12 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<source>Invalid header data length</source>
<translation>Lunghezza dei dati di intestazione non valida</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Sono state fornite credenziali non valide, riprovare.
+Se ciò si ripresenta, il file di database potrebbe essere danneggiato.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2635,10 +3553,6 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<translation>Corrispondenza errata dell&apos;intestazione SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Chiave errata o file del database corrotto (HMAC non corrisponde)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Cifrario sconosciuto</translation>
</message>
@@ -2738,6 +3652,16 @@ Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Dimensione non valida per il tipo di campo della mappa di variazione </translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Sono state fornite credenziali non valide, riprovare.
+Se ciò si ripresenta, il file di database potrebbe essere danneggiato.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(mancata corrispondenza HMAC)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2818,11 +3742,11 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
- <translation type="unfinished"/>
+ <translation>Lunghezza dell&apos;uuid cifrato non valida: %1 (lunghezza=%2)</translation>
</message>
<message>
<source>Unable to parse UUID: %1</source>
- <translation type="unfinished"/>
+ <translation>Impossibile analizzare UUID: %1</translation>
</message>
<message>
<source>Failed to read database file.</source>
@@ -2960,13 +3884,13 @@ Riga %2, colonna %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importa database KeePass1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Impossibile aprire il database.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importa database KeePass1</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3024,10 +3948,6 @@ Riga %2, colonna %3</translation>
<translation>Impossibile calcolare la chiave principale</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chiave errata o file del database danneggiato.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Trasformazione della chiave non riuscita</translation>
</message>
@@ -3121,42 +4041,60 @@ Riga %2, colonna %3</translation>
</message>
<message>
<source>unable to seek to content position</source>
- <translation type="unfinished"/>
+ <translation>Non in grado di cercare nella posizione del contenuto</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Sono state fornite credenziali non valide, riprovare.
+Se ciò si ripresenta, il file di database potrebbe essere danneggiato.</translation>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation type="unfinished"/>
+ <source>Invalid sharing reference</source>
+ <translation>Riferimento di condivisione non valido</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importa da</translation>
+ <source>Inactive share %1</source>
+ <translation>Condivisione inattiva %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Esporta verso</translation>
+ <source>Imported from %1</source>
+ <translation>Importato da %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Sincronizza con</translation>
+ <source>Exported to %1</source>
+ <translation>Esportato in %1</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation type="unfinished"/>
+ <source>Synchronized with %1</source>
+ <translation>Sincronizzato con %1</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation type="unfinished"/>
+ <source>Import is disabled in settings</source>
+ <translation>L&apos;importazione è disabilitata nelle impostazioni</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation type="unfinished"/>
+ <source>Export is disabled in settings</source>
+ <translation>L&apos;esportazione è disabilitata nelle impostazioni</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation type="unfinished"/>
+ <source>Inactive share</source>
+ <translation>Condivisione inattiva</translation>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation>Importato da</translation>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation>Esportato in</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>Sincronizzato con</translation>
</message>
</context>
<context>
@@ -3175,7 +4113,7 @@ Riga %2, colonna %3</translation>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation type="unfinished"/>
+ <translation>Set di componenti chiave, fare clic per modificare o rimuovere</translation>
</message>
<message>
<source>Add %1</source>
@@ -3195,16 +4133,12 @@ Riga %2, colonna %3</translation>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>%1 impostato, fare clic per modificare o rimuovere</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Sfoglia</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Genera</translation>
</message>
@@ -3214,7 +4148,7 @@ Riga %2, colonna %3</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;È possibile aggiungere un file chiave contenente byte casuali per una maggiore sicurezza.&lt;/p&gt;&lt;p&gt;Devi tenerlo segreto e non perderlo mai o sarai bloccato!&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
@@ -3225,7 +4159,10 @@ Riga %2, colonna %3</translation>
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Si sta utilizzando un formato di file chiave legacy che può diventare
+non supportato in futuro.
+
+Passare alle impostazioni della chiave master e generare un nuovo file di chiave.</translation>
</message>
<message>
<source>Error loading the key file '%1'
@@ -3257,6 +4194,44 @@ Messaggio: %2</translation>
<source>Select a key file</source>
<translation>Seleziona un file chiave</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Selezione del file chiave</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Cercare il file chiave</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Sfoglia...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Generare un nuovo file chiave</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Nota: non utilizzare un file che potrebbe cambiare in quanto ciò impedirà di sbloccare il database!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>File chiave non valido</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Non è possibile utilizzare il database corrente come proprio file chiave. Scegliere un file diverso o generare un nuovo file chiave.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>File chiave sospetto</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Il file chiave scelto ha l&apos;aspetto di un file database delle password. Un file chiave deve essere un file statico che non cambia mai o si perderà l&apos;accesso al database per sempre.
+Sei sicuro di voler continuare con questo file?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3345,10 +4320,6 @@ Messaggio: %2</translation>
<translation>&amp;Impostazioni</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Genera password</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Blocca database</translation>
</message>
@@ -3535,17 +4506,10 @@ Si consiglia di utilizzare l&apos;AppImage disponibile sulla nostra pagina di do
<translation>Mostra codice QR TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Controllo aggiornamenti...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Condividi voce</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
- <translation type="unfinished"/>
+ <translation>NOTA: si sta utilizzando una versione non definitiva di KeePassXC!
+Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&apos;uso in produzione.</translation>
</message>
<message>
<source>Check for updates on startup?</source>
@@ -3559,64 +4523,140 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>È sempre possibile controllare gli aggiornamenti manualmente tramite i menu dell&apos;applicazione.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Esporta</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Controlla aggiornamenti...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Scari&amp;ca tutte le favicons</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Ordina &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Ordina &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>Generatore di &amp;password</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Scarica favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Esporta in file HTML...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password Vault...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importare un 1Password Vault</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Guida introduttiva</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Apri guida introduttiva PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>&amp;Guida in linea...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Vai alla documentazione online (apre il browser)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>&amp;Guida per l&apos;utente</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Apri guida per l&apos;utente PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Tasti di scelta rapida</translation>
+ </message>
</context>
<context>
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Creazione mancante %1 [%2]</translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Rilocazione di %1 [%2]</translation>
</message>
<message>
<source>Overwriting %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sovrascrittura %1 [%2]</translation>
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation type="unfinished"/>
+ <translation>voce precedente unita dal database &quot;%1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Aggiunto backup per la destinazione precedente %1 [%2]</translation>
</message>
<message>
<source>Adding backup for older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Aggiunto backup per l&apos;origine precedente %1 [%2]</translation>
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Riapplicare la voce di destinazione precedente all&apos;origine più recente %1 [%2]</translation>
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Riapplicare la voce di origine precedente alla destinazione più recente %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sincronizzazione dall&apos;origine più recente %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sincronizzazione dall&apos;origine precedente %1 [%2]</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Eliminazione dell&apos;elemento figlio %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Eliminazione orfano %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
- <translation type="unfinished"/>
+ <translation>Oggetti eliminati modificati</translation>
</message>
<message>
<source>Adding missing icon %1</source>
- <translation type="unfinished"/>
+ <translation>Aggiungere l&apos;icona mancante %1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Dati personalizzati rimossi %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Aggiunta di dati personalizzati %1 [%2]</translation>
</message>
</context>
<context>
@@ -3688,6 +4728,73 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>OpData01 non valido, non contiene l&apos;intestazione</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Impossibile leggere tutti i byte IV, desiderati 16 ma ottenuti %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Impossibile inizializzare la crittografia per opdata01: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Impossibile leggere tutti i byte della firma HMAC</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>OpData01 non valido a causa di un HMAC non riuscito</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Impossibile elaborare clearText sul posto</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>Previsto %1 byte di testo non crittografato, trovato %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Lettura del database non ha prodotto un&apos;istanza
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>La directory .opvault deve esistere</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>La directory .opvault deve essere leggibile</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Directory .opvault/default deve esistere</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Directory .opvault/default deve essere leggibile</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Impossibile decodificare masterKey: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Impossibile derivare la chiave master: %1</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3787,6 +4894,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Le password non corrispondono</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Le password corrispondono finora</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3812,6 +4930,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Generare la password principale</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo password</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Attiva/disattiva la visibilità della password</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Campo ripeti password</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Attiva/disattiva generatore di password</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3841,22 +4975,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Tipi di carattere</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Lettere maiuscole</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Lettere minuscole</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Numeri</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caratteri speciali</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>ASCII esteso</translation>
</message>
@@ -3937,18 +5059,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Avanzate</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Lettere maiuscole dalla A alla F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Lettere maiuscole dalla A alla F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3981,18 +5095,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematica</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Trattini</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4022,7 +5128,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Add non-hex letters to &quot;do not include&quot; list</source>
- <translation type="unfinished"/>
+ <translation>Aggiungere lettere non esadecimali all&apos;elenco &quot;non includere&quot;</translation>
</message>
<message>
<source>Hex</source>
@@ -4040,6 +5146,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>Rigenerare</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Password generata</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Lettere maiuscole</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Lettere minuscole</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Caratteri speciali</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Simboli matematici</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Trattini e barre</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Caratteri esclusi</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Password esadecimali</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Lunghezza password</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Parole maiuscole/minuscole:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Rigenera password</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Copia password</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Accetta password</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>carattere minuscolo</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>MAIUSCOLO</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Titolo maiuscolo/minuscolo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Attiva/disattiva la visibilità della password</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4047,12 +5221,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Seleziona</translation>
+ <source>Statistics</source>
+ <translation>Statistiche</translation>
</message>
</context>
<context>
@@ -4089,6 +5260,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>Incorpora</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>continuare</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4181,10 +5356,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Genera una password per questa voce.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Lunghezza della password generata.</translation>
- </message>
- <message>
<source>length</source>
<translation>lunghezza</translation>
</message>
@@ -4234,18 +5405,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Esegui un&apos;analisi avanzata sulla password.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Estrai e stampa il contenuto di un database.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Percorso del database da estrarre.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Inserisci la password per sbloccare %1:</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4290,10 +5449,6 @@ Comandi disponibili:
<translation>Unisci due database.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Percorso del database destinazione da unire.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Percorso del database sorgente da unire.</translation>
</message>
@@ -4370,10 +5525,6 @@ Comandi disponibili:
<translation>Integrazione con i browser</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>Risposta di verifica da YubiKey[%1] - slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Premi</translation>
</message>
@@ -4404,12 +5555,8 @@ Comandi disponibili:
<translation>Genera una nuova password casuale.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Impossibile creare la voce con il percorso %1.</translation>
</message>
<message>
<source>Enter password for new entry: </source>
@@ -4429,7 +5576,7 @@ Comandi disponibili:
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation type="unfinished"/>
+ <translation>Valore di timeout %1 non valido.</translation>
</message>
<message>
<source>Entry %1 not found.</source>
@@ -4437,19 +5584,19 @@ Comandi disponibili:
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
- <translation type="unfinished"/>
+ <translation>La voce con percorso %1 non ha impostato TOTP.</translation>
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>TOTP corrente della voce copiata negli appunti!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>La password della voce copiata negli appunti!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Cancellazione degli Appunti in %1 secondi...</numerusform><numerusform>Cancellazione degli appunti in %1 secondi...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4465,16 +5612,12 @@ Comandi disponibili:
<translation>conteggio</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Impossibile trovare la voce con percorso %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Non modificare nessun campo per la voce %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
@@ -4482,11 +5625,11 @@ Comandi disponibili:
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Scrittura del database non riuscita: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Voce %1 modificata correttamente.</translation>
</message>
<message>
<source>Length %1</source>
@@ -4514,7 +5657,7 @@ Comandi disponibili:
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation type="unfinished"/>
+ <translation>Type: Dict+Leet</translation>
</message>
<message>
<source>Type: User Words</source>
@@ -4522,7 +5665,7 @@ Comandi disponibili:
</message>
<message>
<source>Type: User+Leet</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Utente+Leet</translation>
</message>
<message>
<source>Type: Repeated</source>
@@ -4550,31 +5693,31 @@ Comandi disponibili:
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Dict+Leet(Rep)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Parole utente (Rep)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Utente+Leet(Rep)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Ripetuto(Rep)</translation>
</message>
<message>
<source>Type: Sequence(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Sequenza(Rep)</translation>
</message>
<message>
<source>Type: Spatial(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Spaziale(Rep)</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipo: Data(Rep)</translation>
</message>
<message>
<source>Type: Unknown%1</source>
@@ -4586,29 +5729,11 @@ Comandi disponibili:
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation type="unfinished"/>
+ <translation>*** Lunghezza della password (%1) != somma della lunghezza delle parti (%2) ***</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation>File %1 non esiste.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Impossibile aprire il file %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
+ <translation>Impossibile caricare il file di chiave %1: %2</translation>
</message>
<message>
<source>Length of the generated password</source>
@@ -4623,10 +5748,6 @@ Comandi disponibili:
<translation>Utilizzare caratteri maiuscoli</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Utilizzare i numeri.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Utilizzare caratteri speciali</translation>
</message>
@@ -4661,39 +5782,40 @@ Comandi disponibili:
<message>
<source>Error reading merge file:
%1</source>
- <translation type="unfinished"/>
+ <translation>Errore durante la lettura del file di unione:
+%1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation type="unfinished"/>
+ <translation>Impossibile salvare il database nel file : %1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation type="unfinished"/>
+ <translation>Impossibile salvare il database nel file: %1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Riciclata con successo la voce %1.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Eliminata la voce %1.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
- <translation type="unfinished"/>
+ <translation>Mostra il TOTP corrente della voce.</translation>
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
- <translation type="unfinished"/>
+ <translation>ERRORE: attributo sconosciuto %1.</translation>
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation type="unfinished"/>
+ <translation>Nessun programma definito per la manipolazione degli appunti</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation type="unfinished"/>
+ <translation>Impossibile avviare il programma %1</translation>
</message>
<message>
<source>file empty</source>
@@ -4701,7 +5823,7 @@ Comandi disponibili:
</message>
<message>
<source>%1: (row, col) %2,%3</source>
- <translation type="unfinished"/>
+ <translation>%1: (riga, col) %2,%3</translation>
</message>
<message>
<source>AES: 256-bit</source>
@@ -4739,11 +5861,11 @@ Comandi disponibili:
</message>
<message>
<source>Message encryption failed.</source>
- <translation type="unfinished"/>
+ <translation>Crittografia del messaggio non riuscita.</translation>
</message>
<message>
<source>No groups found</source>
- <translation type="unfinished"/>
+ <translation>Nessun gruppo trovato</translation>
</message>
<message>
<source>Create a new database.</source>
@@ -4763,27 +5885,19 @@ Comandi disponibili:
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation type="unfinished"/>
+ <translation>Impossibile salvare il database: %1.</translation>
</message>
<message>
<source>Successfully created new database.</source>
<translation>Nuovo database creato con successo.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
+ <translation>Creazione di KeyFile %1 non riuscita: %2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>Rimuovi una voce dal database.</translation>
+ <translation>Caricamento del KeyFile %1 non riuscito: %2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4839,7 +5953,331 @@ Comandi disponibili:
</message>
<message>
<source>Cannot create new group</source>
- <translation type="unfinished"/>
+ <translation>Impossibile creare un nuovo gruppo</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Disattivare la chiave della password per il database.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Visualizza le informazioni di debug.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Disattivare la chiave della password per il database da cui eseguire l&apos;unione.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versione %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Tipo di compilazione: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisione: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribuzione: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>La modalità di debug è disabilitata.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>La modalità di debug è abilitata.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistema operativo: %1
+Architettura CPU: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Completamento automatico</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (condivisione firmata e non firmata)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (solo condivisione firmata)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (solo condivisione non firmata)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nessuno</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Estensioni abilitate:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Librerie crittografiche:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Impossibile generare una password e richiederla contemporaneamente!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Aggiunge un nuovo gruppo a un database.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Percorso del gruppo da aggiungere.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Il gruppo %1 esiste già!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Gruppo %1 non trovato.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Aggiunta del gruppo %1 completata.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Verificare se le password sono state rivelate pubblicamente. FILENAME deve essere il percorso di un file che elenca gli hashe SHA-1 delle password rivelate in formato HIBP, come disponibile da https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>Filename</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analizzare le password per trovare punti deboli e problemi.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Impossibile aprire il file HIBP %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Valutare le voci del database rispetto al file HIBP, questo richiederà un po&apos; di tempo...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Chiudere il database attualmente aperto.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Visualizza questa guida.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Slot Yubikey utilizzato per crittografare il database.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>slot</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Conteggio parole non valido %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>L&apos;elenco delle parole è troppo piccolo (&lt; 1000 voci)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Uscire dalla modalità interattiva.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Formato da utilizzare durante l&apos;esportazione. Le opzioni disponibili sono xml o csv. Il valore predefinito è xml.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Esporta il contenuto di un database nell&apos;output standard nel formato specificato.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Impossibile esportare il database in XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Formato non supportato %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Utilizzare i numeri</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Lunghezza password non valida %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Visualizzare la guida del comando.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Comandi disponibili:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Importare il contenuto di un database XML.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Percorso dell&apos;esportazione del database XML.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Percorso del nuovo database.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Impossibile importare l&apos;esportazione del database XML %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Database importato correttamente.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Comando sconosciuto %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Appiattisce l&apos;output su singole linee.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Stampare solo le modifiche rilevate dall&apos;operazione di unione.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Slot Yubikey per il secondo database.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>È stato possibile unire con successo %1 in %2.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Il database non è stato modificato dall&apos;operazione di unione.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Sposta una voce in un nuovo gruppo.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Percorso della voce da spostare.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Percorso del gruppo di destinazione.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Impossibile trovare il gruppo con percorso %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>La voce è già nel gruppo %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>È stata spostata correttamente la voce %1 nel gruppo %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Aprire un database.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Percorso del gruppo da rimuovere.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Impossibile rimuovere il gruppo radice dal database.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Riciclato con successo il gruppo %1.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Eliminazione del gruppo %1 completata.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Impossibile aprire il file di database %1: non trovato</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Impossibile aprire il file di database %1: non un file piatto</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Impossibile aprire il file di database %1: non leggibile</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Immettere la password per sbloccare %1:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Slot YubiKey non valido %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Tocca il pulsante sul tuo YubiKey per sbloccare %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Immettere la password per crittografare il database (facoltativo):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>File HIBP, riga %1: errore di analisi</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Integrazione del servizio segreto</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Nome utente</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Risposta di verifica - Slot %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>La password per &apos;%1&apos; è stata persa %2 time(s)!</numerusform><numerusform>La password per &apos;%1&apos; è trapelata %2 volte!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Generatore di password non valido dopo l&apos;applicazione di tutte le opzioni</translation>
</message>
</context>
<context>
@@ -4919,11 +6357,11 @@ Comandi disponibili:
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>I termini di ricerca sono i seguenti: [modificatori][campo:][&quot;]termine[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>Ogni termine di ricerca deve corrispondere (per esempio AND logico)</translation>
</message>
<message>
<source>Modifiers</source>
@@ -4947,7 +6385,7 @@ Comandi disponibili:
</message>
<message>
<source>Term Wildcards</source>
- <translation type="unfinished"/>
+ <translation>Termine caratteri jolly</translation>
</message>
<message>
<source>match anything</source>
@@ -4995,34 +6433,121 @@ Comandi disponibili:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Opzioni</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Abilitare l&apos;integrazione di KeepassXC con Freedesktop.org Secret Service</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generale</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Mostra notifica quando vengono richieste le credenziali</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Se il cestino è abilitato per il database, le voci verranno spostate direttamente nel cestino. In caso contrario, verranno eliminati senza conferma.&lt;/p&gt;&lt;p&gt;Continuerai a essere interpellato se qualsiasi voce fa riferimento ad altre.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Non confermare quando le voci vengono eliminate dai client.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Gruppi di database esposti:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Nome file</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Gruppo</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Gestire</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorizzazione</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Queste applicazioni sono attualmente connesse:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Applicazione</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Scollegare</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Impostazioni database</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Modificare le impostazioni del database</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Sblocca database</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Sblocca il database per mostrare ulteriori informazioni</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Blocca database</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Sblocca per mostrare</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nessuno</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
- <translation type="unfinished"/>
+ <translation>Attivo</translation>
</message>
<message>
<source>Allow export</source>
- <translation type="unfinished"/>
+ <translation>Consenti esportazione</translation>
</message>
<message>
<source>Allow import</source>
- <translation type="unfinished"/>
+ <translation>Consenti importazione</translation>
</message>
<message>
<source>Own certificate</source>
- <translation type="unfinished"/>
+ <translation>Certificato proprio</translation>
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>impronta digitale:</translation>
</message>
<message>
<source>Certificate:</source>
- <translation type="unfinished"/>
+ <translation>Certificato:</translation>
</message>
<message>
<source>Signer</source>
- <translation type="unfinished"/>
+ <translation>Firmatario</translation>
</message>
<message>
<source>Key:</source>
@@ -5038,23 +6563,23 @@ Comandi disponibili:
</message>
<message>
<source>Export</source>
- <translation type="unfinished"/>
+ <translation>Esporta</translation>
</message>
<message>
<source>Imported certificates</source>
- <translation type="unfinished"/>
+ <translation>Certificati importati</translation>
</message>
<message>
<source>Trust</source>
- <translation type="unfinished"/>
+ <translation>Attendibilità</translation>
</message>
<message>
<source>Ask</source>
- <translation type="unfinished"/>
+ <translation>Chiedere</translation>
</message>
<message>
<source>Untrust</source>
- <translation type="unfinished"/>
+ <translation>L&apos;inattendibilità</translation>
</message>
<message>
<source>Remove</source>
@@ -5066,7 +6591,7 @@ Comandi disponibili:
</message>
<message>
<source>Status</source>
- <translation type="unfinished"/>
+ <translation>Stato</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -5074,28 +6599,28 @@ Comandi disponibili:
</message>
<message>
<source>Certificate</source>
- <translation type="unfinished"/>
+ <translation>Certificato</translation>
</message>
<message>
<source>Trusted</source>
- <translation type="unfinished"/>
+ <translation>Fidato</translation>
</message>
<message>
<source>Untrusted</source>
- <translation type="unfinished"/>
+ <translation>Non attendibile</translation>
</message>
<message>
<source>Unknown</source>
- <translation type="unfinished"/>
+ <translation>Sconosciuto</translation>
</message>
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation type="unfinished"/>
+ <translation>key.share</translation>
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>File chiave KeeShare</translation>
</message>
<message>
<source>All files</source>
@@ -5103,38 +6628,133 @@ Comandi disponibili:
</message>
<message>
<source>Select path</source>
- <translation type="unfinished"/>
+ <translation>Seleziona tracciato</translation>
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>Esportazione del certificato modificato</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation type="unfinished"/>
+ <translation>Il certificato esportato non corrisponde a quello in uso. Esportare il certificato corrente?</translation>
</message>
<message>
<source>Signer:</source>
- <translation type="unfinished"/>
+ <translation>Firmatario:</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Consenti importazioni KeeShare</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Consenti esportazioni KeeShare</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Mostra solo avvisi ed errori</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Chiave</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Campo nome firmatario</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Genera nuovo certificato</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importa certificato esistente</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Esporta il proprio certificato</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Condivisioni conosciute</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Considera attendibile il certificato selezionato</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Chiedere ogni volta se considerare attendibile il certificato selezionato </translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Certificato selezionato non attendibile</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Rimuovere il certificato selezionato</translation>
</message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>La sovrascrittura del contenitore di condivisioni con firma non è supportata - l&apos;esportazione non è consentita</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Impossibile scrivere il contenitore di esportazione (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Impossibile incorporare la firma: Impossibile aprire il file da scrivere (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Impossibile incorporare la firma: Impossibile scrivere il file (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Impossibile incorporare il database: Impossibile aprire il file da scrivere (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Impossibile incorporare il database: impossibile scrivere il file (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>La sovrascrittura del contenitore di condivisione non firmato non è supportata - l&apos;esportazione non è consentita</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Impossibile scrivere il contenitore di esportazione</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Si è verificato un errore di esportazione imprevisto</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
- <translation type="unfinished"/>
+ <translation>Importa da contenitore senza firma</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
- <translation type="unfinished"/>
+ <translation>Non è possibile verificare l&apos;origine del contenitore condiviso perché non è firmato. Si desidera davvero importare da %1?</translation>
</message>
<message>
<source>Import from container with certificate</source>
- <translation type="unfinished"/>
+ <translation>Importa dal contenitore con certificato</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Si desidera considerare attendibile %1 con l&apos;impronta digitale di %2 da %3? {1 ?} {2 ?}</translation>
</message>
<message>
<source>Not this time</source>
- <translation type="unfinished"/>
+ <translation>Non questa volta</translation>
</message>
<message>
<source>Never</source>
@@ -5142,123 +6762,86 @@ Comandi disponibili:
</message>
<message>
<source>Always</source>
- <translation type="unfinished"/>
+ <translation>Sempre</translation>
</message>
<message>
<source>Just this time</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Import from %1 failed (%2)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation type="unfinished"/>
+ <translation>Solo questa volta</translation>
</message>
<message>
<source>Signed share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>Contenitori di condivisione firmati non supportati - importazione non consentita</translation>
</message>
<message>
<source>File is not readable</source>
- <translation type="unfinished"/>
+ <translation>Il file non è leggibile</translation>
</message>
<message>
<source>Invalid sharing container</source>
- <translation type="unfinished"/>
+ <translation>Contenitore di condivisione non valido</translation>
</message>
<message>
<source>Untrusted import prevented</source>
- <translation type="unfinished"/>
+ <translation>Importazione non attendibile impedita</translation>
</message>
<message>
<source>Successful signed import</source>
- <translation type="unfinished"/>
+ <translation>Importazione firmata correttamente</translation>
</message>
<message>
<source>Unexpected error</source>
- <translation type="unfinished"/>
+ <translation>Errore imprevisto</translation>
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>Contenitori di condivisione non firmati non sono supportati - importazione non consentita</translation>
</message>
<message>
<source>Successful unsigned import</source>
- <translation type="unfinished"/>
+ <translation>Importazione non firmata riuscita</translation>
</message>
<message>
<source>File does not exist</source>
- <translation type="unfinished"/>
+ <translation>Il file non esiste</translation>
</message>
<message>
<source>Unknown share container type</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
+ <translation>Tipo di contenitore di condivisione sconosciuto</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Importazione da %1 non riuscita (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation type="unfinished"/>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Importazione da %1 riuscita (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation type="unfinished"/>
+ <source>Imported from %1</source>
+ <translation>Importato da %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <translation>Esportazione in %1 non riuscita (%2)</translation>
</message>
<message>
<source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <translation>Esportazione in %1 riuscita (%2)</translation>
</message>
<message>
<source>Export to %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
+ <translation>Esporta in %1</translation>
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
- <translation type="unfinished"/>
+ <translation>Percorso multiplo di sorgente di importazione a %1 in %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <translation>Percorso di destinazione esportazione in conflitto %1 in %2</translation>
</message>
</context>
<context>
@@ -5277,7 +6860,7 @@ Comandi disponibili:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Scadenza tra &lt;b&gt;%n&lt;/b&gt; secondi</numerusform><numerusform>Scadenza tra &lt;b&gt;%n&lt;/b&gt; secondo(i)</numerusform></translation>
</message>
</context>
<context>
@@ -5289,15 +6872,15 @@ Comandi disponibili:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>NOTA: queste impostazioni TOTP sono personalizzate e potrebbero non funzionare con altri autenticatori.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation type="unfinished"/>
+ <translation>Si è verificato un errore durante la creazione del codice QR.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation type="unfinished"/>
+ <translation>Chiusura tra %1 secondi.</translation>
</message>
</context>
<context>
@@ -5307,10 +6890,6 @@ Comandi disponibili:
<translation>Imposta TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Chiave:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Impostazioni predefinite per il token RFC 6238</translation>
</message>
@@ -5340,27 +6919,57 @@ Comandi disponibili:
<translation>Dimensioni codice:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 cifre</translation>
+ <source>Secret Key:</source>
+ <translation>Chiave segreta:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>La chiave segreta deve essere in formato Base32</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Campo chiave segreta</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 cifre</translation>
+ <source>Algorithm:</source>
+ <translation>Algoritmo:</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 cifre</translation>
+ <source>Time step field</source>
+ <translation>Campo del passo temporale</translation>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation>cifre</translation>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation>Segreto TOTP non valido</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>È stata immessa una chiave segreta non valida. La chiave deve essere in formato Base32.
+Esempio: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Conferma rimozione impostazioni TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Sei sicuro di voler eliminare le impostazioni TOTP per questa voce?</translation>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation type="unfinished"/>
+ <translation>Verifica della disponibilità di aggiornamenti</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation type="unfinished"/>
+ <translation>Verifica disponibilità aggiornamenti in corso...</translation>
</message>
<message>
<source>Close</source>
@@ -5368,19 +6977,19 @@ Comandi disponibili:
</message>
<message>
<source>Update Error!</source>
- <translation type="unfinished"/>
+ <translation>Errore di aggiornamento!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation type="unfinished"/>
+ <translation>Si è verificato un errore durante il recupero delle informazioni sull&apos;aggiornamento.</translation>
</message>
<message>
<source>Please try again later.</source>
- <translation type="unfinished"/>
+ <translation>Riprova più tardi.</translation>
</message>
<message>
<source>Software Update</source>
- <translation type="unfinished"/>
+ <translation>Aggiornamento software</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
@@ -5388,7 +6997,7 @@ Comandi disponibili:
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 è ora disponibile — hai %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
@@ -5396,11 +7005,11 @@ Comandi disponibili:
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation type="unfinished"/>
+ <translation>Sei aggiornato!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 è attualmente la versione più recente disponibile</translation>
</message>
</context>
<context>
@@ -5433,6 +7042,14 @@ Comandi disponibili:
<source>Welcome to KeePassXC %1</source>
<translation>Benvenuto in KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importa da 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Aprire un database recente</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5442,19 +7059,27 @@ Comandi disponibili:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation type="unfinished"/>
+ <translation>YubiKey Risposta di verifica</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Se si possiede un &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, è possibile utilizzarlo per una maggiore sicurezza.&lt;/p&gt;&lt;p&gt;YubiKey richiede che uno dei suoi slot sia programmato come &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;Risposta di verifica HMAC-SHA1&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation type="unfinished"/>
+ <translation>Nessun YubiKey rilevato, si prega di assicurarsi che sia collegato.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
<translation>Nessun YubiKey inserito.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Aggiornare i token hardware</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Selezione degli slot delle chiavi hardware</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_ja.ts b/share/translations/keepassx_ja.ts
index 9c5903cf8..06acef9b2 100644
--- a/share/translations/keepassx_ja.ts
+++ b/share/translations/keepassx_ja.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>スタイルに準拠</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>設定をリセットしますか?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>全ての一般設定とセキュリティ設定をデフォルトにリセットしてもよろしいですか?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>KeePassXC のインスタンスを一つだけ起動する</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>最近使用したデータベースを記憶する</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>最近使用したキーファイルとセキュリティドングルを記憶する</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>起動時に前回のデータベースを読み込む</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>アプリケーション起動時にウィンドウを最小化する</translation>
</message>
@@ -152,7 +148,7 @@
</message>
<message>
<source>Automatically reload the database when modified externally</source>
- <translation>編集された際に自動でデータベースを再読み込みする</translation>
+ <translation>外部から編集された際に自動でデータベースを再読み込みする</translation>
</message>
<message>
<source>Entry Management</source>
@@ -163,10 +159,6 @@
<translation>エントリー作成時にグループのアイコンを使用する</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>クリップボードにコピーしたら最小化する</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>エントリーのプレビューパネルを非表示にする</translation>
</message>
@@ -192,11 +184,7 @@
</message>
<message>
<source>Hide window to system tray when minimized</source>
- <translation>最小化された際にシステムトレイへ格納する</translation>
- </message>
- <message>
- <source>Language</source>
- <translation>言語</translation>
+ <translation>最小化した際にシステムトレイへ格納する</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -232,20 +220,101 @@
<translation>自動入力開始までの遅延</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>アプリケーション起動時に更新を確認する</translation>
+ <source>Movable toolbar</source>
+ <translation>ツールバーを移動可能にする</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>以前使用したデータベースを記憶する</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>更新の確認にプレリリースを含める</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>起動時に前回開いたデータベースを読み込む</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>ツールバーを移動可能にする</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>データベースキーファイルとセキュリティドングルを記憶する</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>アプリケーション起動時に更新を確認する (週一回)</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>ベータ版も確認対象にする</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>ボタンのスタイル:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>言語:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(再起動が必要)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>データベースのロック解除後にウィンドウを最小化する</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>URL を開いたら最小化する</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>クリップボードにコピーしたらウィンドウを非表示にする</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>最小化</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>背後に移動</translation>
</message>
<message>
- <source>Button style</source>
- <translation>ボタンのスタイル</translation>
+ <source>Favicon download timeout:</source>
+ <translation>ファビコンダウンロードのタイムアウト:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>ウェブサイトアイコンダウンロードのタイムアウトまでの秒</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>秒</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>ツールバーボタンのスタイル</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>メモに等幅フォントを使用する</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>言語選択</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>設定をデフォルトにリセット</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>グローバル自動入力のショートカット</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>自動入力の文字入力時の遅延 (ミリ秒)</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>自動入力開始までの遅延 (ミリ秒)</translation>
</message>
</context>
<context>
@@ -281,11 +350,11 @@
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
- <translation>セッションがロックされたりラップトップが閉じられた際にデータベースをロックする</translation>
+ <translation>セッションをロックしたりラップトップを閉じた際にデータベースをロックする</translation>
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>セッションがロックされたりラップトップが閉じられた際に TouchID を消去する</translation>
+ <translation>セッションをロックしたりラップトップを閉じた際に TouchID を消去する</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@@ -293,7 +362,7 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>自動入力実行後に以前ロックされたデータベースを再ロックする</translation>
+ <translation>自動入力実行後に以前ロックしたデータベースを再ロックする</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
@@ -320,8 +389,29 @@
<translation>プライバシー</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>ウェブサイトのアイコンをダウンロードするためのフォールバックとして DuckDuckGo を使用する</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>ウェブサイトアイコンのダウンロードに DuckDuckGo のサービスを使用する</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>クリップボード消去までの時間 (秒)</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>未操作時の Touch ID リセット</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>データベースロックまでのタイムアウト (秒)</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>分</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>次の時間が過ぎたら検索クエリを消去する</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>ユーザー名をコピー(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>パスワードをコピー(&amp;P)</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>自動入力するエントリーを選択してください:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>検索...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 が以下の項目のパスワードへのアクセスを要求しました。
アクセスを許可するかどうかを選択してください。</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>アクセスを許可</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>アクセスを拒否</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Please select the correct database for saving credentials.</source>
<translation>このオプションは KeePassXC-Browser からデータベースにアクセスするために必要です</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>KeepassXC のブラウザー統合を有効にする</translation>
- </message>
- <message>
<source>General</source>
<translation>一般</translation>
</message>
@@ -534,17 +643,13 @@ Please select the correct database for saving credentials.</source>
<translation>資格情報を更新する前に確認しない(&amp;U)</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>選択されたデータベースのみがクライアントと接続する必要があります。</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>全ての開かれたデータベースから一致する資格情報を検索する(&amp;H)</translation>
+ <translation>開いた全てのデータベースから一致する資格情報を検索する(&amp;H)</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
- <translation>文字列フィールドの自動作成や自動更新はサポートされていません。</translation>
+ <translation>文字列フィールドの自動作成や自動更新はサポートしていません。</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>Tor Browser(&amp;T)</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;[警告]&lt;/b&gt; keepassxc-proxy アプリケーションが見つかりませんでした。&lt;br /&gt;KeePassXC のインストールディレクトリや、詳細設定でカスタムパスを確認してください。&lt;br /&gt;ブラウザー統合はプロキシアプリケーションが無いと動作しません。&lt;br /&gt;期待されるパス: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>実行ファイル</translation>
</message>
@@ -611,16 +712,60 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation>Snap によってサンドボックス化されているため、ブラウザー統合を有効にするにはスクリプトを実行する必要があります。&lt;br /&gt;スクリプトは次の場所から入手できます: %1</translation>
+ <translation>Snap によってサンドボックス化されているため、&lt;br /&gt;ブラウザー統合を有効にするにはスクリプトを実行する必要があります。&lt;br /&gt;スクリプトは次の場所から入手できます: %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation>ブラウザー拡張機能を使用するための次の手順を参照してください</translation>
+ <translation>ブラウザー拡張機能を使用するには以下の手順を参照してください</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>ブラウザー統合の動作には KeePassXC-Browser が必要です。&lt;br /&gt;KeePassXC-Browser は %1 用と %2 用の2種類あります。%3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>Brave(&amp;B)</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>期限切れの資格情報を返します。タイトルに [期限切れ] という文字列が追加されます。</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>期限切れの資格情報を返すことを許可する(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>ブラウザー統合を有効にする</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Snap 形式のブラウザーは現在サポートしていません。</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>拡張機能に接続された全てのデータベースが一致する資格情報を返します。</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>レガシーな KeePassHTTP の設定を移行するためのポップアップを表示しないようにします。</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>KeePassHTTP の設定移行を確認しない(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>カスタムプロキシの場所フィールド</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>カスタムプロキシファイルブラウザー</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;[警告]&lt;/b&gt; keepassxc-proxy アプリケーションが見つかりませんでした。&lt;br /&gt;KeePassXC のインストールディレクトリや、詳細設定でカスタムパスを確認してください。&lt;br /&gt;ブラウザー統合はプロキシアプリケーションが無いと動作しません。&lt;br /&gt;期待されるパス: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -692,7 +837,7 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation>KeePassXC: レガシーなブラウザー統合の設定が検出されました</translation>
+ <translation>KeePassXC: レガシーなブラウザー統合の設定を検出しました</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
これはブラウザーとの接続を維持するのに必要です。
既存の設定を移動しますか?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>今後この警告を表示しない</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>最初のレコードがフィールド名</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>破棄する先頭行の数</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>エスケープ文字 &apos;\&apos; を考慮する</translation>
</message>
@@ -814,11 +959,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation>CSV ファイルでエラーが検出されました</translation>
+ <translation>CSV ファイルでエラーを検出しました!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n 個のメッセージがスキップされました]</numerusform></translation>
+ <translation><numerusform>[%n 個のメッセージをスキップしました]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -826,6 +971,22 @@ Would you like to migrate your existing settings now?</source>
<translation>CSV のインポート: ライターにエラーがあります:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>テキスト修飾</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>フィールドの区切り</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>破棄するヘッダー行数</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV インポートプレビュー</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -867,17 +1028,35 @@ Would you like to migrate your existing settings now?</source>
<translation>データベースの読み込み中にエラーが発生しました: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>データベースのファイル名が無いため、保存できませんでした。</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
- <translation>ファイルは読み取り専用モードで開かれているため書き込むことはできません。</translation>
+ <translation>読み取り専用モードでファイルを開いているため書き込むことはできません。</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>キーは変換されません。これはバグなので、開発者への報告をお願いします。</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+データベースのバックアップ場所: %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>対象のデータベースファイルは正常ではないため、保存できませんでした。</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>対象のデータベースファイルは読み取り専用なため、保存できませんでした。</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>データベースファイルにマージしていない変更があります。</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>ゴミ箱</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1068,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>マスターキーの入力</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>キーファイル:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>パスワード:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>参照</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>再読み込み</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>チャレンジレスポンス:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>レガシーなキーファイル形式</translation>
</message>
@@ -922,7 +1085,7 @@ unsupported in the future.
Please consider generating a new key file.</source>
<translation>レガシーなキーファイル形式は将来的に、
-サポートされなくなる可能性があります。
+サポートしなくなる可能性があります。
新しいキーファイルの生成を検討してください。</translation>
</message>
@@ -943,20 +1106,99 @@ Please consider generating a new key file.</source>
<translation>キーファイルを選択</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID で素早くロックを解除</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>キーファイルを開くのに失敗しました: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>データベースを開けません:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>スロットを選択...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>キーファイルを開けません:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>KeePassXC データベースのロック解除</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>パスワードを入力してください:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>パスワードフィールド</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>パスワードの表示/非表示を切り替え</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>追加の資格情報を入力してください:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>キーファイルを選択</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>ハードウェアキースロットを選択</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>キーファイルを探す</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>参照...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>ハードウェアトークンを更新</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>ハードウェアキー:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;スロットを HMAC-SHA1 用に設定した &lt;strong&gt;YubiKey&lt;/strong&gt; や &lt;strong&gt;OnlyKey&lt;/strong&gt; をハードウェアセキュリティキーとして使用できます。&lt;/p&gt;
+ &lt;p&gt;詳しくはクリックしてください...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>ハードウェアキーのヘルプ</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID で素早くロックを解除する</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>消去</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>キーファイルを消去</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>ファイルを選択...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>パスワードが未指定なためロックの解除に失敗しました</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>パスワードを入力しなかったため、データベースのロック解除に失敗しました。再試行しますか?
+
+このエラーを防ぐには、&quot;データベースの設定&quot; を開き、&quot;セキュリティ&quot; でパスワードをリセットする必要があります。</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>空のパスワードで再試行</translation>
</message>
</context>
<context>
@@ -986,7 +1228,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Encryption Settings</source>
- <translation>暗号化設定</translation>
+ <translation>暗号化の設定</translation>
</message>
<message>
<source>Browser Integration</source>
@@ -1061,11 +1303,11 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
- <translation>KeePassXC: データベースからキーが削除されました</translation>
+ <translation>KeePassXC: データベースからキーを削除しました</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>KeePassXC の設定から %n 個の暗号化キーが正常に削除されました。</numerusform></translation>
+ <translation><numerusform>KeePassXC の設定から %n 個の暗号化キーを正常に削除しました。</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1079,7 +1321,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>Removing stored permissions…</source>
- <translation>保存されたアクセス許可を削除しています…</translation>
+ <translation>保存したアクセス許可を削除しています…</translation>
</message>
<message>
<source>Abort</source>
@@ -1087,11 +1329,11 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>KeePassXC: Removed permissions</source>
- <translation>KeePassXC: アクセス許可が削除されました</translation>
+ <translation>KeePassXC: アクセス許可を削除しました</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>%n 個のエントリーからアクセス許可が正常に削除されました。</numerusform></translation>
+ <translation><numerusform>%n 個のエントリーからアクセス許可を正常に削除しました。</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1111,6 +1353,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>本当にレガシーなブラウザー統合のデータを最新の標準に移行しますか?
これはブラウザープラグインとの互換性維持に必要です。</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>保存したブラウザーキー</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>選択したキーを削除</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1227,16 +1477,16 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>KDF unchanged</source>
- <translation>KDF は変更されません</translation>
+ <translation>KDF は変更しません</translation>
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation>新しい KDF のパラメーターでのキー変換に失敗しました。KDF は変更されません。</translation>
+ <translation>新しい KDF のパラメーターでのキー変換に失敗しました。KDF を変更しません。</translation>
</message>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform></translation>
+ <translation><numerusform>MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
@@ -1253,6 +1503,57 @@ If you keep this number, your database may be too easy to crack!</source>
<comment>seconds</comment>
<translation><numerusform>%1 秒</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>既存の復号化時間を変更</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>復号化時間 (秒)</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>データベースの形式</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>暗号化アルゴリズム</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>鍵導出関数</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>変換回数</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>メモリ使用量</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>並列処理</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>公開するエントリー</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>このデータベースを公開しない(&amp;X)</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>このグループ下のエントリーを公開する(&amp;U):</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>これらの設定にアクセスするには、fd.o シークレットサービスを有効にしてください。</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1300,6 +1601,40 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>圧縮を有効にする (推奨)(&amp;C)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>データベース名フィールド</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>データベースの概要フィールド</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>デフォルトのユーザー名フィールド</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>エントリー毎の履歴アイテムの最大数</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>エントリー毎の履歴の最大サイズ</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>ゴミ箱を削除</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>ゴミ箱とその内容を削除しますか?
+これは元に戻すことができません。</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation> (旧)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1341,7 +1676,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>No encryption key added</source>
- <translation>追加された暗号化キーはありません</translation>
+ <translation>追加した暗号化キーはありません</translation>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
@@ -1367,6 +1702,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>マスターキーの変更に失敗しました</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>パスワードなしで続行</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1717,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>概要:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>データベース名フィールド</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>データベースの概要フィールド</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>統計</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>エラーアイコンがある行にマウスオーバーすると詳細を表示します。</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名前</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>値</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>データベース名</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>概要</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>場所</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>最終更新日時</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>変更の未保存</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>はい</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>いいえ</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>データベースは変更済みですが、まだディスクに保存していません。</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>グループ数</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>エントリー数</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>期限切れエントリー数</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>データベースに期限切れのエントリーが含まれています。</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>固有パスワード</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>非固有パスワード</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>10% 以上のパスワードが使い回されています。可能な限り、それ専用のパスワードを使用してください。</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>パスワード使い回しの最大数</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>一部のパスワードが3回以上使い回されています。可能な限り、それ専用のパスワードを使用してください。</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>短いパスワードの数</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>推奨最小パスワード長は最低8文字です。</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>脆弱なパスワードの数</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>「良い」または「すばらしい」評価の長くてランダムなパスワードの使用を推奨します。</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>平均パスワード長</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1文字</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>パスワード長の平均値が10文字以下です。パスワードは長いほどセキュリティが向上します。</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1411,7 +1873,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Export database to CSV file</source>
- <translation>データベースを CSV ファイルにエクスポートする</translation>
+ <translation>データベースを CSV ファイルへエクスポート</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
@@ -1424,14 +1886,10 @@ Are you sure you want to continue without a password?</source>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation>作成されたデータベースはキーや KDF が無いため保存しません。
+ <translation>作成したデータベースはキーや KDF が無いため保存しません。
これは確実にバグなので、開発者への報告をお願いします。</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>データベースファイルは存在しないか、アクセスできません。</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>CSV ファイルを選択</translation>
</message>
@@ -1454,6 +1912,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [読み取り専用]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>%1 は存在しないかアクセス可能ではないため、開くのに失敗しました。</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>データベースを HTML ファイルへエクスポート</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML ファイル</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>HTML ファイルの書き込みに失敗しました。</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>エクスポートの確認</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>データベースを暗号化せずにファイルへエクスポートしようとしています。これはパスワードや機密情報が脆弱な状態に置かれることを意味します。続行してもよろしいですか?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1544,10 +2026,6 @@ Do you want to merge your changes?</source>
<translation><numerusform>エントリーをゴミ箱に移動しますか?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>読み取り専用でファイルを開きました。</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>データベースをロックしますか?</translation>
</message>
@@ -1558,13 +2036,13 @@ Do you want to merge your changes?</source>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
- <translation>&quot;%1&quot; は更新されています。
+ <translation>&quot;%1&quot; が更新されました。
変更を保存しますか?</translation>
</message>
<message>
<source>Database was modified.
Save changes?</source>
- <translation>データベースは更新されています。
+ <translation>データベースが更新されました。
変更を保存しますか?</translation>
</message>
<message>
@@ -1588,12 +2066,6 @@ Disable safe saves and try again?</source>
安全な保存を無効にして再試行しますか?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>データベースの書き込みに失敗しました。
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>パスワード</translation>
</message>
@@ -1627,7 +2099,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation>データベースファイルは正常にマージされました。</translation>
+ <translation>データベースファイルを正常にマージしました。</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
@@ -1637,6 +2109,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation>共有グループ...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>データベースへの書き込みに失敗しました: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>このデータベースは読み取り専用モードで開いています。自動保存は無効です。</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1734,7 +2214,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Entry updated successfully.</source>
- <translation>エントリーは正常に更新されました。</translation>
+ <translation>エントリーを正常に更新しました。</translation>
</message>
<message>
<source>Entry has unsaved changes</source>
@@ -1756,6 +2236,18 @@ Disable safe saves and try again?</source>
<source>Confirm Removal</source>
<translation>削除の確認</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>ブラウザー統合</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>この URL を削除してもよろしいですか?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1795,6 +2287,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>背景色:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>属性選択</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>属性値</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>新しい属性を追加</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>選択した属性を削除</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>属性名を編集</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>属性の保護を切り替え</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>保護された属性を表示</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>前景色選択</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>背景色選択</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1830,6 +2358,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation>この関連付けに特定のシーケンスを使用する:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>カスタム自動入力シーケンス</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>自動入力のヘルプウェブページを開く</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>既存のウィンドウ関連付け</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>新しいウィンドウ関連付けを追加</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>選択したウィンドウ関連付けを削除</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>アスタリスク (*) を使用すると全てに一致させることができます</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>ウィンドウ関連付けのタイトルを設定</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>アスタリスクを使用すると全てに一致させることができます</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>このウィンドウのカスタム自動入力シーケンス</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>これらの設定はエントリーの挙動 (ブラウザー拡張機能) に影響します。</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>一般</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>このエントリーの自動送信をスキップする</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>このエントリーをブラウザー拡張機能から非表示にする</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>追加の URL</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>追加</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>削除</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>編集</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2448,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>全て削除</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>エントリーの履歴選択</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>選択した履歴の時点でのエントリーの状態を表示</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>エントリーを選択した履歴の状態に復元</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>選択した履歴を削除</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>全ての履歴を削除</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2507,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>期限</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>URL フィールド</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>URL 用のファビコンをダウンロード</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>パスワード再入力フィールド</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>パスワード生成を切り替え</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>パスワードフィールド</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>パスワードの表示/非表示を切り替え</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>メモの表示を切り替え</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>有効期限フィールド</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>有効期限のプリセット</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>有効期限のプリセット</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>メモフィールド</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>タイトルフィールド</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>ユーザー名フィールド</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>有効期限を切り替え</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1909,7 +2584,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
- <translation>データベースが閉じられたりロックされた際にエージェントからキーを削除する</translation>
+ <translation>データベースを閉じたりロックした際にエージェントからキーを削除する</translation>
</message>
<message>
<source>Public key</source>
@@ -1917,7 +2592,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation>データベースが開かれたりロックが解除された際にエージェントにキーを追加する</translation>
+ <translation>データベースを開いたりロックを解除した際にエージェントにキーを追加する</translation>
</message>
<message>
<source>Comment</source>
@@ -1962,7 +2637,23 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Require user confirmation when this key is used</source>
- <translation>このキーが使用される際にユーザーの確認を必要とする</translation>
+ <translation>このキーを使用する際に必ずユーザーに確認する</translation>
+ </message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>指定秒経過後にエージェントからキーを削除</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>キーファイルブラウザー</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>外部キーファイル</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>添付ファイルを選択</translation>
</message>
</context>
<context>
@@ -1999,6 +2690,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>親グループ &quot;(%1)&quot; から引き継ぐ</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>エントリーに未保存の変更があります</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,68 +2722,99 @@ Disable safe saves and try again?</source>
<translation>非アクティブ</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>パスからインポート</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare 未署名コンテナ</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare 署名コンテナ</translation>
+ </message>
+ <message>
+ <source>Select import source</source>
+ <translation>インポートソースを選択</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>パスにエクスポート</translation>
+ <source>Select export target</source>
+ <translation>エクスポート対象を選択</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>パスと同期</translation>
+ <source>Select import/export file</source>
+ <translation>インポート/エクスポートファイルを選択</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>このバージョンの KeePassXC は現在のコンテナ形式の共有をサポートしていません。%1 を使用してください。</translation>
+ <source>Clear</source>
+ <translation>消去</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>データベースの共有は無効です</translation>
+ <source>Import</source>
+ <translation>インポート</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>データベースのエクスポートは無効です</translation>
+ <source>Export</source>
+ <translation>エクスポート</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>データベースのインポートは無効です</translation>
+ <source>Synchronize</source>
+ <translation>同期</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare 未署名コンテナ</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>このバージョンの KeePassXC はこのコンテナ形式の共有をサポートしていません。
+サポートしている拡張機能: %1.</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare 署名コンテナ</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 は既にこのデータベースでエクスポート済みです。</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>インポートソースを選択</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 は既にこのデータベースでインポート済みです。</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>エクスポート対象を選択</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 は既にこのデータベースの他のグループでインポート/エクスポート済みです。</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>インポート/エクスポートファイルを選択</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare は現在無効です。設定でインポートとエクスポートを有効にできます。</translation>
</message>
<message>
- <source>Clear</source>
- <translation>消去</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>現在データベースのエクスポートは設定で無効になっています。</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>エクスポートするコンテナ %1 は既に参照されています。</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>現在データベースのインポートは設定で無効になっています。</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>インポートするコンテナ %1 は既にインポートされています。</translation>
+ <source>Sharing mode field</source>
+ <translation>共有モードフィールド</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation type="unfinished"/>
+ <source>Path to share file field</source>
+ <translation>共有ファイルパスフィールド</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>共有ファイルブラウザー</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>パスワードフィールド</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>パスワードの表示/非表示を切り替え</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>パスワード生成を切り替え</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>消去フィールド</translation>
</message>
</context>
<context>
@@ -2121,6 +2847,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>デフォルトの自動入力シーケンスを設定する(&amp;Q)</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>名前フィールド</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>メモフィールド</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>有効期限を切り替え</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>これとサブグループの自動入力を切り替え</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>有効期限フィールド</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>これとサブグループの検索を切り替え</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>デフォルトの自動入力シーケンスフィールド</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2157,22 +2911,10 @@ Disable safe saves and try again?</source>
<translation>全てのファイル</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>カスタムアイコンは既に存在します</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>削除の確認</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>カスタムアイコンは正常にダウンロードされました</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>ヒント: ツール &gt; 設定 &gt; セキュリティから DuckDuckGo をフォールバックとして有効にすることができます</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>画像を選択</translation>
</message>
@@ -2196,6 +2938,42 @@ Disable safe saves and try again?</source>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>このアイコンは %n 個のエントリーで使用されており、デフォルトのアイコンに置き換えられます。本当に削除してもよろしいですか?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>ツール -&gt; 設定 -&gt; セキュリティで DuckDuckGo ウェブサイトアイコンサービスを有効にできます</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>URL 用のファビコンをダウンロード</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>選択したアイコンをサブグループとエントリーに適用</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>アイコンを適用(&amp;T)...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>これにのみ適用</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>子グループにも適用</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>子エントリーにも適用</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>全ての子に適用</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>選択したアイコンは既存です。</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2241,6 +3019,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>値</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>作成日時</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>更新日時</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>アクセス日時</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>固有 ID</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>プラグインデータ</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>選択したプラグインデータを削除</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2336,6 +3138,26 @@ This may cause the affected plugins to malfunction.</source>
<translation><numerusform>ファイルを開けません:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>添付ファイル</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>新しい添付ファイルを追加</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>選択した添付ファイルを削除</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>選択した添付ファイルを開く</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>選択した添付ファイルをディスクに保存</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2388,7 +3210,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Never</source>
- <translation>なし</translation>
+ <translation>常にしない</translation>
</message>
<message>
<source>Password</source>
@@ -2430,10 +3252,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>TOTP トークンを生成</translation>
- </message>
- <message>
<source>Close</source>
<translation>閉じる</translation>
</message>
@@ -2495,7 +3313,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Never</source>
- <translation>なし</translation>
+ <translation>常にしない</translation>
</message>
<message>
<source>[PROTECTED]</source>
@@ -2518,6 +3336,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>共有</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>現在の TOTP 値を表示</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>詳細設定</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2551,11 +3377,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>ゴミ箱</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>データベース &quot;%2&quot; のエントリー &quot;%1&quot; が %3 に使用されました</translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>%1 で DBus サービスの登録に失敗しました: 他のシークレットサービスが実行中です。</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n 個のエントリーが %1 に使用されました</numerusform></translation>
</message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo シークレットサービス: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2574,6 +3422,59 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>ファビコンをダウンロード</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>キャンセル</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>アイコンのダウンロードに問題がありましたか?
+設定のセキュリティセクションで DuckDuckGo ウェブサイトアイコンサービスを有効にできます。</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>閉じる</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>ステータス</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>エントリー一覧を処理中です、しばらくお待ちください...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>ダウンロード中...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>既に存在します</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>ダウンロードに失敗しました</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>ファビコンをダウンロード中 (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2595,10 +3496,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>チャレンジレスポンスを発行することができません。</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>キーが間違っているかデータベースファイルが破損しています。</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>データベースのヘッダーがありません</translation>
</message>
@@ -2618,6 +3515,12 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>ヘッダーデータ長が不正です</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>不正な資格情報です。再試行してください。
+これが再発した場合は、データベースファイルが破損している可能性があります。</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2649,10 +3552,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>ヘッダー SHA256 が一致しません</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>キーが間違っているかデータベースファイルが破損しています (HMAC の不一致)。</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>不明な暗号です</translation>
</message>
@@ -2752,6 +3651,16 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>VariantMap のフィールドタイプのサイズが不正です</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>不正な資格情報です。再試行してください。
+これが再発した場合は、データベースファイルが破損している可能性があります。</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC が一致しません)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2821,10 +3730,10 @@ This may cause the affected plugins to malfunction.</source>
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) です。
+ <translation>選択したファイルは古い KeePass 1 のデータベース (.kdb) です。
データベース &gt; &apos;KeePass 1 データベースをインポート...&apos; をクリックすることでインポートできます。
-これは一方向の移行操作であり、インポートされたデータベースは古い KeePassX 0.4 のバージョンでは開くことはできません。</translation>
+これは一方向の移行操作であり、インポートしたデータベースは古いバージョンである KeePassX 0.4 では開くことはできません。</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
@@ -2974,13 +3883,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>KeePass1 データベースをインポート</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>データベースを開けません。</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>KeePass1 データベースをインポート</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3038,10 +3947,6 @@ Line %2, column %3</source>
<translation>マスターキーを計算できません</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>キーが間違っているかデータベースファイルが破損しています。</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>キー変換に失敗しました</translation>
</message>
@@ -3137,40 +4042,58 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>内容の位置にシークできません</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>不正な資格情報です。再試行してください。
+これが再発した場合は、データベースファイルが破損している可能性があります。</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>共有無効</translation>
+ <source>Invalid sharing reference</source>
+ <translation>共有の参照が不正です</translation>
</message>
<message>
- <source>Import from</source>
- <translation>インポート</translation>
+ <source>Inactive share %1</source>
+ <translation>共有 %1 は非アクティブです</translation>
</message>
<message>
- <source>Export to</source>
- <translation>エクスポート</translation>
+ <source>Imported from %1</source>
+ <translation>%1 からインポートしました</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>同期</translation>
+ <source>Exported to %1</source>
+ <translation>%1 にエクスポートしました</translation>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation>%1 と同期しました</translation>
+ </message>
+ <message>
+ <source>Import is disabled in settings</source>
+ <translation>インポートは設定で無効になっています</translation>
+ </message>
+ <message>
+ <source>Export is disabled in settings</source>
+ <translation>エクスポートは設定で無効になっています</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>共有 %1 を無効にする</translation>
+ <source>Inactive share</source>
+ <translation>非アクティブな共有</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>共有 %1 からインポートする</translation>
+ <source>Imported from</source>
+ <translation>インポート元</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>共有 %1 にエクスポートする</translation>
+ <source>Exported to</source>
+ <translation>エクスポート先</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>共有 %1 と同期</translation>
+ <source>Synchronized with</source>
+ <translation>同期先</translation>
</message>
</context>
<context>
@@ -3215,10 +4138,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>参照</translation>
- </message>
- <message>
<source>Generate</source>
<translation>生成</translation>
</message>
@@ -3228,7 +4147,7 @@ Line %2, column %3</source>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation>&lt;p&gt;セキュリティ対策でランダムバイトを含むキーファイルを追加できます。&lt;/p&gt;&lt;p&gt;キーファイルは誰にも知られず、無くさないようにしてください。そうしないとロックアウトされることになりかねません。&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;セキュリティ対策でランダムバイトを含むキーファイルを追加できます。&lt;/p&gt;&lt;p&gt;キーファイルは誰にも知られず、絶対に無くさないよう注意してください。&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
@@ -3240,7 +4159,7 @@ unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
<translation>レガシーなキーファイル形式は将来的に、
-サポートされなくなる可能性があります。
+サポートしなくなる可能性があります。
マスターキーの設定で新しいキーファイルを生成してください。</translation>
</message>
@@ -3274,6 +4193,44 @@ Message: %2</source>
<source>Select a key file</source>
<translation>キーファイルを選択</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>キーファイルを選択</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>キーファイルを探す</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>参照...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>新しいキーファイルを生成</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>メモ: 内容が変更される可能性があるファイルを使用すると、データベースのロックを解除できなくなる恐れがあります。</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>不正なキーファイルです</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>現在のデータベース自身をキーファイルにすることはできません。他のファイルを選択するか、新しいキーファイルを生成してください。</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>怪しいキーファイルです</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>選択したキーファイルはパスワードデータベースファイルだと思われます。キーファイルは絶対に変更されることがない、静的なファイルである必要があります。変更される可能性があるファイルでは、データベースに永久にアクセスできなくなる恐れがあります。
+このファイルで続行してもよろしいですか?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3362,10 +4319,6 @@ Message: %2</source>
<translation>設定(&amp;S)</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>パスワード生成</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>データベースをロック(&amp;L)</translation>
</message>
@@ -3552,14 +4505,6 @@ KeePassXC の配布ページから AppImage をダウンロードして使用す
<translation>TOTP QR コードを表示...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>更新を確認...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>エントリーを共有</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>メモ: KeePassXC のプレリリース版を使用しています。
@@ -3577,6 +4522,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>更新の確認はいつでもメニューから手動で実行できます。</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>エクスポート(&amp;E)</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>更新を確認(&amp;C)...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>全てのファビコンをダウンロード(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>並べ替え (A-Z)(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>並べ替え (Z-A)(&amp;Z)</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>パスワード生成(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>ファビコンをダウンロード</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>HTML ファイルへエクスポート(&amp;E)...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password 保管庫...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>1Password 保管庫をインポート</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>スタートガイド(&amp;G)</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>スタートガイド PDF を開く</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>オンラインヘルプ(&amp;O)...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>ブラウザーでオンラインドキュメントを開く</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>ユーザーガイド(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>ユーザーガイド PDF を開く</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>キーボードショートカット(&amp;K)</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3594,7 +4607,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation>データベース &quot;%1&quot; からマージされた古いエントリー</translation>
+ <translation>データベース &quot;%1&quot; からマージした古いエントリー</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
@@ -3630,12 +4643,20 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Changed deleted objects</source>
- <translation>削除されたオブジェクトを変更</translation>
+ <translation>削除したオブジェクトを変更</translation>
</message>
<message>
<source>Adding missing icon %1</source>
<translation>存在しないアイコン %1 を追加</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>カスタムデータ %1 [%2] を削除</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>カスタムデータ %1 [%2] を追加</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3706,6 +4727,73 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>ヘッダーがない不正な OpData01 です</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>%1 / 16 しか取得できなかったため IV を読み取れません</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>opdata01 の暗号を init できません: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>HMAC 署名を読み取れません</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>データベースの読み取りはインスタンスをプロデュースしませんでした
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>ディレクトリ .opvault が存在する必要があります</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>ディレクトリ .opvault は読み取り可能である必要があります</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>ディレクトリ .opvault/default が存在する必要があります</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>ディレクトリ .opvault/default は読み取り可能である必要があります</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>masterKey をデコードできません: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>マスターキーを導出できません: %1</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3805,10 +4893,21 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>パスワードが一致しません</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>今の所パスワードは一致しています</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
- <translation>パスワードを入力:</translation>
+ <translation>パスワードを入力してください:</translation>
</message>
<message>
<source>Confirm password:</source>
@@ -3830,6 +4929,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>マスターパスワードを生成</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>パスワードフィールド</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>パスワードの表示/非表示を切り替え</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>パスワード再入力フィールド</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>パスワード生成を切り替え</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3859,22 +4974,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>文字種</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>大文字</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>小文字</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>数字</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>特殊文字</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>拡張 ASCII</translation>
</message>
@@ -3955,18 +5058,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>詳細設定</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>大文字の A ~ F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>小文字の A ~ F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3999,18 +5094,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>数学記号</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>ダッシュ</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4058,6 +5145,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>再生成</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>生成されたパスワード</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>大文字</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>小文字</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>特殊文字</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>数式シンボル</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>ダッシュやスラッシュ</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>除外される文字</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>16進数パスワード</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>パスワード長</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>単語の大小文字:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>パスワードを再生成</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>パスワードをコピー</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>パスワードを受容</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>小文字</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>大文字</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>先頭文字のみ大文字</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>パスワードの表示/非表示を切り替え</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4065,12 +5220,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>選択</translation>
+ <source>Statistics</source>
+ <translation>統計</translation>
</message>
</context>
<context>
@@ -4107,12 +5259,16 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>マージ</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>続行</translation>
+ </message>
</context>
<context>
<name>QObject</name>
<message>
<source>Database not opened</source>
- <translation>データベースが開かれていません</translation>
+ <translation>データベースを開いていません</translation>
</message>
<message>
<source>Database hash not available</source>
@@ -4199,10 +5355,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>エントリーのパスワードを生成する。</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>生成するパスワードの長さ。</translation>
- </message>
- <message>
<source>length</source>
<translation>長さ</translation>
</message>
@@ -4252,24 +5404,12 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>パスワードの詳細な分析を実行する。</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>データベースの内容を展開して出力する。</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>展開するデータベースのパス。</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>%1 のロックを解除するパスワードを入力してください: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>警告: レガシーなキーファイル形式は将来的に、
-サポートされなくなる可能性があります。
+サポートしなくなる可能性があります。
新しいキーファイルの生成を検討してください。</translation>
</message>
@@ -4308,10 +5448,6 @@ Available commands:
<translation>2つのデータベースをマージする。</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>マージ先のデータベースのパス。</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>マージ元のデータベースのパス。</translation>
</message>
@@ -4388,10 +5524,6 @@ Available commands:
<translation>ブラウザー統合</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey [%1] のチャレンジレスポンス - スロット %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Press</translation>
</message>
@@ -4422,10 +5554,6 @@ Available commands:
<translation>新しいランダムなパスワードを生成する。</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>%1 はパスワードの長さとして適正な値ではありません。</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>パス %1 のエントリーを作成できませんでした。</translation>
</message>
@@ -4439,7 +5567,7 @@ Available commands:
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation>エントリー %1 は正常に追加されました。</translation>
+ <translation>エントリー %1 を正常に追加しました。</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
@@ -4459,11 +5587,11 @@ Available commands:
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation>エントリーの現在の TOTP がクリップボードにコピーされました。</translation>
+ <translation>エントリーの現在の TOTP をクリップボードにコピーしました。</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation>エントリーのパスワードがクリップボードにコピーされました。</translation>
+ <translation>エントリーのパスワードをクリップボードにコピーしました。</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
@@ -4471,7 +5599,7 @@ Available commands:
</message>
<message>
<source>Clipboard cleared!</source>
- <translation>クリップボードは消去されました。</translation>
+ <translation>クリップボードを消去しました。</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
@@ -4483,10 +5611,6 @@ Available commands:
<translation>カウント</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>パスワードの長さの値が不正です: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>パス %1 のエントリーを見つけられませんでした。</translation>
</message>
@@ -4504,7 +5628,7 @@ Available commands:
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation>エントリー %1 は正常に編集されました。</translation>
+ <translation>エントリー %1 を正常に編集しました。</translation>
</message>
<message>
<source>Length %1</source>
@@ -4611,26 +5735,6 @@ Available commands:
<translation>キーファイル %1 の読み込みに失敗しました: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>ファイル %1 は存在しません。</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>ファイル %1 を開けません。</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>データベースの読み込み中にエラーが発生しました:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>データベースの解析中にエラーが発生しました:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>生成されるパスワードの長さ</translation>
</message>
@@ -4643,10 +5747,6 @@ Available commands:
<translation>大文字を使用する</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>数字を使用する。</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>特殊文字を使用する</translation>
</message>
@@ -4668,7 +5768,7 @@ Available commands:
</message>
<message>
<source>Include characters from every selected group</source>
- <translation>選択された各グループの文字を含む</translation>
+ <translation>選択した各グループの文字を含む</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
@@ -4694,11 +5794,11 @@ Available commands:
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation>エントリー %1 は正常にリサイクルされました。</translation>
+ <translation>エントリー %1 を正常にゴミ箱へ移動しました。</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation>エントリー %1 は正常に削除されました。</translation>
+ <translation>エントリー %1 を正常に削除しました。</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
@@ -4710,7 +5810,7 @@ Available commands:
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation>クリップボード操作用プログラムとして定義されていません</translation>
+ <translation>クリップボード操作用プログラムとして定義していません</translation>
</message>
<message>
<source>Unable to start program %1</source>
@@ -4780,7 +5880,7 @@ Available commands:
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation>キーが設定されていません。データベースの作成を中止します。</translation>
+ <translation>キーを設定していません。データベースの作成を中止します。</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
@@ -4788,11 +5888,7 @@ Available commands:
</message>
<message>
<source>Successfully created new database.</source>
- <translation>新しいデータベースは正常に作成されました。</translation>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>データベースを暗号化するパスワードを入力してください (空のままにする場合は Enter を押してください): </translation>
+ <translation>新しいデータベースを正常に作成しました。</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
@@ -4803,10 +5899,6 @@ Available commands:
<translation>キーファイル %1 の読み込みに失敗しました: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>データベースからエントリーを削除する。</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>削除するエントリーのパス。</translation>
</message>
@@ -4862,6 +5954,330 @@ Available commands:
<source>Cannot create new group</source>
<translation>新しいグループを作成できません</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>データベースのパスワードキーを無効にする。</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>デバッグ情報を表示する。</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>マージ元データベースのパスワードキーを無効にする。</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>バージョン %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>ビルド形式: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>リビジョン: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>配布形式: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>デバッグモードが無効です。</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>デバッグモードが有効です。</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>オペレーティングシステム: %1
+CPU アーキテクチャー: %2
+カーネル: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>自動入力</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (署名共有と未署名共有)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (署名共有のみ)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (未署名共有のみ)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>なし</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>有効な拡張機能:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>暗号化ライブラリ:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>データベースに新しいグループを追加する。</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>追加するグループのパス。</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>グループ %1 は既に存在します!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>グループ %1 が見つかりません。</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>グループ %1 を正常に追加しました。</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>パスワードが公に流出しているか確認する。FILENAME は、https://haveibeenpwned.com/Passwords で利用可能な HIBP 形式 (流出したパスワードの SHA-1 ハッシュのリスト) のファイルのパスである必要があります。</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>FILENAME</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>パスワードの脆弱性や問題点を解析する。</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>HIBP ファイル %1 を開くのに失敗しました: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>HIBP ファイルを対象にデータベースのエントリーを評価中です。しばらく時間がかかります...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>現在開いているデータベースを閉じる。</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>このヘルプを表示する。</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>データベース暗号化に使用する Yubikey のスロット。</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>スロット</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>単語数 %1 は不正です</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>単語リストが小さすぎます (&lt; 1000 アイテム)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>対話モードを終了する。</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>エクスポート時に使用するフォーマット。デフォルトは xml で、csv も選択可能です。</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>データベースの内容を指定した形式で標準出力にエクスポートする。</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>データベースを XML にエクスポートできません: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>%1 はサポートしていないフォーマットです</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>数字を使用する</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>%1 はパスワード長として不正です</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>コマンドヘルプを表示する</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>利用可能なコマンド:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>XML データベースの内容をインポートする。</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>XML データベースエクスポートのパス。</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>新しいデータベースのパス。</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>データベースを正常にインポートしました。</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>%1 は不明なコマンドです</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>出力をフラットな単一行にする。</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>マージ処理で検出した変更のみを出力する。</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>2つ目のデータベース用の Yubikey スロット。</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>%1 を %2 へ正常にマージしました。</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>データベースはマージ処理で更新されませんでした。</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>エントリーを新しいグループに移動する。</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>移動するエントリーのパス。</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>移動先グループのパス。</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>パス %1 のグループが見つかりませんでした。</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>エントリーは既にグループ %1 に存在します。</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>エントリー %1 をグループ %2 へ正常に移動しました。</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>データベースを開く。</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>削除するグループのパス。</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>データベースからルートグループを削除することはできません。</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>グループ %1 を正常にゴミ箱へ移動しました。</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>グループ %1 を正常に削除しました。</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>データベースファイル %1 を開くのに失敗しました: 見つかりません</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>データベースファイル %1 を開くのに失敗しました: プレーンなファイルではありません</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>データベースファイル %1 を開くのに失敗しました: 読み取り可能ではありません</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>%1 のロックを解除するためのパスワードを入力してください: </translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>YubiKey のスロット %1 は不正です</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>YubiKey のボタンにタッチして %1 のロックを解除してください</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>データベースを暗号化するためのパスワードを入力してください (オプション): </translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>HIBP ファイルの %1 行目: パースエラー</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>シークレットサービス統合</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>ユーザー名</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] チャレンジレスポンス - スロット %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>&apos;%1&apos; のパスワードは %2 回流出しました!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4909,11 +6325,11 @@ Available commands:
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation>エージェントが実行されていないため、Identity を追加できません。</translation>
+ <translation>エージェントが実行中でないため、Identity を追加できません。</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation>エージェントが実行されていないため、Identity を削除できません。</translation>
+ <translation>エージェントが実行中でないため、Identity を削除できません。</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
@@ -4921,7 +6337,7 @@ Available commands:
</message>
<message>
<source>The key has already been added.</source>
- <translation>キーが既に追加されている。</translation>
+ <translation>キーは既に追加済みです。</translation>
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
@@ -5016,6 +6432,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>オプション</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>KeepassXC Freedesktop.org シークレットサービス統合を有効にする</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>一般</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>資格情報が要求された際に通知を表示する</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;データベースのゴミ箱が有効になっている場合は、エントリーをゴミ箱に直接移動し、そうでない場合は確認無しで削除します。&lt;/p&gt;&lt;p&gt;エントリーが他から参照されている場合はプロンプトを表示します。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>クライアントによってエントリーが削除される際に確認しない</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>公開するデータベースのグループ:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>ファイル名</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>グループ</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>管理</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>認証</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>これらのアプリケーションが現在接続済みです:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>アプリケーション</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>切断</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>データベースの設定</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>データベースの設定を編集</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>データベースのロックを解除</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>データベースのロックを解除してより詳しい情報を表示</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>データベースをロックする</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>ロックを解除して表示</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>なし</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5063,7 +6566,7 @@ Available commands:
</message>
<message>
<source>Imported certificates</source>
- <translation>インポートされた証明書</translation>
+ <translation>インポートした証明書</translation>
</message>
<message>
<source>Trust</source>
@@ -5128,22 +6631,113 @@ Available commands:
</message>
<message>
<source>Exporting changed certificate</source>
- <translation>変更された証明書をエクスポートしています</translation>
+ <translation>変更した証明書をエクスポートしています</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation>エクスポートされる証明書は使用中の証明書と同一ではありません。現在の証明書をエクスポートしますか?</translation>
+ <translation>エクスポートする証明書は使用中の証明書と同一ではありません。現在の証明書をエクスポートしますか?</translation>
</message>
<message>
<source>Signer:</source>
<translation>署名者:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>KeeShare のインポートを許可</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>KeeShare のエクスポートを許可</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>警告とエラーのみ表示する</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>キー</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>署名者名フィールド</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>新しい証明書を生成</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>既存の証明書をインポート</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>自身の証明書をエクスポート</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>既知の共有</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>選択した証明書を信用</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>選択した証明書を信用するかどうか毎回確認</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>選択した証明書を信用しない</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>選択した証明書を削除</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>署名共有コンテナの上書きはサポートしていません - エクスポートを阻害しました</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>コンテナを書き込めませんでした (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>署名を埋め込めませんでした: ファイルを書き込み用に開くことができません (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>署名を埋め込めませんでした: ファイルに書き込むことができません (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>データベースを埋め込めませんでした: ファイルを書き込み用に開くことができません (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>データベースを埋め込めませんでした: ファイルに書き込むことができません (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>未署名共有コンテナの上書きはサポートしていません - エクスポートを阻害しました</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>コンテナを書き込めませんでした</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>予期しないエクスポートエラーが発生しました</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
- <translation>署名なしコンテナからのインポート</translation>
+ <translation>署名なしコンテナからインポート</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
@@ -5151,7 +6745,11 @@ Available commands:
</message>
<message>
<source>Import from container with certificate</source>
- <translation>署名付きコンテナからのインポート</translation>
+ <translation>証明書付きコンテナからインポート</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>%3 の %1 (フィンガープリント %2) を信用しますか?{1 ?} {2 ?}</translation>
</message>
<message>
<source>Not this time</source>
@@ -5170,20 +6768,8 @@ Available commands:
<translation>今回はする</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>%1 からのインポートに失敗しました (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>%1 からのインポートに成功しました (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>%1 からインポートされました</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
- <translation>署名共有コンテナはサポートされていません - インポートは阻害されました</translation>
+ <translation>署名共有コンテナはサポートしていません - インポートを阻害しました</translation>
</message>
<message>
<source>File is not readable</source>
@@ -5195,7 +6781,7 @@ Available commands:
</message>
<message>
<source>Untrusted import prevented</source>
- <translation>不信なインポートが阻害されました</translation>
+ <translation>不信なインポートを阻害しました</translation>
</message>
<message>
<source>Successful signed import</source>
@@ -5207,7 +6793,7 @@ Available commands:
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation>未署名共有コンテナはサポートされていません - インポートは阻害されました</translation>
+ <translation>未署名共有コンテナはサポートしていません - インポートを阻害しました</translation>
</message>
<message>
<source>Successful unsigned import</source>
@@ -5221,25 +6807,20 @@ Available commands:
<source>Unknown share container type</source>
<translation>不明な共有コンテナ形式です</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>署名共有コンテナの上書きはサポートされていません - エクスポートは阻害されました</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>コンテナを書き込めませんでした (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>未署名共有コンテナの上書きはサポートされていません - エクスポートは阻害されました</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>%1 からのインポートに失敗しました (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>コンテナを書き込めませんでした</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>%1 からのインポートに成功しました (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>予期しないエクスポートエラーが発生しました</translation>
+ <source>Imported from %1</source>
+ <translation>%1 からインポートしました</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5254,10 +6835,6 @@ Available commands:
<translation>%1 にエクスポート</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>%3 の %1 (フィンガープリント %2) を信用しますか?{1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>%2 の %1 への複数のインポートソースパス</translation>
</message>
@@ -5265,22 +6842,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>%2 のエクスポートターゲットパス %1 が競合しています</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>署名を埋め込めませんでした: ファイルを書き込み用に開くことができません (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>署名を埋め込めませんでした: ファイルに書き込むことができません (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>データベースを埋め込めませんでした: ファイルを書き込み用に開くことができません (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>データベースを埋め込めませんでした: ファイルに書き込むことができません (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5328,10 +6889,6 @@ Available commands:
<translation>TOTP の設定</translation>
</message>
<message>
- <source>Key:</source>
- <translation>キー:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>デフォルトの RFC 6238 トークン設定</translation>
</message>
@@ -5361,16 +6918,46 @@ Available commands:
<translation>コードサイズ:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6桁</translation>
+ <source>Secret Key:</source>
+ <translation>秘密鍵:</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7桁</translation>
+ <source>Secret key must be in Base32 format</source>
+ <translation>秘密鍵は Base32 形式である必要があります</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8桁</translation>
+ <source>Secret key field</source>
+ <translation>秘密鍵フィールド</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>アルゴリズム:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>タイムステップフィールド</translation>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation>桁</translation>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation>不正な TOTP</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>入力した秘密鍵は不正です。鍵は Base32 形式である必要があります。
+例: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>TOTP 設定の削除確認</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>このエントリーの TOTP 設定を削除してもよろしいですか?</translation>
</message>
</context>
<context>
@@ -5454,6 +7041,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>KeePassXC %1 へようこそ</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>1Password からインポートする</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>最近使用したデータベースを開く</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5471,11 +7066,19 @@ Available commands:
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation>YubiKey が検出されませんでした。挿入されているかどうか確認してください。</translation>
+ <translation>YubiKey を検出できませんでした。挿入しているかどうか確認してください。</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
<translation>YubiKey が挿入されていません。</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>ハードウェアトークンを更新</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>ハードウェアキースロットを選択</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_ko.ts b/share/translations/keepassx_ko.ts
index 7ab65f3f6..54a196eca 100644
--- a/share/translations/keepassx_ko.ts
+++ b/share/translations/keepassx_ko.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>스타일 따르기</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>KeePassXC 단일 인스턴스만 사용</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>마지막 데이터베이스 기억</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>마지막 키 파일과 보안 동글 기억</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>시작할 때 이전 데이터베이스 불러오기</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>프로그램 시작 시 창 최소화</translation>
</message>
@@ -163,10 +159,6 @@
<translation>항목을 만들 때 그룹 아이콘 사용</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>클립보드에 복사할 때 최소화</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>항목 미리 보기 패널 숨기기</translation>
</message>
@@ -195,10 +187,6 @@
<translation>시스템 트레이로 최소화</translation>
</message>
<message>
- <source>Language</source>
- <translation>언어</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>자동 입력</translation>
</message>
@@ -232,20 +220,101 @@
<translation>자동 입력 시작 지연 시간</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>시작할 때 업데이트 확인</translation>
+ <source>Movable toolbar</source>
+ <translation>이동 가능한 도구 모음</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>업데이트를 확인할 때 불안정 버전 포함</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>이동 가능한 도구 모음</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>단추 스타일</translation>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>초</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>개인 정보</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>웹사이트 아이콘을 다운로드할 때 DuckDuckGo를 폴백으로 사용하기</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>분</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>사용자 이름 복사(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>암호 복사(&amp;P)</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>자동으로 입력할 항목 선택:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>찾기...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1에서 다음 항목의 암호를 요청했습니다.
접근을 허용할 지 여부를 선택하십시오.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Please select the correct database for saving credentials.</source>
<translation>KeePassXC-브라우저에서 데이터베이스에 접근하려면 필요합니다</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>KeePassXC 브라우저 통합 사용</translation>
- </message>
- <message>
<source>General</source>
<translation>일반</translation>
</message>
@@ -534,10 +643,6 @@ Please select the correct database for saving credentials.</source>
<translation>저장된 암호를 업데이트하기 전에 묻지 않기(&amp;U)</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>선택한 데이터베이스만 클라이언트와 연결할 수 있습니다.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>모든 열린 데이터베이스에서 저장된 암호 검색(&amp;H)</translation>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>Tor 브라우저(&amp;T)</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;경고&lt;/b&gt;, keepassxc-proxy 프로그램을 찾을 수 없습니다!&lt;br /&gt;KeePassXC 설치 디렉터리를 확인하거나 고급 설정의 사용자 경로를 확인하십시오.&lt;br /&gt;프록시 프로그램이 없으면 브라우저 통합 기능을 사용할 수 없습니다.&lt;br /&gt;예상하는 경로: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>실행 파일</translation>
</message>
@@ -621,6 +722,50 @@ Please select the correct database for saving credentials.</source>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>브라우저 통합을 사용하려면 KeePassXC-브라우저가 필요합니다.&lt;br /&gt; %1 및 %2용으로 다운로드할 수 있습니다. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
현재 브라우저 연결을 유지하려면 이 작업이 필요합니다.
존재하는 설정을 이전하시겠습니까?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>더 이상 이 경고 표시하지 않기</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>첫 레코드에 필드 이름 포함</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>무시할 머릿글 줄 수</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>&apos;\&apos; 글자를 탈출 문자로 간주</translation>
</message>
@@ -826,6 +971,22 @@ Would you like to migrate your existing settings now?</source>
<translation>CSV 가져오기: 기록 도구에 오류가 있습니다:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -867,10 +1028,6 @@ Would you like to migrate your existing settings now?</source>
<translation>데이터베이스 읽기 오류: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>데이터베이스 파일 이름이 없어서 저장할 수 없습니다.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>읽기 전용 모드로 파일을 열었기 때문에 저장할 수 없습니다.</translation>
</message>
@@ -878,6 +1035,27 @@ Would you like to migrate your existing settings now?</source>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>키 변형 과정이 일어나지 않았습니다. 버그이므로 개발자에게 보고해 주십시오!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>휴지통</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1067,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>마스터 키 입력</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>키 파일:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>암호:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>찾아보기</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>새로 고침</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>질의 응답:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>레거시 키 파일 형식</translation>
</message>
@@ -943,20 +1105,96 @@ Please consider generating a new key file.</source>
<translation>키 파일 선택</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>빠른 잠금 해제용 TouchID</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>데이터베이스를 열 수 없음:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>키 파일을 열 수 없음:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>찾아보기...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>비우기</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1111,6 +1349,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>모든 레거시 브라우저 통합 데이터를 최신 표준으로 이전하시겠습니까?
브라우저 통합 플러그인과 호환성을 유지하기 위해서 필요합니다.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1236,7 +1482,7 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform>MiB</numerusform></translation>
+ <translation><numerusform> MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
@@ -1253,6 +1499,57 @@ If you keep this number, your database may be too easy to crack!</source>
<comment>seconds</comment>
<translation><numerusform>%1초</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1300,6 +1597,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>압축 사용(추천)(&amp;C)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1367,6 +1697,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>마스터 키를 변경할 수 없음</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1712,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>설명:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>이름</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>값</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1428,10 +1885,6 @@ This is definitely a bug, please report it to the developers.</source>
버그이므로 개발자에게 보고해 주십시오.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>데이터베이스 파일이 존재하지 않거나 접근할 수 없습니다.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>CSV 파일 선택</translation>
</message>
@@ -1454,6 +1907,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [읽기 전용]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1463,7 +1940,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
- <translation>정말 항목 &quot;%1&quot;을(를) 삭제하시겠습니까?</translation>
+ <translation>항목 &quot;%1&quot;을(를) 삭제하시겠습니까?</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
@@ -1487,7 +1964,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation>정말 그룹 &quot;%1&quot;을(를) 삭제하시겠습니까?</translation>
+ <translation>그룹 &quot;%1&quot;을(를) 삭제하시겠습니까?</translation>
</message>
<message>
<source>No current database.</source>
@@ -1544,10 +2021,6 @@ Do you want to merge your changes?</source>
<translation><numerusform>항목을 휴지통으로 이동하시겠습니까?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>파일을 읽기 전용 모드로 열었습니다.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>데이터베이스를 잠그시겠습니까?</translation>
</message>
@@ -1587,12 +2060,6 @@ Disable safe saves and try again?</source>
안전 저장을 비활성화 한 다음 다시 시도하시겠습니까?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>데이터베이스 파일에 기록할 수 없습니다.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>암호</translation>
</message>
@@ -1636,6 +2103,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation>공유된 그룹...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>데이터베이스에기록할 수 없음: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1755,6 +2230,18 @@ Disable safe saves and try again?</source>
<source>Confirm Removal</source>
<translation>삭제 확인</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>브라우저 통합</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1794,6 +2281,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>배경색:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1829,6 +2352,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation>이 조합에 지정된 시퀀스 사용:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>일반</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>추가</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>삭제</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>편집</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1848,6 +2442,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>모두 삭제</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1887,6 +2501,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>만료 기간</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1963,6 +2633,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>이 키를 사용할 때 사용자에게 묻기</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1998,6 +2684,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>부모 그룹에서 상속(%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>항목에 저장되지 않은 변경 사항이 있음</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2026,68 +2716,98 @@ Disable safe saves and try again?</source>
<translation>비활성</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>경로에서 가져오기</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare 서명되지 않은 컨테이너</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>경로로 내보내기</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare 서명된 컨테이너</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>다음 경로와 동기화</translation>
+ <source>Select import source</source>
+ <translation>가져올 원본 선택</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>KeePassXC 현재 버전에서 현재 컨테이너 형식을 공유할 수 없습니다. %1을(를) 사용하십시오.</translation>
+ <source>Select export target</source>
+ <translation>내보낼 대상 선택</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>데이터베이스 공유 비활성화됨</translation>
+ <source>Select import/export file</source>
+ <translation>가져올/내보낼 파일 선택</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>데이터베이스 내보내기 비활성화됨</translation>
+ <source>Clear</source>
+ <translation>비우기</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>데이터베이스 가져오기 비활성화됨</translation>
+ <source>Import</source>
+ <translation>가져오기</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare 서명되지 않은 컨테이너</translation>
+ <source>Export</source>
+ <translation>내보내기</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare 서명된 컨테이너</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>가져올 원본 선택</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>내보낼 대상 선택</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>가져올/내보낼 파일 선택</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>비우기</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>내보내기 컨테이너 %1이(가) 이미 참조되었습니다.</translation>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>가져오기 컨테이너 %1이(가) 이미 참조되었습니다.</translation>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>컨테이너 %1을(를) 가져왔고 다른 그룹에서 내보냈습니다.</translation>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2120,6 +2840,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>기본 자동 입력 시퀀스 설정(&amp;Q)</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2156,22 +2904,10 @@ Disable safe saves and try again?</source>
<translation>모든 파일</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>사용자 정의 아이콘이 이미 존재함</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>삭제 확인</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>사용자 정의 아이콘 다운로드됨</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>힌트: 도구&gt;설정&gt;보안에서 DuckDuckGo를 폴백으로 지정할 수 있습니다</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>이미지 선택</translation>
</message>
@@ -2195,6 +2931,42 @@ Disable safe saves and try again?</source>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>%n개 항목에서 이 아이콘을 사용하고 있으며 기본 아이콘으로 대체됩니다. 삭제하시겠습니까?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2240,6 +3012,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>값</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2335,6 +3131,26 @@ This may cause the affected plugins to malfunction.</source>
<translation><numerusform>파일을 열 수 없음:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>첨부</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2429,10 +3245,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>TOTP 토큰 생성</translation>
- </message>
- <message>
<source>Close</source>
<translation>닫기</translation>
</message>
@@ -2517,6 +3329,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>공유</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>고급</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2550,11 +3370,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>휴지통</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
</message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2573,6 +3415,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>취소</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>닫기</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>상태</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>확인</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2594,10 +3488,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>질의 응답을 실행할 수 없습니다.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>데이터베이스 헤더 없음</translation>
</message>
@@ -2617,6 +3507,11 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>잘못된 헤더 데이터 길이</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2648,10 +3543,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>헤더 SHA256이 일치하지 않음</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.(HMAC이 일치하지 않음)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>알 수 없는 암호화</translation>
</message>
@@ -2751,6 +3642,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>잘못된 메타데이터 저장소 필드 형식 크기</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2973,13 +3873,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>KeePass1 데이터베이스 가져오기</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>데이터베이스를 열 수 없습니다.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3037,10 +3937,6 @@ Line %2, column %3</source>
<translation>마스터 키를 계산할 수 없습니다</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>키 변형 실패</translation>
</message>
@@ -3136,40 +4032,57 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>내용 위치로 이동할 수 없음</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>비활성화된 공유</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>다음에서 가져오기</translation>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>다음으로 내보내기</translation>
+ <source>Imported from %1</source>
+ <translation>%1에서 가져옴</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>다음과 동기화</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>비활성화된 공유 %1</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>공유 %1에서 가져오기</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>공유 %1(으)로 내보내기</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>공유 %1와(과) 동기화</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3214,10 +4127,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>찾아보기</translation>
- </message>
- <message>
<source>Generate</source>
<translation>생성</translation>
</message>
@@ -3273,6 +4182,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>키 파일 선택</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>찾아보기...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3361,10 +4307,6 @@ Message: %2</source>
<translation>설정(&amp;S)</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>암호 생성기</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>데이터베이스 잠금(&amp;L)</translation>
</message>
@@ -3551,14 +4493,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation>TOTP QR 코드 보이기...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>업데이트 확인...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>항목 공유</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>알림: KeePassXC의 미리 보기 버전을 사용하고 있습니다!
@@ -3576,6 +4510,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>언제든지 프로그램 메뉴에서 수동으로 업데이트를 확인할 수 있습니다.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>파비콘 다운로드</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3635,6 +4637,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>빠진 아이콘 %1 추가하는 중</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3705,6 +4715,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3804,6 +4880,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3829,6 +4916,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>마스터 암호 생성</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3858,22 +4961,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>문자 종류</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>대문자</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>소문자</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>숫자</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>특수 문자</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>확장 ASCII</translation>
</message>
@@ -3954,18 +5045,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>고급</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>대문자 A-F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>소문자 A-F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3998,18 +5081,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>수학 기호</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>대시</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4057,6 +5132,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>다시 생성</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>암호 복사</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4064,12 +5207,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>선택</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4106,6 +5246,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>합치기</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4198,10 +5342,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>항목 암호를 생성합니다.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>생성된 암호의 길이입니다.</translation>
- </message>
- <message>
<source>length</source>
<translation>길이</translation>
</message>
@@ -4251,18 +5391,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>암호에 고급 분석을 시행합니다.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>데이터베이스의 내용을 추출하고 표시합니다.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>표시할 데이터베이스 경로입니다.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>%1의 잠금 해제 암호 입력: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4307,10 +5435,6 @@ Available commands:
<translation>두 데이터베이스를 합칩니다.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>합칠 대상 데이터베이스 경로입니다.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>합칠 원본 데이터베이스 경로입니다.</translation>
</message>
@@ -4387,10 +5511,6 @@ Available commands:
<translation>브라우저 통합</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] 질의 응답 - 슬롯 %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>누르기</translation>
</message>
@@ -4421,10 +5541,6 @@ Available commands:
<translation>새 무작위 암호를 생성합니다.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>암호 길이 %1의 값이 잘못되었습니다.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>경로 %1에 항목을 만들 수 없습니다.</translation>
</message>
@@ -4482,10 +5598,6 @@ Available commands:
<translation>count</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>암호 길이 값이 잘못됨: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>경로 %1에서 항목을 찾을 수 없습니다.</translation>
</message>
@@ -4610,26 +5722,6 @@ Available commands:
<translation>키 파일 %1을(를) 불러올 수 없음: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>파일 %1이(가) 존재하지 않습니다.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>파일 %1을(를) 열 수 없습니다.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>데이터베이스 읽기 오류:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>데이터베이스 처리 오류:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>생성된 암호의 길이</translation>
</message>
@@ -4642,10 +5734,6 @@ Available commands:
<translation>대문자 사용</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>숫자를 사용합니다.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>특수 문자 사용</translation>
</message>
@@ -4790,10 +5878,6 @@ Available commands:
<translation>새 데이터베이스를 만들었습니다.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>데이터베이스를 암호화할 암호 입력(Enter 키를 누르면 비워 둡니다): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>키 파일 %1 생성 실패: %2</translation>
</message>
@@ -4802,10 +5886,6 @@ Available commands:
<translation>키 파일 %1 불러오기 실패: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>데이터베이스에서 항목을 삭제합니다.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>삭제할 항목의 경로입니다.</translation>
</message>
@@ -4861,6 +5941,330 @@ Available commands:
<source>Cannot create new group</source>
<translation>새 그룹을 만들 수 없음</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>리비전: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>배포판: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>운영 체제: %1
+CPU 아키텍처: %2
+커널: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>자동 입력</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>활성화된 확장 기능:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>수정 작업으로 데이터베이스가 변경되지 않았습니다.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5015,6 +6419,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>일반</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>그룹</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>데이터베이스 설정</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>데이터베이스 잠금 해제</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>데이터베이스 잠금</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5137,9 +6628,100 @@ Available commands:
<source>Signer:</source>
<translation>서명자:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>키</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>서명된 공유 컨테이너에 덮어쓰기는 지원되지 않음 - 내보내기 중단됨</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>내보내기 컨테이너에 기록할 수 없음 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>서명을 임베드할 수 없음: 쓰기 위해 파일을 열 수 없음 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>서명을 임베드할 수 없음: 파일에 쓸 수 없음 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>데이터베이스를 임베드할 수 없음: 쓰기 위해 파일을 열 수 없음 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>데이터베이스를 임베드할 수 없음: 파일에 쓸 수 없음 (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>서명되지 않은 공유 컨테이너에 덮어쓰기는 지원되지 않음 - 내보내기 중단됨</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>내보내기 컨테이너에 기록할 수 없음</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>예상하지 못한 내보내기 오류</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>서명되지 않은 컨테이너에서 가져오기</translation>
@@ -5153,6 +6735,10 @@ Available commands:
<translation>서명된 컨테이너에서 가져오기</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>%3에서 온 지문이 %2인 %1을(를) 신뢰하시겠습니까?</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>지금은 하지 않음</translation>
</message>
@@ -5169,18 +6755,6 @@ Available commands:
<translation>이번 한 번</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>%1에서 가져오기 실패 (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>%1에서 가져오기 성공 (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>%1에서 가져옴</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>서명된 공유 컨테이너는 지원하지 않음 - 가져오기 중단됨</translation>
</message>
@@ -5220,25 +6794,20 @@ Available commands:
<source>Unknown share container type</source>
<translation>알 수 없는 공유 컨테이너 형식</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>서명된 공유 컨테이너에 덮어쓰기는 지원되지 않음 - 내보내기 중단됨</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>내보내기 컨테이너에 기록할 수 없음 (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>서명되지 않은 공유 컨테이너에 덮어쓰기는 지원되지 않음 - 내보내기 중단됨</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>%1에서 가져오기 실패 (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>내보내기 컨테이너에 기록할 수 없음</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>%1에서 가져오기 성공 (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>예상하지 못한 내보내기 오류</translation>
+ <source>Imported from %1</source>
+ <translation>%1에서 가져옴</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5253,10 +6822,6 @@ Available commands:
<translation>%1(으)로 내보내기</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>%3에서 온 지문이 %2인 %1을(를) 신뢰하시겠습니까?</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>%2의 %1(으)로 다중 가져오기 원본 경로</translation>
</message>
@@ -5264,22 +6829,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>%2의 내보내기 대상 경로 %1이(가) 충돌함</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>서명을 임베드할 수 없음: 쓰기 위해 파일을 열 수 없음 (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>서명을 임베드할 수 없음: 파일에 쓸 수 없음 (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>데이터베이스를 임베드할 수 없음: 쓰기 위해 파일을 열 수 없음 (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>데이터베이스를 임베드할 수 없음: 파일에 쓸 수 없음 (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5327,10 +6876,6 @@ Available commands:
<translation>TOTP 설정</translation>
</message>
<message>
- <source>Key:</source>
- <translation>키:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>기본 RFC 6238 토큰 설정</translation>
</message>
@@ -5360,16 +6905,45 @@ Available commands:
<translation>코드 크기:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6자리</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>알고리즘:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7자리</translation>
+ <source> digits</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8자리</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5453,6 +7027,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>KeePassXC %1에 오신 것을 환영합니다</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5476,5 +7058,13 @@ Available commands:
<source>No YubiKey inserted.</source>
<translation>YubiKey가 연결되지 않았습니다.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_lt.ts b/share/translations/keepassx_lt.ts
index bf5f5cf22..2508cd510 100644
--- a/share/translations/keepassx_lt.ts
+++ b/share/translations/keepassx_lt.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Sekti stiliumi</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Paleisti tik vieną KeePassXC egzempliorių</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Prisiminti paskutines duomenų bazes</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Prisiminti paskutinius rakto failus ir saugumo saugiklius</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Paleidžiant programą, įkelti ankstesnes duomenų bazes</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Paleidus programą, suskleisti langą</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Kuriant įrašus, naudoti grupės piktogramą</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Kopijuojant į iškarpinę, suskleisti langą</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Slėpti įrašo peržiūros skydelį</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Suskleidus langą, slėpti jį į sistemos dėklą</translation>
</message>
<message>
- <source>Language</source>
- <translation>Kalba</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Automatinis rinkimas</translation>
</message>
@@ -232,20 +220,101 @@
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Paleidus programą, tikrinti ar yra atnaujinimų</translation>
+ <source>Movable toolbar</source>
+ <translation>Perkeliama įrankių juosta</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Tikrinant atnaujinimus, įtraukti išankstinės programos laidas</translation>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Perkeliama įrankių juosta</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Mygtukų stilius</translation>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>sek.</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -320,7 +389,28 @@
<translation>Privatumas</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>min.</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
<translation type="unfinished"/>
</message>
</context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Kopijuoti &amp;naudotojo vardą</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Kopijuoti sla&amp;ptažodį</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Pasirinkite įrašą automatiniam rinkimui:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Ieškoti...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 užklausė prieigos prie slaptažodžių šiam elementui(-ams).
Pasirinkite, ar norite leisti prieigą.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Prisijungimo duomenų įrašymui, pasirinkite teisingą duomenų bazę.</transla
<translation type="unfinished"/>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Įjungti KeepassXC naršyklės integraciją</translation>
- </message>
- <message>
<source>General</source>
<translation>Bendra</translation>
</message>
@@ -534,10 +643,6 @@ Prisijungimo duomenų įrašymui, pasirinkite teisingą duomenų bazę.</transla
<translation>Niekada neklausti prieš atna&amp;ujinant prisijungimo duomenis</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Su klientu turi būti sujungta tik pasirinkta duomenų bazė.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Ieš&amp;koti atitinkančių prisijungimo duomenų visose atvertose duomenų bazėse</translation>
@@ -593,10 +698,6 @@ Prisijungimo duomenų įrašymui, pasirinkite teisingą duomenų bazę.</transla
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Executable Files</source>
<translation>Vykdomieji failai</translation>
</message>
@@ -621,6 +722,50 @@ Prisijungimo duomenų įrašymui, pasirinkite teisingą duomenų bazę.</transla
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -707,6 +852,10 @@ This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Daugiau neberodyti šio įspėjimo</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -716,7 +865,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>Pridėti prie pavadinimo &quot; - Dublikatas&quot;</translation>
+ <translation>Pridėti prie antraštės &quot; - Dublikatas&quot;</translation>
</message>
<message>
<source>Replace username and password with references</source>
@@ -766,10 +915,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Pirmame įraše yra laukų pavadinimai</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Antraštės eilučių, kurias atmesti, skaičius</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Laikyti &quot;\&quot; kaitos ženklu</translation>
</message>
@@ -818,12 +963,28 @@ Would you like to migrate your existing settings now?</source>
%1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n stulpelis</numerusform><numerusform>%n stulpeliai</numerusform><numerusform>%n stulpelių</numerusform><numerusform>%n stulpelių</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -859,10 +1020,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Klaida skaitant duomenų bazę: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Nepavyko įrašyti, duomenų bazė neturi failo pavadinimo.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Failas negali būti įrašytas, nes jis atvertas tik skaitymo veiksenoje.</translation>
</message>
@@ -870,6 +1027,27 @@ Would you like to migrate your existing settings now?</source>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Šiukšlinė</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -881,30 +1059,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Įveskite pagrindinį raktą</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Rakto failas:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Slaptažodis:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Naršyti</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Įkelti iš naujo</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Iššūkio atsakymas:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation type="unfinished"/>
</message>
@@ -932,20 +1094,96 @@ Please consider generating a new key file.</source>
<translation>Pasirinkite rakto failą</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Nepavyko atverti duomenų bazės:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Nepavyksta atverti rakto failo:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Naršyti...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Išvalyti</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1096,6 +1334,14 @@ Permissions to access entries will be revoked.</source>
This is necessary to maintain compatibility with the browser plugin.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1217,22 +1463,73 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform> gija</numerusform><numerusform> gijos</numerusform><numerusform> gijų</numerusform><numerusform> gija</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1281,6 +1578,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>Įjungti &amp;glaudinimą (rekomenduojama)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1346,6 +1676,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>Nepavyko pakeisti pagrindinio rakto</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1357,6 +1691,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Aprašas:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Pavadinimas</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Reikšmė</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1382,7 +1839,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Open KeePass 1 database</source>
- <translation>Atverkite KeePass 1 duomenų bazę</translation>
+ <translation>Atverti KeePass 1 duomenų bazę</translation>
</message>
<message>
<source>KeePass 1 database</source>
@@ -1406,10 +1863,6 @@ This is definitely a bug, please report it to the developers.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Duomenų failo nėra arba jis nepasiekiamas.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation type="unfinished"/>
</message>
@@ -1432,6 +1885,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [Tik skaitymui]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1522,10 +1999,6 @@ Ar norite sulieti savo pakeitimus?</translation>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Failas atvertas tik skaitymo veiksenoje.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Užrakinti duomenų bazę?</translation>
</message>
@@ -1563,12 +2036,6 @@ Disable safe saves and try again?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Rašymas į duomenų bazę patyrė nesėkmę.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Slaptažodžiai</translation>
</message>
@@ -1612,6 +2079,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1673,7 +2148,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit entry</source>
- <translation>Keisti įrašą</translation>
+ <translation>Taisyti įrašą</translation>
</message>
<message>
<source>Different passwords supplied.</source>
@@ -1693,11 +2168,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n savaitė</numerusform><numerusform>%n savaitės</numerusform><numerusform>%n savaičių</numerusform><numerusform>%n savaičių</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n mėnesis</numerusform><numerusform>%n mėnesiai</numerusform><numerusform>%n mėnesių</numerusform><numerusform>%n mėnesių</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1731,6 +2206,18 @@ Disable safe saves and try again?</source>
<source>Confirm Removal</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Naršyklės integracija</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1770,6 +2257,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>Fono spalva:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1805,6 +2328,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Bendra</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Pridėti</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Šalinti</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Keisti</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1824,6 +2418,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>Ištrinti visus</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1863,6 +2477,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>Baigia galioti</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1939,6 +2609,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>Naudojant šį raktą, reikalauti naudotojo patvirtinimo</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1960,7 +2646,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit group</source>
- <translation>Keisti grupę</translation>
+ <translation>Taisyti grupę</translation>
</message>
<message>
<source>Enable</source>
@@ -1974,6 +2660,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>Paveldėti iš pirminės grupės (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Įraše yra neįrašytų pakeitimų</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2002,67 +2692,97 @@ Disable safe saves and try again?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from path</source>
- <translation>Importuoti iš kelio</translation>
+ <source>KeeShare unsigned container</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to path</source>
- <translation>Eksportuoti į kelią</translation>
+ <source>KeeShare signed container</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Sinchronizuoti su keliu</translation>
+ <source>Select import source</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>Select export target</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
+ <source>Select import/export file</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Duomenų bazės eksportavimas yra išjungtas</translation>
+ <source>Clear</source>
+ <translation>Išvalyti</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Duomenų bazės importavimas yra išjungtas</translation>
+ <source>Import</source>
+ <translation>Importuoti</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
+ <source>%1 is already being imported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Išvalyti</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2096,6 +2816,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Nustatyti numatytąją automatinio rinkimo se&amp;ką</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2132,22 +2880,10 @@ Disable safe saves and try again?</source>
<translation>Visi failai</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Tinkinta piktograma jau yra</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Patvirtinti ištrynimą</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
<translation type="unfinished"/>
</message>
@@ -2165,12 +2901,48 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>Ši piktograma patyrė nesėkmę:</numerusform><numerusform>Šios piktogramos patyrė nesėkmę:</numerusform><numerusform>Šios piktogramos patyrė nesėkmę:</numerusform><numerusform>Šios piktogramos patyrė nesėkmę:</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2215,6 +2987,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>Reikšmė</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2262,7 +3058,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Ar tikrai norite pašalinti %n priedą?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedus?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedų?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedų?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2309,6 +3105,26 @@ This may cause the affected plugins to malfunction.</source>
%1</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Priedai</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2403,10 +3219,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generuoti NTVS prieigos raktą</translation>
- </message>
- <message>
<source>Close</source>
<translation>Užverti</translation>
</message>
@@ -2491,6 +3303,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Išplėstiniai</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2524,11 +3344,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Šiukšlinė</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2547,6 +3389,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Atsisakyti</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Užverti</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Būsena</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Gerai</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2568,10 +3462,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>Nepavyko išduoti iššūkio atsakymo.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Neteisingas raktas arba duomenų bazės failas yra pažeistas.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>trūksta duomenų bazės antraščių</translation>
</message>
@@ -2591,6 +3481,11 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>Neteisingas antraštės duomenų ilgis</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2622,10 +3517,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>Antraštės SHA256 neatitikimas</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Neteisingas raktas arba sugadintas duomenų bazės failas. (HMAC neatitikimas)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Nežinomas šifras</translation>
</message>
@@ -2725,6 +3616,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2947,13 +3847,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importuoti KeePass1 duomenų bazę</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Nepavyko atverti duomenų bazės.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3011,10 +3911,6 @@ Line %2, column %3</source>
<translation>Nepavyko apskaičiuoti pagrindinio rakto</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Neteisingas raktas arba duomenų bazės failas yra pažeistas.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Rakto transformacija nepavyko</translation>
</message>
@@ -3110,39 +4006,56 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importuoti iš</translation>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importuota iš %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Eksportuoti į</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
+ <source>Export is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
+ <source>Inactive share</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Imported from</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Exported to</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3188,10 +4101,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Naršyti</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generuoti</translation>
</message>
@@ -3243,6 +4152,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>Pasirinkite rakto failą</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Naršyti...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3331,10 +4277,6 @@ Message: %2</source>
<translation>&amp;Nustatymai</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Slaptažodžių generatorius</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Užrakinti duomenų bazes</translation>
</message>
@@ -3344,7 +4286,7 @@ Message: %2</source>
</message>
<message>
<source>Copy title to clipboard</source>
- <translation>Kopijuoti pavadinimą į iškarpinę</translation>
+ <translation>Kopijuoti antraštę į iškarpinę</translation>
</message>
<message>
<source>&amp;URL</source>
@@ -3518,14 +4460,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Tikrinti, ar yra atnaujinimų...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation type="unfinished"/>
@@ -3542,6 +4476,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Atsisiųsti svetainės piktogramą</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3601,6 +4603,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>Pridedama trūkstama piktograma %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3671,6 +4681,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3770,6 +4846,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3795,6 +4882,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3824,22 +4927,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Simbolių tipai</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Viršutinio registro raidės</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Apatinio registro raidės</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Skaičiai</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Specialūs simboliai</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Papildomi ASCII</translation>
</message>
@@ -3920,18 +5011,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Išplėstiniai</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3964,18 +5047,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematika</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Brūkšniai</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4023,6 +5098,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Kopijuoti slaptažodį</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4030,11 +5173,8 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4072,6 +5212,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4164,10 +5308,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Generuoti įrašui slaptažodį.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Generuoto slaptažodžio ilgis.</translation>
- </message>
- <message>
<source>length</source>
<translation>ilgis</translation>
</message>
@@ -4186,7 +5326,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
- <translation>Skirtas laikas, sekundėmis, prieš išvalant iškarpinę.</translation>
+ <translation>Laiko limitas, sekundėmis, prieš išvalant iškarpinę.</translation>
</message>
<message>
<source>Edit an entry.</source>
@@ -4194,7 +5334,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Title for the entry.</source>
- <translation>Įrašo pavadinimas.</translation>
+ <translation>Įrašo antraštė.</translation>
</message>
<message>
<source>title</source>
@@ -4217,18 +5357,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Atlikti išplėstinę slaptažodžio analizę</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Išskleisti ir spausdinti duomenų bazės turinį.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Duomenų bazės, kurią išskleisti, kelias.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Norėdami atrakinti %1, įterpkite slaptažodį: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4270,10 +5398,6 @@ Prieinamos komandos:
<translation>Sulieti dvi duomenų bazes.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Duomenų bazės, į kurią sulieti, kelias.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Duomenų bazės, iš kurios sulieti, kelias.</translation>
</message>
@@ -4350,10 +5474,6 @@ Prieinamos komandos:
<translation>Naršyklės integracija</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] iššūkio atsakymas - Lizdas %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Paspausti</translation>
</message>
@@ -4383,10 +5503,6 @@ Prieinamos komandos:
<translation>Generuoti naują atsitiktinį slaptažodį.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4444,10 +5560,6 @@ Prieinamos komandos:
<translation>kiekis</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4572,25 +5684,6 @@ Prieinamos komandos:
<translation>Nepavyko įkelti rakto failo %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Failo %1 nėra.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Nepavyko atverti failą %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Klaida skaitant duomenų bazę:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Length of the generated password</source>
<translation type="unfinished"/>
</message>
@@ -4603,10 +5696,6 @@ Prieinamos komandos:
<translation type="unfinished"/>
</message>
<message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Use special characters</source>
<translation type="unfinished"/>
</message>
@@ -4750,10 +5839,6 @@ Prieinamos komandos:
<translation>Nauja duomenų bazė sėkmingai sukurta.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation type="unfinished"/>
</message>
@@ -4762,10 +5847,6 @@ Prieinamos komandos:
<translation type="unfinished"/>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Šalinti įrašą iš duomenų bazės.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Įrašo, kurį šalinti, kelias.</translation>
</message>
@@ -4821,6 +5902,330 @@ Prieinamos komandos:
<source>Cannot create new group</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versija %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Darinio tipas: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revizija: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Platinimas: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operacinė sistema: %1
+Procesoriaus architektūra: %2
+Branduolys: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Automatinis rinkimas</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nėra</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Įjungti plėtiniai:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4975,6 +6380,93 @@ Prieinamos komandos:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Bendra</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupė</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Duomenų bazės nustatymai</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Atrakinti duomenų bazę</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Užrakinti duomenų bazę</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nėra</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5097,9 +6589,100 @@ Prieinamos komandos:
<source>Signer:</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Raktas</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Įvyko netikėta eksportavimo klaida</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation type="unfinished"/>
@@ -5113,6 +6696,10 @@ Prieinamos komandos:
<translation type="unfinished"/>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Ne šį kartą</translation>
</message>
@@ -5129,18 +6716,6 @@ Prieinamos komandos:
<translation>Tik šį kartą</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Importavimas iš %1 nepavyko (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Importavimas iš %1 sėkmingas (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importuota iš %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
@@ -5180,25 +6755,20 @@ Prieinamos komandos:
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Importavimas iš %1 nepavyko (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation type="unfinished"/>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Importavimas iš %1 sėkmingas (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Įvyko netikėta eksportavimo klaida</translation>
+ <source>Imported from %1</source>
+ <translation>Importuota iš %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5213,10 +6783,6 @@ Prieinamos komandos:
<translation type="unfinished"/>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
</message>
@@ -5224,22 +6790,6 @@ Prieinamos komandos:
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"/>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5287,10 +6837,6 @@ Prieinamos komandos:
<translation>Nustatyti NTVS</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Raktas:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Numatytojo RFC 6238 prieigos rakto nustatymai</translation>
</message>
@@ -5320,16 +6866,45 @@ Prieinamos komandos:
<translation>Kodo dydis:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 skaitmenys</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source>Secret key must be in Base32 format</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 skaitmenys</translation>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritmas:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5413,6 +6988,14 @@ Prieinamos komandos:
<source>Welcome to KeePassXC %1</source>
<translation>Sveiki atvykę į KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5436,5 +7019,13 @@ Prieinamos komandos:
<source>No YubiKey inserted.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_nb.ts b/share/translations/keepassx_nb.ts
index cdf0a12b5..0c71bc6a3 100644
--- a/share/translations/keepassx_nb.ts
+++ b/share/translations/keepassx_nb.ts
@@ -23,11 +23,11 @@
</message>
<message>
<source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;Se Bidrag på GitHub&lt;/a&gt;</translation>
+ <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;Se bidrag på GitHub&lt;/a&gt;</translation>
</message>
<message>
<source>Debug Info</source>
- <translation>Debuggingsinfo</translation>
+ <translation>Feilsøkingsinformasjon</translation>
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
@@ -35,7 +35,7 @@
</message>
<message>
<source>Copy to clipboard</source>
- <translation>Kopier til utklippstavle</translation>
+ <translation>Kopier til utklippstavla</translation>
</message>
<message>
<source>Project Maintainers:</source>
@@ -54,7 +54,7 @@
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
- <translation type="unfinished"/>
+ <translation>Bruk OpenSSH for Windows i stedet for Pageant</translation>
</message>
</context>
<context>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Følg stil</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Kjør kun én instans av KeePassXC om gangen</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Husk de sist brukte databasene</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Husk de sist brukte nøkkelfilene og kopibeskyttelsesnøklene</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Åpne sist brukte databaser ved oppstart</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimer ved programstart</translation>
</message>
@@ -163,12 +159,8 @@
<translation>Bruk gruppeikon ved ny oppføring</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimer ved kopiering til utklippstavla</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
- <translation type="unfinished"/>
+ <translation>Skjul forhåndsvisningspanelet</translation>
</message>
<message>
<source>General</source>
@@ -195,10 +187,6 @@
<translation>Skjul vindu til systemkurven når minimert</translation>
</message>
<message>
- <source>Language</source>
- <translation>Språk</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Autoskriv</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Autoskriv start-forsinkelse</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
+ <source>Movable toolbar</source>
+ <translation>Bevegelig verktøylinje</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
+ <source>Load previously open databases on startup</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>sek</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Knappestil</translation>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -305,11 +374,11 @@
</message>
<message>
<source>Don&apos;t use placeholder for empty password fields</source>
- <translation type="unfinished"/>
+ <translation>Ikke bruk plassholder for tomme passordfelter</translation>
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
- <translation type="unfinished"/>
+ <translation>Skjul passord i forhåndsvisningspanelet</translation>
</message>
<message>
<source>Hide entry notes by default</source>
@@ -320,7 +389,28 @@
<translation>Personvern</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
<translation type="unfinished"/>
</message>
</context>
@@ -328,7 +418,7 @@
<name>AutoType</name>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
- <translation>Kunne ikke finne en oppføring som samsvarer med vindutittelen:</translation>
+ <translation>Finner ingen oppføring som samsvarer med vindustittelen:</translation>
</message>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -363,7 +453,7 @@
</message>
<message>
<source>Sequence</source>
- <translation>Sekvens</translation>
+ <translation>Rekkefølge</translation>
</message>
<message>
<source>Default sequence</source>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Kopier &amp;brukernavn</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Kopier &amp;passord</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Velg oppføring som skal autoskrives:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Søk...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 spør om passordtilgang for følgende elementer.
Velg om du vil gi tilgang eller ikke.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -442,7 +555,8 @@ Velg om du vil gi tilgang eller ikke.</translation>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
- <translation type="unfinished"/>
+ <translation>Du har flere databaser åpne.
+Vennligst velg riktig database for å lagre legitimasjon.</translation>
</message>
</context>
<context>
@@ -456,10 +570,6 @@ Please select the correct database for saving credentials.</source>
<translation>Dette er nødvendig for å få tilgang til dine databaser med KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Slå på nettlesertillegget</translation>
- </message>
- <message>
<source>General</source>
<translation>Generelt</translation>
</message>
@@ -533,10 +643,6 @@ Please select the correct database for saving credentials.</source>
<translation>Aldri spør før &amp;oppdatering av identifikasjon</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Kun den valgte databasen behøver å kobles til en klient.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>&amp;Søk etter matchende identifikasjon i alle åpne databaser</translation>
@@ -592,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>&amp;Tor nettleser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Executable Files</source>
<translation>Kjørbare filer</translation>
</message>
@@ -614,12 +716,56 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation type="unfinished"/>
+ <translation>Vennligst se spesielle instruksjoner for bruk av nettleserutvidelse nedenfor</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -689,7 +835,7 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Gammel nettleser integrasjon innstillinger oppdaget</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
@@ -707,6 +853,10 @@ This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Ikke vis denne advarselen igjen</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -766,10 +916,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Første post har feltnavn</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Antall header-linjer å se bort fra</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Betrakt &apos;\&apos; som en escape-sekvens</translation>
</message>
@@ -799,7 +945,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Empty fieldname %1</source>
- <translation type="unfinished"/>
+ <translation>Tomt feltnavn %1</translation>
</message>
<message>
<source>column %1</source>
@@ -807,7 +953,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation type="unfinished"/>
+ <translation>Feil(er) oppdaget i CSV-fil!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
@@ -818,17 +964,33 @@ Would you like to migrate your existing settings now?</source>
%1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n kolonne(r)</numerusform><numerusform>%n kolonne(r)</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
<comment>file info: bytes, rows, columns</comment>
- <translation type="unfinished"/>
+ <translation>%1, %2, %3</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
@@ -848,7 +1010,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>File %1 does not exist.</source>
- <translation type="unfinished"/>
+ <translation>Filen %1 eksisterer ikke.</translation>
</message>
<message>
<source>Unable to open file %1.</source>
@@ -856,20 +1018,37 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Error while reading the database: %1</source>
+ <translation>Feil under lesing av databasen: %1</translation>
+ </message>
+ <message>
+ <source>File cannot be written as it is opened in read-only mode.</source>
+ <translation>Filen kan ikke skrives da den åpnes i skrivebeskyttet modus.</translation>
+ </message>
+ <message>
+ <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <translation>Nøkkel ikke transformert. Dette er en feil, vennligst rapporter det til utviklerne!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Kunne ikke lagre, databasen har ingen filnavn.</translation>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>File cannot be written as it is opened in read-only mode.</source>
+ <source>Could not save, database file is read-only.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <source>Database file has unmerged changes.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Papirkurv</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -881,32 +1060,16 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Angi hovednøkkel</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Nøkkelfil:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Passord:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Bla</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Last på ny</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Utfordrer-respons:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation>Eldre nøkkelfilformat</translation>
+ <translation>Eldre nøkkelfil-format</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
@@ -934,17 +1097,95 @@ Vurder å opprette en ny nøkkelfil.</translation>
<translation>Velg nøkkelfil</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
+ <source>Select slot...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Bla gjennom...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Tøm</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1027,7 +1268,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>Enable Browser Integration to access these settings.</source>
- <translation type="unfinished"/>
+ <translation>Aktiver nettleserintegrasjon for å få tilgang til disse innstillingene.</translation>
</message>
<message>
<source>Disconnect all browsers</source>
@@ -1044,7 +1285,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>Ingen delte krypteringsnøkler funnet i KeePassXC-innstillingene.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
@@ -1096,6 +1337,14 @@ Permissions to access entries will be revoked.</source>
This is necessary to maintain compatibility with the browser plugin.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1137,7 +1386,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>?? s</source>
- <translation type="unfinished"/>
+ <translation>?? s</translation>
</message>
<message>
<source>Change</source>
@@ -1153,7 +1402,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>Høyere verdier gir mer beskyttelse, men å åpne database vil ta lengre tid.</translation>
</message>
<message>
<source>Database format:</source>
@@ -1161,7 +1410,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>This is only important if you need to use your database with other programs.</source>
- <translation type="unfinished"/>
+ <translation>Dette er bare viktig hvis du trenger å bruke database med andre programmer.</translation>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
@@ -1221,22 +1470,73 @@ Dersom du beholder dette antallet så kan databasen være for lett å knekke!</t
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform>MiB</numerusform><numerusform>MiB</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>tråd(er)</numerusform><numerusform>tråd(er)</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 ms</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1271,7 +1571,7 @@ Dersom du beholder dette antallet så kan databasen være for lett å knekke!</t
</message>
<message>
<source> MiB</source>
- <translation> MiB</translation>
+ <translation>MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1285,6 +1585,39 @@ Dersom du beholder dette antallet så kan databasen være for lett å knekke!</t
<source>Enable &amp;compression (recommended)</source>
<translation>Aktiver &amp;komprimering (anbefalt)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1340,7 +1673,9 @@ Dersom du beholder dette antallet så kan databasen være for lett å knekke!</t
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation type="unfinished"/>
+ <translation>ADVARSEL! Du har ikke angitt et passord. Å bruke en database uten passord frarådes sterkt!
+
+Er du sikker på at du vil fortsette uten passord?</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1348,6 +1683,10 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Failed to change master key</source>
+ <translation>Feilet å endre hovednøkkel</translation>
+ </message>
+ <message>
+ <source>Continue without password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1361,6 +1700,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Beskrivelse:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Navn</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Verdi</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1402,16 +1864,13 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Database creation error</source>
- <translation type="unfinished"/>
+ <translation>Database opprettelsesfeil</translation>
</message>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
+ <translation>Den opprettede databasen har ingen nøkkel eller KDF, og nekter å lagre den.
+Dette er definitivt en feil, rapporter det til utviklerne.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1424,18 +1883,42 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>%1 [New Database]</source>
<comment>Database tab name modifier</comment>
- <translation type="unfinished"/>
+ <translation>%1 [Ny Database]</translation>
</message>
<message>
<source>%1 [Locked]</source>
<comment>Database tab name modifier</comment>
- <translation type="unfinished"/>
+ <translation>%1 [Låst]</translation>
</message>
<message>
<source>%1 [Read-only]</source>
<comment>Database tab name modifier</comment>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1453,7 +1936,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Ønsker du virkelig å flytte %n oppføring(er) til søppelkurven?</numerusform><numerusform>Ønsker du virkelig å flytte %n oppføring(er) til søppelkurven?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1526,16 +2009,12 @@ Vil du slå sammen fila med endringene dine?</translation>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Fil åpnet i skrivebeskyttet modus.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Låse database?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>Du redigerer en oppføring. Kast endringer og lås likevel?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1546,7 +2025,8 @@ Lagre endringer?</translation>
<message>
<source>Database was modified.
Save changes?</source>
- <translation type="unfinished"/>
+ <translation>Databasen ble endret.
+Lagre endringer?</translation>
</message>
<message>
<source>Save changes?</source>
@@ -1568,11 +2048,6 @@ Disable safe saves and try again?</source>
Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Passwords</source>
<translation>Passord</translation>
</message>
@@ -1586,7 +2061,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>Erstatte referanser til oppføring?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
@@ -1598,7 +2073,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Flytt gruppe til søppelbøtte?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
@@ -1614,6 +2089,14 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Shared group...</source>
+ <translation>Delt gruppe...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1641,7 +2124,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>History</source>
- <translation>Historie</translation>
+ <translation>Historikk</translation>
</message>
<message>
<source>SSH Agent</source>
@@ -1697,11 +2180,11 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n uke(r)</numerusform><numerusform>%n uke(r)</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n måned(er)</numerusform><numerusform>%n måned(er)</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1733,6 +2216,18 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Confirm Removal</source>
+ <translation>Bekreft fjerning</translation>
+ </message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Nettlesertillegg</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1774,6 +2269,42 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Background Color:</source>
<translation>Bakgrunnsfarge:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1809,6 +2340,77 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Bruk en spesiell sekvens for denne tilknytningen:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generelt</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Legg til</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Fjern</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1828,6 +2430,26 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Delete all</source>
<translation>Slett alt</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1867,6 +2489,62 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Expires</source>
<translation>Utløper</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1912,7 +2590,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Copy to clipboard</source>
- <translation>Kopier til utklippstavle</translation>
+ <translation>Kopier til utklippstavla</translation>
</message>
<message>
<source>Private key</source>
@@ -1943,6 +2621,22 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Krev brukerbekreftelse når denne nøkkelen blir brukt</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1978,6 +2672,10 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Arv fra foreldre-gruppe (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -1987,7 +2685,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Type:</source>
- <translation type="unfinished"/>
+ <translation>Type:</translation>
</message>
<message>
<source>Path:</source>
@@ -2006,67 +2704,97 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<translation>Inaktiv</translation>
</message>
<message>
- <source>Import from path</source>
+ <source>KeeShare unsigned container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to path</source>
+ <source>KeeShare signed container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
+ <source>Select import source</source>
+ <translation>Velg kilde for importering</translation>
+ </message>
+ <message>
+ <source>Select export target</source>
+ <translation>Velg eksporteringsmål</translation>
+ </message>
+ <message>
+ <source>Select import/export file</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>Clear</source>
+ <translation>Tøm</translation>
+ </message>
+ <message>
+ <source>Import</source>
+ <translation>Importer</translation>
+ </message>
+ <message>
+ <source>Export</source>
+ <translation>Eksporter</translation>
+ </message>
+ <message>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database import is disabled</source>
+ <source>%1 is already being imported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Velg kilde for importering</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Velg eksporteringsmål</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
+ <source>Sharing mode field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Tøm</translation>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Password field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2100,6 +2828,34 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>&amp;Angi standard autoskriv-sekvens</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2136,22 +2892,10 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<translation>Alle filer</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Tilpasset ikon finnes allerede</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Bekreft sletting</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Velg Bilde(-r)</translation>
</message>
@@ -2161,7 +2905,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation type="unfinished"/>
+ <translation>Ingen ikoner ble lastet</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
@@ -2175,6 +2919,42 @@ Deaktivere sikker lagring og prøve igjen?</translation>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2220,6 +3000,30 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<source>Value</source>
<translation>Verdi</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2267,7 +3071,7 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Er du sikker på at du vil fjerne %n vedlegg?</numerusform><numerusform>Er du sikker på at du vil fjerne %n vedlegg?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2307,13 +3111,33 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message>
<source>Confirm remove</source>
- <translation type="unfinished"/>
+ <translation>Bekreft fjerning</translation>
</message>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Vedlegg</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2338,7 +3162,7 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message>
<source>URL</source>
- <translation>URL</translation>
+ <translation>Adresse</translation>
</message>
</context>
<context>
@@ -2362,7 +3186,7 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message>
<source>URL</source>
- <translation>URL</translation>
+ <translation>Adresse</translation>
</message>
<message>
<source>Never</source>
@@ -2398,20 +3222,16 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message>
<source>Yes</source>
- <translation type="unfinished"/>
+ <translation>JA</translation>
</message>
<message>
<source>TOTP</source>
- <translation type="unfinished"/>
+ <translation>TOTP</translation>
</message>
</context>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Opprett TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>Lukk</translation>
</message>
@@ -2482,7 +3302,7 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
- <translation type="unfinished"/>
+ <translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message>
<source>Enabled</source>
@@ -2496,6 +3316,14 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<source>Share</source>
<translation>Del</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avansert</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2529,15 +3357,37 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Papirkurv</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
- <translation type="unfinished"/>
+ <translation>[tom]</translation>
</message>
</context>
<context>
@@ -2552,6 +3402,58 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Lukk</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>Adresse</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2573,10 +3475,6 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<translation>Kan ikke utstede utfordrer-respons.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Feil nøkkel eller databasefil er skadet.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>manglende database-headere</translation>
</message>
@@ -2596,6 +3494,11 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<source>Invalid header data length</source>
<translation>Ugyldig: Header data length</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2627,10 +3530,6 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<translation>Ikke samsvar med SHA256-header</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Feil nøkkel eller databasefil er skadet. (HMAC-uoverensstemmelse)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Ukjent kryptering</translation>
</message>
@@ -2730,6 +3629,15 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Ugyldig: Variant map field type size</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2818,7 +3726,7 @@ Dette er en en-veis-migrasjon. Du kan ikke åpne den importerte databasen med de
</message>
<message>
<source>Failed to read database file.</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke lese databasefilen.</translation>
</message>
</context>
<context>
@@ -2950,13 +3858,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importer KeePass1-database</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Kan ikke åpne databasen.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3014,10 +3922,6 @@ Line %2, column %3</source>
<translation>Kan ikke kalkulere hovednøkkel</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Feil nøkkel eller databasefil er skadet.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Nøkkeltransformasjon feila</translation>
</message>
@@ -3113,39 +4017,56 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importer fra</translation>
+ <source>Imported from %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Eksporter til</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synkroniser med</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Deaktiver deling %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Imported from</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Exported to</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3175,26 +4096,22 @@ Line %2, column %3</source>
<message>
<source>Change %1</source>
<comment>Change a key component</comment>
- <translation type="unfinished"/>
+ <translation>Endre %1</translation>
</message>
<message>
<source>Remove %1</source>
<comment>Remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>Fjern %1</translation>
</message>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>%1 sett, klikk for å endre eller fjerne</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Bla gjennom</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Lag passord</translation>
</message>
@@ -3236,16 +4153,53 @@ Message: %2</source>
</message>
<message>
<source>Error creating key file</source>
- <translation type="unfinished"/>
+ <translation>Feil ved oppretting av nøkkelfil</translation>
</message>
<message>
<source>Unable to create key file: %1</source>
- <translation type="unfinished"/>
+ <translation>Kunne ikke opprette nøkkelfil: %1</translation>
</message>
<message>
<source>Select a key file</source>
<translation>Velg en nøkkelfil</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Bla gjennom...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3334,10 +4288,6 @@ Message: %2</source>
<translation>&amp;Oppsett</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Passordgenerator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Lås databaser</translation>
</message>
@@ -3387,7 +4337,7 @@ Message: %2</source>
</message>
<message>
<source>Access error for config file %1</source>
- <translation>Feil ved tilgang for konfigurasjonsfilen %1</translation>
+ <translation>Feil ved tilgang til konfigurasjonsfilen %1</translation>
</message>
<message>
<source>Settings</source>
@@ -3437,15 +4387,15 @@ Vi anbefaler at du bruker det AppImage som er tilgjengelig på nedlastingssiden.
</message>
<message>
<source>TOTP...</source>
- <translation type="unfinished"/>
+ <translation>TOTP...</translation>
</message>
<message>
<source>&amp;New database...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ny database...</translation>
</message>
<message>
<source>Create a new database</source>
- <translation type="unfinished"/>
+ <translation>Opprett en ny database</translation>
</message>
<message>
<source>&amp;Merge from database...</source>
@@ -3457,7 +4407,7 @@ Vi anbefaler at du bruker det AppImage som er tilgjengelig på nedlastingssiden.
</message>
<message>
<source>&amp;New entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ny oppføring</translation>
</message>
<message>
<source>Add a new entry</source>
@@ -3469,7 +4419,7 @@ Vi anbefaler at du bruker det AppImage som er tilgjengelig på nedlastingssiden.
</message>
<message>
<source>View or edit entry</source>
- <translation type="unfinished"/>
+ <translation>Vis eller endre oppføring</translation>
</message>
<message>
<source>&amp;New group</source>
@@ -3489,7 +4439,7 @@ Vi anbefaler at du bruker det AppImage som er tilgjengelig på nedlastingssiden.
</message>
<message>
<source>Copy &amp;password</source>
- <translation type="unfinished"/>
+ <translation>Kopier &amp;passord</translation>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
@@ -3497,55 +4447,115 @@ Vi anbefaler at du bruker det AppImage som er tilgjengelig på nedlastingssiden.
</message>
<message>
<source>Open &amp;URL</source>
- <translation type="unfinished"/>
+ <translation>Åpne &amp;URL</translation>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation type="unfinished"/>
+ <translation>KeePass 1 database...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
- <translation type="unfinished"/>
+ <translation>Importer en KeePass 1 database</translation>
</message>
<message>
<source>CSV file...</source>
- <translation type="unfinished"/>
+ <translation>CSV fil...</translation>
</message>
<message>
<source>Import a CSV file</source>
- <translation type="unfinished"/>
+ <translation>Importer en CSV-fil</translation>
</message>
<message>
<source>Show TOTP...</source>
- <translation type="unfinished"/>
+ <translation>Vis TOTP...</translation>
</message>
<message>
<source>Show TOTP QR Code...</source>
+ <translation>Vis TOTP QR Kode...</translation>
+ </message>
+ <message>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for Updates...</source>
+ <source>Check for updates on startup?</source>
+ <translation>Sjekk etter oppdateringer ved oppstart?</translation>
+ </message>
+ <message>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
+ <translation>Vil du at KeePassXC skal se etter oppdateringer ved oppstart?</translation>
+ </message>
+ <message>
+ <source>You can always check for updates manually from the application menu.</source>
+ <translation>Du kan alltid sjekke om oppdateringer manuelt fra programmenyen.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Share entry</source>
+ <source>&amp;Check for Updates...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Downlo&amp;ad all favicons</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>Sort &amp;A-Z</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>Sort &amp;Z-A</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Last ned ikoner</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3607,12 +4617,20 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation type="unfinished"/>
+ <translation>Opprett en ny KeePassXC database...</translation>
</message>
<message>
<source>Root</source>
@@ -3658,7 +4676,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizardPageMasterKey</name>
<message>
<source>Database Master Key</source>
- <translation type="unfinished"/>
+ <translation>Database hovednøkkel</translation>
</message>
<message>
<source>A master key known only to you protects your database.</source>
@@ -3669,7 +4687,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizardPageMetaData</name>
<message>
<source>General Database Information</source>
- <translation type="unfinished"/>
+ <translation>Generell database informasjon</translation>
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
@@ -3677,6 +4695,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3776,6 +4860,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3783,7 +4878,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Confirm password:</source>
- <translation type="unfinished"/>
+ <translation>Bekreft passord:</translation>
</message>
<message>
<source>Password</source>
@@ -3795,10 +4890,26 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passwords do not match.</source>
- <translation type="unfinished"/>
+ <translation>Passordene er ikke like.</translation>
</message>
<message>
<source>Generate master password</source>
+ <translation>Opprette hovedpassord</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3830,28 +4941,16 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Tegntyper</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Store bokstaver</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Små bokstaver</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Tall</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Spesialtegn</translation>
- </message>
- <message>
<source>Extended ASCII</source>
- <translation>Utvida ASCII</translation>
+ <translation>Utvidet ASCII</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
- <translation>Ekskluder tegn som er nesten makne</translation>
+ <translation>Ekskluder tegn som ligner hverandre</translation>
</message>
<message>
<source>Pick characters from every group</source>
@@ -3919,25 +5018,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Switch to advanced mode</source>
- <translation type="unfinished"/>
+ <translation>Bytt til avansert modus</translation>
</message>
<message>
<source>Advanced</source>
<translation>Avansert</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3970,18 +5061,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation type="unfinished"/>
</message>
<message>
- <source>Math</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Dashes</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>\_|-/</source>
<translation type="unfinished"/>
</message>
@@ -3995,11 +5078,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Switch to simple mode</source>
- <translation type="unfinished"/>
+ <translation>Bytt til enkel modus</translation>
</message>
<message>
<source>Simple</source>
- <translation type="unfinished"/>
+ <translation>Enkel</translation>
</message>
<message>
<source>Character set to exclude from generated password</source>
@@ -4029,6 +5112,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4036,11 +5187,8 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4048,7 +5196,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QMessageBox</name>
<message>
<source>Overwrite</source>
- <translation type="unfinished"/>
+ <translation>Erstatte</translation>
</message>
<message>
<source>Delete</source>
@@ -4056,7 +5204,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation type="unfinished"/>
+ <translation>Flytt</translation>
</message>
<message>
<source>Empty</source>
@@ -4068,7 +5216,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Skip</source>
- <translation type="unfinished"/>
+ <translation>Hopp over</translation>
</message>
<message>
<source>Disable</source>
@@ -4078,6 +5226,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4159,7 +5311,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>URL</source>
- <translation>URL</translation>
+ <translation>Adresse</translation>
</message>
<message>
<source>Prompt for the entry&apos;s password.</source>
@@ -4170,10 +5322,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Generer et passord til oppføringa.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Lengde på det genererte passordet.</translation>
- </message>
- <message>
<source>length</source>
<translation>lengde</translation>
</message>
@@ -4223,18 +5371,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Utfør avansert analyse på passordet.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Pakk ut og print innholdet av en database.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Sti til databasen som skal pakkes ut.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Sett inn passord for å låse opp %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4278,10 +5414,6 @@ Tilgjengelige kommandoer:
<translation>Slå sammen to databaser.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Sti til databasen det skal kombineres til.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Sti til databasen det skal slås sammen fra.</translation>
</message>
@@ -4358,10 +5490,6 @@ Tilgjengelige kommandoer:
<translation>Nettlesertillegg</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] utfordrings-respons - slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Trykk</translation>
</message>
@@ -4392,10 +5520,6 @@ Tilgjengelige kommandoer:
<translation>Generer et nytt tilfeldig passord.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4441,7 +5565,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Clipboard cleared!</source>
- <translation type="unfinished"/>
+ <translation>Utklippstavle ryddet!</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
@@ -4453,10 +5577,6 @@ Tilgjengelige kommandoer:
<translation>Antall</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation type="unfinished"/>
</message>
@@ -4478,7 +5598,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Length %1</source>
- <translation type="unfinished"/>
+ <translation>Lengde %1</translation>
</message>
<message>
<source>Entropy %1</source>
@@ -4526,7 +5646,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Type: Date</source>
- <translation type="unfinished"/>
+ <translation>Type: Dato</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
@@ -4566,7 +5686,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Type: Unknown%1</source>
- <translation type="unfinished"/>
+ <translation>Type: Ukjent%1</translation>
</message>
<message>
<source>Entropy %1 (%2)</source>
@@ -4581,24 +5701,6 @@ Tilgjengelige kommandoer:
<translation type="unfinished"/>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Kan ikke åpne filen %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Length of the generated password</source>
<translation type="unfinished"/>
</message>
@@ -4611,10 +5713,6 @@ Tilgjengelige kommandoer:
<translation type="unfinished"/>
</message>
<message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Use special characters</source>
<translation type="unfinished"/>
</message>
@@ -4644,7 +5742,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Cannot find group %1.</source>
- <translation type="unfinished"/>
+ <translation>Kan ikke finne gruppe %1 .</translation>
</message>
<message>
<source>Error reading merge file:
@@ -4718,7 +5816,7 @@ Tilgjengelige kommandoer:
<message>
<source>Invalid Settings</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>Ugyldige innstillinger</translation>
</message>
<message>
<source>Invalid Key</source>
@@ -4731,15 +5829,15 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>No groups found</source>
- <translation type="unfinished"/>
+ <translation>Ingen grupper funnet</translation>
</message>
<message>
<source>Create a new database.</source>
- <translation type="unfinished"/>
+ <translation>Opprett en ny database.</translation>
</message>
<message>
<source>File %1 already exists.</source>
- <translation type="unfinished"/>
+ <translation>Filen %1 eksisterer allerede.</translation>
</message>
<message>
<source>Loading the key file failed</source>
@@ -4755,11 +5853,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Successfully created new database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
+ <translation>Vellykket oppretting ny database.</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
@@ -4770,10 +5864,6 @@ Tilgjengelige kommandoer:
<translation type="unfinished"/>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Fjern oppføring fra databasen.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Sti til oppføring som skal fjernes.</translation>
</message>
@@ -4829,6 +5919,330 @@ Tilgjengelige kommandoer:
<source>Cannot create new group</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versjon %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Byggetype: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisjon: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribusjon: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operativsystem: %1
+CPU-arkitektur: %2
+Kjerne: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Autoskriv</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>Berørings-id</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ingen</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Aktive utvidelser:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4876,7 +6290,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation>Ingen agent kjører. Kan ikke identifisere.</translation>
+ <translation>Ingen agent kjører, kan ikke identifisere.</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
@@ -4951,7 +6365,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Examples</source>
- <translation type="unfinished"/>
+ <translation>Eksempler</translation>
</message>
</context>
<context>
@@ -4983,10 +6397,97 @@ Tilgjengelige kommandoer:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generelt</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Gruppe</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Databaseoppsett</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Lås opp databasen</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Lås database</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ingen</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
- <translation type="unfinished"/>
+ <translation>Aktiv</translation>
</message>
<message>
<source>Allow export</source>
@@ -5002,7 +6503,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>Fingeravtrykk:</translation>
</message>
<message>
<source>Certificate:</source>
@@ -5105,147 +6606,205 @@ Tilgjengelige kommandoer:
<source>Signer:</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ShareObserver</name>
<message>
- <source>Import from container without signature</source>
+ <source>Allow KeeShare imports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Allow KeeShare exports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Only show warnings and errors</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
+ <source>Key</source>
+ <translation>Nøkkel</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Never</source>
- <translation>Aldri</translation>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Always</source>
+ <source>Import existing certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Just this time</source>
+ <source>Export own certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Known shares</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Trust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Imported from %1</source>
+ <source>Ask whether to trust the selected certificate every time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Signed share container are not supported - import prevented</source>
+ <source>Untrust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File is not readable</source>
+ <source>Remove selected certificate</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareExport</name>
<message>
- <source>Invalid sharing container</source>
+ <source>Overwriting signed share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Untrusted import prevented</source>
+ <source>Could not write export container (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful signed import</source>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unexpected error</source>
+ <source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unsigned share container are not supported - import prevented</source>
+ <source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful unsigned import</source>
+ <source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File does not exist</source>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unknown share container type</source>
+ <source>Could not write export container</source>
+ <translation>Kunne ikke skrive eksport-container</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Uventet feil oppstått</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
+ <message>
+ <source>Import from container without signature</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container (%1)</source>
+ <source>Import from container with certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Kunne ikke skrive eksport-container</translation>
+ <source>Not this time</source>
+ <translation>Ikke denne gangen</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Uventet feil oppstått</translation>
+ <source>Never</source>
+ <translation>Aldri</translation>
</message>
<message>
- <source>Export to %1 failed (%2)</source>
- <translation>Eksport til %1 feilet (%2)</translation>
+ <source>Always</source>
+ <translation>Alltid</translation>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
- <translation>Eksport til %1 vellykket (%2)</translation>
+ <source>Just this time</source>
+ <translation>Bare denne gangen</translation>
</message>
<message>
- <source>Export to %1</source>
- <translation>Eksporter til %1</translation>
+ <source>Signed share container are not supported - import prevented</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <source>File is not readable</source>
+ <translation>Filen er ikke lesbar</translation>
+ </message>
+ <message>
+ <source>Invalid sharing container</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Multiple import source path to %1 in %2</source>
+ <source>Untrusted import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Conflicting export target path %1 in %2</source>
+ <source>Successful signed import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
+ <source>Unexpected error</source>
+ <translation>Uventet feil</translation>
+ </message>
+ <message>
+ <source>Unsigned share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed signature: Could not write file (%1)</source>
+ <source>Successful unsigned import</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not embed database: Could not open file to write (%1)</source>
+ <source>File does not exist</source>
+ <translation>Filen eksisterer ikke</translation>
+ </message>
+ <message>
+ <source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Could not embed database: Could not write file (%1)</source>
+ <source>Import from %1 failed (%2)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import from %1 successful (%2)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export to %1 failed (%2)</source>
+ <translation>Eksport til %1 feilet (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1 successful (%2)</source>
+ <translation>Eksport til %1 vellykket (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1</source>
+ <translation>Eksporter til %1</translation>
+ </message>
+ <message>
+ <source>Multiple import source path to %1 in %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5265,7 +6824,7 @@ Tilgjengelige kommandoer:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Utløper om %n sekund</numerusform><numerusform>Utløper om &lt;b&gt;%n&lt;/b&gt; sekunder</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -5295,10 +6854,6 @@ Tilgjengelige kommandoer:
<translation>Oppsett TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Nøkkel:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Standard RFC 6238 token-innstillinger</translation>
</message>
@@ -5328,16 +6883,45 @@ Tilgjengelige kommandoer:
<translation>Kodestørrelse:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 siffer</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritme:</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 siffer</translation>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 siffer</translation>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5411,7 +6995,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Import from CSV</source>
- <translation>Importer fra CSV-fil</translation>
+ <translation>Importer fra CSV</translation>
</message>
<message>
<source>Recent databases</source>
@@ -5421,6 +7005,14 @@ Tilgjengelige kommandoer:
<source>Welcome to KeePassXC %1</source>
<translation>Velkommen til KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5444,5 +7036,13 @@ Tilgjengelige kommandoer:
<source>No YubiKey inserted.</source>
<translation>Ingen YubiKey satt inn.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts
index 3939985fc..49feaec0b 100644
--- a/share/translations/keepassx_nl_NL.ts
+++ b/share/translations/keepassx_nl_NL.ts
@@ -61,7 +61,7 @@
<name>ApplicationSettingsWidget</name>
<message>
<source>Application Settings</source>
- <translation>Programma-instellingen</translation>
+ <translation>Programma instellingen</translation>
</message>
<message>
<source>General</source>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Volg stijl</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Instellingen herstellen? </translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Weet je zeker dat je de algemene en beveiligingsinstellingen opnieuw wilt instellen?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Start niet meer dan één instantie van KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Laatstgebruikte databases onthouden</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Laatstgebruikte sleutelbestanden en beveiligingsdongles onthouden</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Laatstgebruikte databases openen bij het opstarten</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Scherm minimaliseren bij het opstarten</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Gebruik groepspictogram voor nieuwe items</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimaliseer bij kopiëren naar klembord</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Verberg voorvertoning</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Minimaliseren naar systeemvak</translation>
</message>
<message>
- <source>Language</source>
- <translation>Taal</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Auto-type</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Auto-type startvertraging</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Controleer op updates bij het starten van de applicatie</translation>
+ <source>Movable toolbar</source>
+ <translation>Beweegbare gereedschapsbalk</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Zoek ook naar pre-releases bij het controleren op updates</translation>
+ <source>Remember previously used databases</source>
+ <translation>Laatstgebruikte databases onthouden</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Beweegbare gereedschapsbalk</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Laatstgebruikte databases openen bij het opstarten</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation>Laatstgebruikte sleutelbestanden en beveiligingsdongles onthouden</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Eens per week bij het opstarten van de toepassing zoeken naar updates</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Zoek ook naar bèta-releases bij het zoeken naar updates</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Knopstijl</translation>
+ <source>Button style:</source>
+ <translation>Knopstijl:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Taal:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(programma opnieuw starten om te activeren)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Venster minimaliseren na ontgrendelen van database</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimaliseren bij het openen van een URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Venster verbergen bij kopiëren naar klembord</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimaliseren</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Naar achtergrond verplaatsen</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Favicon download time-out:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Websitepictogram download time-out seconden</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sec</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Knopstijl van de werkbalk</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Mono-lettertype gebruiken voor notities</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Taalkeuze</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Standaardinstellingen herstellen</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Globale sneltoets voor Auto-type</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Auto-typevertraging milliseconden</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Auto-type startvertraging milliseconden</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Privacy</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Gebruik DuckDuckGo voor het downloaden van de website-pictogrammen</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>DuckDuckGo gebruiken om websitepictogrammen te downloaden</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Klembord wissen in seconden</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Touch ID inactiviteit resetten</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Database vergrendeling wachttijd seconden</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Zoekopdracht wissen na</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>&amp;Gebruikersnaam kopiëren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>&amp;Wachtwoord kopiëren</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -397,7 +498,11 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation>Kies item om automatisch te typen:</translation>
+ <translation>Kies item voor Auto-type:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>Zoeken…</translation>
</message>
</context>
<context>
@@ -421,9 +526,17 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
- <translation>%1 vraagt toegang tot jouw wachtwoorden voor de volgende item(s).
+ <translation>%1 vraagt toegang tot jouw wachtwoorden voor het volgende.
Geef aan of je toegang wilt verlenen of niet.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Toegang verlenen</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Weiger toegang</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
<translation>Dit is vereist voor toegang tot jouw databases met KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>KeePassXC browserintegratie activeren</translation>
- </message>
- <message>
<source>General</source>
<translation>Algemeen</translation>
</message>
@@ -491,11 +600,11 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
- <translation>Verzoek om database te ontgrendelen als deze vergrendeld is</translation>
+ <translation>Verzoek om database te ontgrendelen</translation>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>Alleen invoer van hetzelfde schema (http://, https://, …) wordt gegeven.</translation>
+ <translation>Alleen items van hetzelfde schema (http://, https://, …) wordt gegeven.</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
@@ -526,21 +635,17 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Nooit &amp;waarschuwen bij toegang tot logingegevens</translation>
+ <translation>Nooit &amp;waarschuwen bij toegang tot inloggegevens</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Nooit waarschuwen bij &amp;bijwerken van logingegevens</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Alleen de geselecteerde database hoeft verbonden te zijn.</translation>
+ <translation>Nooit waarschuwen bij &amp;bijwerken van inloggegevens</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>&amp;Zoek in alle geopende databases voor overeenkomende logingegevens</translation>
+ <translation>&amp;Zoek in alle geopende databases voor overeenkomende inloggegevens</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
@@ -548,7 +653,7 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>Geef geavanceerde teken&amp;reeks-velden die beginnen met &quot;KPH: &quot;</translation>
+ <translation>Lever &amp;geavanceerde tekenreeks-velden die met &quot;KPH: &quot; beginnen.</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
@@ -593,10 +698,6 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
<translation>&amp;Tor browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Waarschuwing&lt;/b&gt;, de keepassxc-proxy-applicatie is niet gevonden!&lt;br /&gt;Controleer de installatiemap van KeePassXC of bevestig het aangepaste pad in geavanceerde opties.&lt;br /&gt;De browserintegratie zal NIET WERKEN zonder de proxy-applicatie.&lt;br /&gt;Verwacht pad: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Uitvoerbare bestanden</translation>
</message>
@@ -611,7 +712,7 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation>Vanwege de Snap sandboxing, moet je een script uitvoeren waarmee browser integratie mogelijk wordt. &lt;br /&gt; Je kunt dit script vinden op %1</translation>
+ <translation>Vanwege de module sandboxing is het nodig een script uit te voeren dat de browser integratie mogelijk maakt. &lt;br /&gt; Je kunt dit script krijgen via %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
@@ -619,7 +720,51 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
- <translation>KeePassXC-Browser is vereist om de integratie van de browser te laten werken. &lt;br /&gt; download het voor %1 en %2. %3</translation>
+ <translation>KeePassXC-Browser is vereist om de integratie van de browser te laten werken. &lt;br /&gt; Download het voor %1 en %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Geeft verlopen inloggegevens. Woord [expired] is aan de titel toegevoegd.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Verlopen inloggegevens toestaan.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Browserintegratie inschakelen</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Browsers die als snaps zijn geïnstalleerd, worden momenteel niet ondersteund.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Alle databases verbonden met de extensie kunnen overeenkomende inloggegevens geven.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Laat de pop-up die de migratie van KeePassHTTP naar KeePassXC-Browser aanbiedt, niet meer zien.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Vraag niet om de KeePassHTTP instellingen te migreren naar KeePassXC-Browser.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Handmatig Proxy invulveld</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Blader naar eigen Proxy configuratiebestand</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Waarschuwing&lt;/b&gt;, de keepassxc-proxy-applicatie kon niet worden gevonden!&lt;br /&gt;Controleer de KeePassXC-installatiefolder of bevestig het aangepaste pad in de geavanceerde instellingen.&lt;br /&gt;Browserintegratie ZAL NIET WERKEN zonder de proxy-applicatie.&lt;br /&gt;Verwacht Pad: %1</translation>
</message>
</context>
<context>
@@ -666,7 +811,7 @@ Wil je deze overschrijven?</translation>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation>Kenmerken worden omgezet in speciala data...</translation>
+ <translation>Kenmerken worden omgezet in gebruikersinstellingen...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
@@ -676,11 +821,11 @@ Wil je deze overschrijven?</translation>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
<translation>Kenmerken van %1 item(s) is/zijn geconverteerd.
-%2 sleutels naar speciale data verplaatst.</translation>
+%2 sleutels naar gebruikersinstellingen verplaatst.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>Sleutel is verplaats naar speciale data.</numerusform><numerusform>Sleutels zijn verplaats naar speciale data.</numerusform></translation>
+ <translation><numerusform>Verplaatst %n sleutels aan aangepaste gegevens.</numerusform><numerusform>%n sleutels verplaatst naar gebruikersinstellingen.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Dit is nodig om de huidige browser verbindingen te behouden.
Wil je de bestaande instellingen nu migreren?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Deze waarschuwing niet meer geven</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -731,7 +880,7 @@ Wil je de bestaande instellingen nu migreren?</translation>
</message>
<message>
<source>Copy history</source>
- <translation>Historie kopiëren</translation>
+ <translation>Geschiedenis kopiëren</translation>
</message>
</context>
<context>
@@ -773,12 +922,8 @@ Wil je de bestaande instellingen nu migreren?</translation>
<translation>Eerste record bevat veldnamen</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Aantal te negeren kopregels</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
- <translation>Beschouw &apos;\&apos; als escape-karakter</translation>
+ <translation>Beschouw &apos;\&apos; als escape-teken</translation>
</message>
<message>
<source>Preview</source>
@@ -826,12 +971,28 @@ Wil je de bestaande instellingen nu migreren?</translation>
<translation>CSV importeren: schrijver heeft fouten:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Tekstkwalificatie</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Veld scheiding</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Aantal te negeren kopregels</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV import voorbeeld</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>1 kolom</numerusform><numerusform>%n kolom(men)</numerusform></translation>
+ <translation><numerusform>%n kolom(men)</numerusform><numerusform>%n kolom(men)</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -840,7 +1001,7 @@ Wil je de bestaande instellingen nu migreren?</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte (s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
+ <translation><numerusform>%n byte(s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
@@ -867,16 +1028,34 @@ Wil je de bestaande instellingen nu migreren?</translation>
<translation>Fout bij het lezen van de database: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Kan niet opslaan, database heeft geen bestandsnaam.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Bestand kan niet worden geschreven omdat het in de alleen-lezen modus is geopend.</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
- <translation>Toets niet getransformeerd. Dit is een bug, rapporteer deze alstublieft aan de ontwikkelaars!</translation>
+ <translation>Sleutel niet getransformeerd. Dit is een bug, rapporteer deze alstublieft aan de ontwikkelaars!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Back-up databestand staat op %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Kan niet opslaan. Database is geen geldig bestand.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Kan niet opslaan. Database is alleen-lezen.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Database heeft niet opgeslagen gegevens.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Prullenbak</translation>
</message>
</context>
<context>
@@ -889,30 +1068,14 @@ Wil je de bestaande instellingen nu migreren?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Hoofdsleutel invoeren</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Sleutelbestand:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Wachtwoord:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Bladeren</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Vernieuwen</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Challenge/response:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Verouderd sleutelbestandsformaat</translation>
</message>
@@ -923,7 +1086,7 @@ unsupported in the future.
Please consider generating a new key file.</source>
<translation>Je gebruikt een verouderd sleutelbestandsformaat dat in de toekomst niet ondersteund zal worden.
-Overweeg a.u.b. een nieuw sleutelbestand te genereren.</translation>
+Overweeg een nieuw sleutelbestand te genereren.</translation>
</message>
<message>
<source>Don&apos;t show this warning again</source>
@@ -942,20 +1105,100 @@ Overweeg a.u.b. een nieuw sleutelbestand te genereren.</translation>
<translation>Kies sleutelbestand</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID voor snel ontgrendelen</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Kon sleutelbestand niet openen: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Kan database niet openen:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Kies positie...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Kan sleutelbestand niet openen:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Ontgrendel KeePassXC-database</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Geef wachtwoord:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Wachtwoord invulveld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Laat wachtwoord wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Aanvullende inloggegevens:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Sleutelbestand</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardwaresleutel positie selectie</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Blader naar sleutelbestand</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Bladeren…</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Hardwaretoken verversen</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Hardwaresleutel:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Je kunt een hardwarebeveiligingssleutel gebruiken, zoals een &lt;strong&gt;YubiKey&lt;/strong&gt; of &lt;strong&gt;onlykey&lt;/strong&gt; met posities &quot;slots&quot; die zijn geconfigureerd voor HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Klik hier voor meer informatie...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Hardwaresleutelhulp</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID voor snelle ontgrendeling</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Wissen</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Wis sleutelbestand</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Kies bestand...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Ontgrendeling mislukt en geen wachtwoord ingevoerd</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Het ontgrendelen van de database is mislukt en je hebt geen wachtwoord ingevoerd.
+Wil je het opnieuw proberen met een &quot;leeg&quot; wachtwoord?
+
+Om te voorkomen dat deze fout verschijnt ga je naar &quot;Database instellingen.../Beveiliging&quot; gaan en reset dan het wachtwoord.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Probeer opnieuw met leeg wachtwoord</translation>
</message>
</context>
<context>
@@ -1008,7 +1251,7 @@ Overweeg a.u.b. een nieuw sleutelbestand te genereren.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation>Verplaats KeePassHTTP kenmerken naar KeePassXC-browser &amp;speciale data</translation>
+ <translation>Verplaats KeePassHTTP kenmerken naar KeePassXC-browser &amp;gebruikersinstellingen</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1064,7 +1307,7 @@ Hierdoor werkt de verbinding met de browser plugin mogelijk niet meer.</translat
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>%n coderingssleutel uit KeePassXC instellingen verwijderd.</numerusform><numerusform>%n coderingssleutel(s) uit KeePassXC instellingen verwijderd.</numerusform></translation>
+ <translation><numerusform>%n encryptiesleutel(s) is/zijn verwijderd van KeePassXC-instellingen.</numerusform><numerusform>%n encryptiesleutel(s) is/zijn verwijderd van KeePassXC-instellingen.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1089,7 +1332,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Machtigingen zijn verwijderd uit %n item(s).</numerusform><numerusform>Machtigingen zijn verwijderd uit %n item(s).</numerusform></translation>
+ <translation><numerusform>Machtigingen van %n entry(s) zijn verwijderd.</numerusform><numerusform>Machtigingen van %n entry(s) zijn verwijderd.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1101,7 +1344,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation>Verplaats KeePassHTTP kenmerken naar speciale data</translation>
+ <translation>Verplaats KeePassHTTP kenmerken naar gebruikersinstellingen</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
@@ -1109,6 +1352,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Wil je echt alle instellingen voor de oudere browserintegratie veranderen naar de nieuwste standaard?
Dit is nodig om compatibiliteit met de browser plugin te behouden.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Opgeslagen browsersleutels</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Verwijder gekozen sleutel</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1239,7 +1490,7 @@ Als je dit aantal aanhoudt is het mogelijk heel gemakkelijk om de database te kr
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>thread(s)</numerusform><numerusform>thread(s)</numerusform></translation>
+ <translation><numerusform> thread(s)</numerusform><numerusform> thread(s)</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1251,6 +1502,57 @@ Als je dit aantal aanhoudt is het mogelijk heel gemakkelijk om de database te kr
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Verander bestaande decodeer tijd</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Decodeer tijd in seconden</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Database-indeling</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Versleutelingsalgoritme</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Sleutelafleidingsfunctie</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Transformatierondes</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Geheugengebruik</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Parallelliteit</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Beschikbare items</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Deze database niet blootstellen</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Items onder deze groep beschikbaar stellen:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Schakel fd.o Secret Service in om toegang te krijgen tot deze instellingen.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1272,11 +1574,11 @@ Als je dit aantal aanhoudt is het mogelijk heel gemakkelijk om de database te kr
</message>
<message>
<source>History Settings</source>
- <translation>Geschiedenis-instellingen</translation>
+ <translation>Geschiedenis instellingen</translation>
</message>
<message>
<source>Max. history items:</source>
- <translation>Max. geschiedenisitems:</translation>
+ <translation>Max. aantal vorige versies:</translation>
</message>
<message>
<source>Max. history size:</source>
@@ -1298,6 +1600,40 @@ Als je dit aantal aanhoudt is het mogelijk heel gemakkelijk om de database te kr
<source>Enable &amp;compression (recommended)</source>
<translation>&amp;Compressie toepassen (aanbevolen)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Databasenaamveld</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Databaseomschrijvingveld</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Standaardgebruikersnaamveld</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Maximum aantal vorige versies per item</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Maximale grootte van vorige versies per item</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Verwijder prullenbak</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Wil je de huidige prullenbak verwijderen en al zijn inhoud?
+Deze actie is onomkeerbaar.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(oud)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1343,7 +1679,7 @@ Als je dit aantal aanhoudt is het mogelijk heel gemakkelijk om de database te kr
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation>Je moet minstens één coderingssleutel aan de database toevoegen om deze te beveiligen!</translation>
+ <translation>Je moet minstens één coderingssleutel aan uw database toevoegen om deze te beveiligen!</translation>
</message>
<message>
<source>No password set</source>
@@ -1365,6 +1701,10 @@ Weet je zeker dat je door wilt gaan zonder wachtwoord?</translation>
<source>Failed to change master key</source>
<translation>Hoofdsleutel wijzigen is niet gelukt</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Doorgaan zonder wachtwoord</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1376,6 +1716,129 @@ Weet je zeker dat je door wilt gaan zonder wachtwoord?</translation>
<source>Description:</source>
<translation>Beschrijving:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Databasenaamveld</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Databaseomschrijvingveld</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statistieken</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Beweeg de muis over regels met fout pictogrammen voor meer informatie.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Naam</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Waarde</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Database naam</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Beschrijving</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Locatie</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Laatst opgeslagen</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Niet-opgeslagen wijzigingen</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>ja</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>nee</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>De database is bewerkt, maar de wijzigingen zijn nog niet op disk opgeslagen.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Aantal groepen</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Aantal items</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Aantal verlopen items</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>De database bevat items die verlopen zijn.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Unieke wachtwoorden</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Niet-unieke wachtwoorden</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Meer dan 10% van de wachtwoorden zijn herbruikt. Gebruik waar mogelijk unieke wachtwoorden.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Maximaal wachtwoordherbruik</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Verscheidene wachtwoorden worden meer dan drie keer gebruikt. Gebruik waar mogelijk unieke wachtwoorden.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Aantal korte wachtwoorden</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Aangeraden minimumlengte voor wachtwoorden is 8 tekens.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Aantal zwakke wachtwoorden</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Het is aanbevolen om lange, willekeurige wachtwoorden te gebruiken met een beoordeling van &apos;goed&apos; of &apos;uitstekend&apos;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Gemiddeld wachtwoordlengte</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 tekens</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Gemiddeld wachtwoordlengte is minder dan tien tekens. Langere wachtwoorden bieden meer veiligheid.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1423,11 +1886,7 @@ Weet je zeker dat je door wilt gaan zonder wachtwoord?</translation>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
<translation>De aangemaakte database heeft geen sleutel of KDF, dit weiger ik op te slaan.
-Dit is zeker een bug, rapporteer dit a.u.b. aan de ontwikkelaars.</translation>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Het databasebestand bestaat niet of is niet toegankelijk.</translation>
+Dit is zeker een bug, rapporteer dit alsjeblieft aan de ontwikkelaars.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1452,6 +1911,30 @@ Dit is zeker een bug, rapporteer dit a.u.b. aan de ontwikkelaars.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [alleen lezen]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Kon %1 niet openen. Het bestaat niet of is niet toegankelijk.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Exporteer database naar HTML-bestand</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML bestand</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Schrijven van het HTML-bestand is mislukt.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Exporteerbevestiging</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Je gaat je database naar een niet-versleuteld bestand exporteren. Dit zal je wachtwoorden en gevoelige informatie kwetsbaar maken! Weet je zeker dat je door wil gaan?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1469,7 +1952,7 @@ Dit is zeker een bug, rapporteer dit a.u.b. aan de ontwikkelaars.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Wil je echt %n item naar de Prullenbak verplaatsen?</numerusform><numerusform>Wil je echt %n item(s) naar de Prullenbak verplaatsen?</numerusform></translation>
+ <translation><numerusform>Wil je echt %n entry(s) naar de prullenbak verplaatsen?</numerusform><numerusform>Weet je zeker dat je %n entry(s) naar de prullenbak wil verplaatsen?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1531,19 +2014,15 @@ Wil je de wijzigingen samenvoegen?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Wilt u echt %n item(s) voorgoed verwijderen?</numerusform><numerusform>Wil je echt %n item(s) voorgoed verwijderen?</numerusform></translation>
+ <translation><numerusform>Wil je echt %n entry(s) definitief verwijderen?</numerusform><numerusform>Weet je zeker dat je %n entry(s) definitief wil verwijderen?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Verwijderen entry(s)?</numerusform><numerusform>Item(s) verwijderen?</numerusform></translation>
+ <translation><numerusform>Verwijderen entry(s)?</numerusform><numerusform>Verwijderen entry(s)?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Item(s) naar prullenbak verplaatsen?</numerusform><numerusform>Item(s) naar prullenbak verplaatsen?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Bestand geopend in lees-modus.</translation>
+ <translation><numerusform>Entry(s) naar Prullenbak verplaatsen</numerusform><numerusform>Item(s) naar Prullenbak verplaatsen</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1583,13 +2062,7 @@ Fout: %1</translation>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
<translation>KeePassXC heeft meerdere keren geprobeerd de database op te slaan maar het is niet gelukt. Dit wordt waarschijnlijk veroorzaakt doordat een synchronisatie-dienst het bestand bezet houd.
-Veilig opslaan afschakelen en opnieuw proberen?</translation>
- </message>
- <message>
- <source>Writing the database failed.
-%1</source>
- <translation>Het schrijven van de database is mislukt.
-%1</translation>
+Veilig opslaan uitschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Passwords</source>
@@ -1609,7 +2082,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>Vermelding &quot;%1&quot; heeft %2 reference(s). Wilt u verwijzingen vervangen door waarden, dit bericht overslaan of verwijderen toch?</numerusform><numerusform>Item &quot;%1&quot; heeft %2 referentie(s). Wil je de verwijzingen vervangen door waarden, dit bericht overslaan, of toch verwijderen ?</numerusform></translation>
+ <translation><numerusform>Item &quot;%1&quot; heeft %2 referentie(s). Wil je verwijzingen vervangen door waarden, dit item overslaan, of alsnog verwijderen?</numerusform><numerusform>Item &quot;%1&quot; heeft %2 referentie(s). Wil je verwijzingen vervangen door waarden, dit item overslaan, of alsnog verwijderen?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1635,6 +2108,14 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Shared group...</source>
<translation>Gedeelde groep...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Het schrijven van de database is mislukt: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>De database is in alleen-lezenmodus geopend. Automatisch opslaan is uitgeschakeld.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1648,7 +2129,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Icon</source>
- <translation>Icoon</translation>
+ <translation>Pictogram</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -1688,7 +2169,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Entry history</source>
- <translation>Geschiedenis van item</translation>
+ <translation>Item geschiedenis</translation>
</message>
<message>
<source>Add entry</source>
@@ -1716,19 +2197,19 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n week</numerusform><numerusform>%n weken</numerusform></translation>
+ <translation><numerusform>1 week</numerusform><numerusform>%n weken</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n maand</numerusform><numerusform>%n maanden</numerusform></translation>
+ <translation><numerusform>%n maand(en)</numerusform><numerusform>%n maand(en)</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
- <translation>Gegenereerd wachtwoord toepassen?</translation>
+ <translation>Gegenereerde wachtwoord opslaan?</translation>
</message>
<message>
<source>Do you want to apply the generated password to this entry?</source>
- <translation>Wil je het gegenereerde wachtwoord toepassen voor dit item?</translation>
+ <translation>Wil je het gegenereerde wachtwoord in dit item opslaan?</translation>
</message>
<message>
<source>Entry updated successfully.</source>
@@ -1748,12 +2229,24 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n jaar</numerusform><numerusform>%n jaren</numerusform></translation>
+ <translation><numerusform>1 jaar</numerusform><numerusform>%n jaren</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Verwijdering bevestigen</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Browserintegratie</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Weet je zeker dat je dit URL wil verwijderen?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1779,7 +2272,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Reveal</source>
- <translation>Tonen</translation>
+ <translation>Weergeven</translation>
</message>
<message>
<source>Attachments</source>
@@ -1793,6 +2286,42 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Background Color:</source>
<translation>Achtergrondkleur:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Kenmerkselectie</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Kenmerkwaarde</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Een nieuw kenmerk toevoegen</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Gekozen kenmerk verwijderen</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Wijzig kenmerknaam</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Kenmerkbescherming aan/uit</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Een beschermd kenmerk weergeven</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Voorgrondkleurselectie</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Achtergrondkleurselectie</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1828,12 +2357,83 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Gebruik een specifieke tekenreeks voor deze associatie.</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Aangepaste Auto-type tekenreeks</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Open Auto-type help-webpagina</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Bestaande venster koppelingen</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Voeg venster koppeling toe</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Verwijder scherm koppeling</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Je kunt een ster (*) gebruiken om alles te vinden</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Stel de venster koppeling titel in</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Je kunt een sterretje gebruiken om alles te vinden</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Aangepaste Auto-type tekenreeks voor dit venster</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Deze instellingen beïnvloeden het gedrag van de browserextensie voor dit item.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Algemeen</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Automatisch versturen uitzetten voor dit item</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Verberg dit item in de browserextensie</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Extra URLs</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Toevoegen</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Verwijderen</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Wijzigen</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
- <translation>Tonen</translation>
+ <translation>Weergeven</translation>
</message>
<message>
<source>Restore</source>
@@ -1847,6 +2447,26 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Delete all</source>
<translation>Alles verwijderen</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Item geschiedenis selectie</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Toon het item zoals in geselecteerde vorige versie</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Herstel het item naar de geselecteerde vorige versie</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Verwijder geselecteerde vorige versie</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Verwijder alle vorige versies</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1876,7 +2496,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation>Schakelen aan om notities te tonen.</translation>
+ <translation>Selecteer om notities weer te geven.</translation>
</message>
<message>
<source>Username:</source>
@@ -1886,6 +2506,62 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Expires</source>
<translation>Verloopt</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>URL veld</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Pictogram downloaden voor URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Wachtwoord herhaling veld</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Laat wachtwoordgenerator wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Wachtwoord invulveld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Laat wachtwoord wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Laat notities wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Vervaldatum veld</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Vervaldatum voorinstellingen</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Vervaldatum voorinstellingen</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Notities veld</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Titel veld</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Gebruikersnaam veld</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Vervaldatum wel/niet tonen</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1962,6 +2638,22 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Bevestiging van de gebruiker vragen als deze sleutel wordt gebruikt</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Blader naar sleutelbestand</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Extern sleutelbestand</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Selecteer bijlage bestand</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1971,7 +2663,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Icon</source>
- <translation>Icoon</translation>
+ <translation>Pictogram</translation>
</message>
<message>
<source>Properties</source>
@@ -1997,6 +2689,10 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Overnemen van bovenliggende groep (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Het item heeft niet opgeslagen wijzigingen</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2025,68 +2721,99 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<translation>Inactief</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importeren van pad</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare niet-ondertekende container</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exporteren naar pad</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare ondertekende container</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchroniseren met pad</translation>
+ <source>Select import source</source>
+ <translation>Selecteer bron voor import</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Deze KeePassXC-versie biedt geen ondersteuning voor het delen van jouw container type. Gebruik %1.</translation>
+ <source>Select export target</source>
+ <translation>Selecteer doel voor export</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Database delen is uitgeschakeld</translation>
+ <source>Select import/export file</source>
+ <translation>Selecteer import/export bestand</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Database exporteren is uitgeschakeld</translation>
+ <source>Clear</source>
+ <translation>Wissen</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Database importeren is uitgeschakeld</translation>
+ <source>Import</source>
+ <translation>Importeren</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare niet-ondertekende container</translation>
+ <source>Export</source>
+ <translation>Exporteren</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare ondertekende container</translation>
+ <source>Synchronize</source>
+ <translation>Synchroniseer</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Selecteer bron voor import</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Deze KeePassXC-versie biedt geen ondersteuning voor het delen van dit container type.
+Ondersteund zijn: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Selecteer doel voor export</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Selecteer import/export bestand</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Wissen</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Er wordt al verwezen naar export container %1.</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare is momenteel uitgeschakeld. Je kunt importeren/exporteren inschakelen in de instellingen.</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Import container %1 is al geïmporteerd.</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Database export is momenteel uitgeschakeld in de programma instellingen.</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>De container %1 is geïmporteerd en geëxporteerd door verschillende groepen.</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Database import is momenteel uitgeschakeld in de programma instellingen.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Delen modus veld</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Pad naar te delen bestand veld</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Wachtwoord invulveld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Laat wachtwoord wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Laat wachtwoordgenerator wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Wis velden</translation>
</message>
</context>
<context>
@@ -2117,26 +2844,54 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
- <translation>Standaard Auto-type volgorde instellen</translation>
+ <translation>Standaard Auto-type tekenreeks instellen</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation>Naam veld</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Notities veld</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Vervaldatum wel/niet tonen</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Auto-type aan/uit voor deze en onderliggende groepen</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Vervaldatum veld</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Zoeken aan/uit voor deze en onderliggende groepen</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Standaard Auto-type tekenreeks veld</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
<message>
<source>&amp;Use default icon</source>
- <translation>Standaardicoon &amp;gebruiken</translation>
+ <translation>Standaardpictogram &amp;gebruiken</translation>
</message>
<message>
<source>Use custo&amp;m icon</source>
- <translation>Aangepast icoon gebruiken</translation>
+ <translation>Aangepast pictogram gebruiken</translation>
</message>
<message>
<source>Add custom icon</source>
- <translation>Icoon toevoegen</translation>
+ <translation>Pictogram toevoegen</translation>
</message>
<message>
<source>Delete custom icon</source>
- <translation>Icoon verwijderen</translation>
+ <translation>Pictogram verwijderen</translation>
</message>
<message>
<source>Download favicon</source>
@@ -2144,7 +2899,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>Favicon kan niet worden opgehaald.</translation>
+ <translation>Kan favicon niet ophalen.</translation>
</message>
<message>
<source>Images</source>
@@ -2155,22 +2910,10 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
<translation>Alle bestanden</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Icoon bestaat al</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Verwijdering bevestigen</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Pictogram is gedownload</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Tip: Je kunt DuckDuckGo als alternatief inschakelen onder Extra&gt;Instellingen&gt;Beveiliging</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Selecteer afbeelding(en)</translation>
</message>
@@ -2188,11 +2931,47 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>De volgende pictogram(men) mislukten:</numerusform><numerusform>De volgende pictogram(men) mislukten:</numerusform></translation>
+ <translation><numerusform>De volgende pictogram(men) mislukte(n):</numerusform><numerusform>De volgende pictogram(men) mislukte(n):</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Dit pictogram wordt gebruikt door %n item(s) en zal worden vervangen door het standaardpictogram. Weet je zeker dat je het wilt verwijderen?</numerusform><numerusform>Dit pictogram wordt gebruikt door %n item(s) en zal worden vervangen door het standaardpictogram. Weet je zeker dat je het wilt verwijderen?</numerusform></translation>
+ <translation><numerusform>Dit pictogram wordt gebruikt door %n item(s) en zal worden vervangen door het standaardpictogram. Weet je zeker dat je het wil verwijderen?</numerusform><numerusform>Dit pictogram wordt gebruikt door %n item(s) en zal worden vervangen door het standaardpictogram. Weet je zeker dat je het wil verwijderen?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Je kunt de DuckDuckGo website pictogram dienst inschakelen onder Extra&gt;Instellingen&gt;Beveiliging</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Pictogram downloaden voor URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Gebruik het geselecteerde pictogram voor onderliggende groepen en items</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Pictogram &amp;toepassen op...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Alleen hier toepassen</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Ook toepassen op onderliggende groepen</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Ook toepassen op onderliggende items</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Ook toepassen op alle onderliggenden</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Bestaand pictogram geselecteerd.</translation>
</message>
</context>
<context>
@@ -2239,6 +3018,30 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<source>Value</source>
<translation>Waarde</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Datum tijd gemaakt</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Datum tijd gewijzigd</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Datum tijd laatste toegang</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2286,7 +3089,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Weet je zeker dat je %n bijlage wil verwijderen?</numerusform><numerusform>Weet je zeker dat je %n bijlagen wil verwijderen?</numerusform></translation>
+ <translation><numerusform>Weet je zeker dat je %n bijlage(n) wil verwijderen?</numerusform><numerusform>Weet je zeker dat je %n bijlage(n) wil verwijderen?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2295,7 +3098,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<message>
<source>Unable to create directory:
%1</source>
- <translation>Map niet kunnen maken:
+ <translation>Kan de map niet maken:
%1</translation>
</message>
<message>
@@ -2309,19 +3112,19 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<message>
<source>Unable to save attachments:
%1</source>
- <translation>Bijlagen niet kunnen opslaan:
+ <translation>Kan de bijlagen niet opslaan:
%1</translation>
</message>
<message>
<source>Unable to open attachment:
%1</source>
- <translation>Bijlage niet kunnen openen:
+ <translation>Kan de bijlage niet openen:
%1</translation>
</message>
<message>
<source>Unable to open attachments:
%1</source>
- <translation>Kon de bijlagen niet openen:
+ <translation>Kan de bijlagen niet openen:
%1</translation>
</message>
<message>
@@ -2331,7 +3134,29 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Kan niet openen van bestanden: %1</numerusform><numerusform>Kan bestand(en): %1 niet openen</numerusform></translation>
+ <translation><numerusform>Kan de volgende bestanden niet openen:
+%1</numerusform><numerusform>Kan de volgende bestanden niet openen:
+%1</numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>Bijlagen</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2427,10 +3252,6 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>TOTP-token genereren</translation>
- </message>
- <message>
<source>Close</source>
<translation>Sluiten</translation>
</message>
@@ -2515,6 +3336,14 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<source>Share</source>
<translation>Delen</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Toon huidige TOTP-waarde</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Geavanceerd</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2548,11 +3377,33 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Prullenbak</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2571,6 +3422,59 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Favicons downloaden</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Problemen met het downloaden van pictogrammen?
+Je kunt de DuckDuckGo website pictogram dienst inschakelen in de sectie &apos;Beveiliging&apos; in de instellingen.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Sluiten</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Downloaden...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Oké</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Bestaat al</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Downloaden is mislukt</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Favicons downloaden (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2585,17 +3489,13 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<name>Kdbx3Reader</name>
<message>
<source>Unable to calculate master key</source>
- <translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
+ <translation>Kan hoofdsleutel niet berekenen</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
<translation>Kan challenge/response niet uitvoeren.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Verkeerde sleutel of beschadigde database.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>ontbrekende database-koppen</translation>
</message>
@@ -2615,6 +3515,12 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<source>Invalid header data length</source>
<translation>Ongeldige lengte van header-data</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Ongeldige inloggegevens, probeer het opnieuw.
+Als dit vaker gebeurt, is het databasebestand mogelijk beschadigd.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2624,7 +3530,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
+ <translation>Kan hoofdsleutel niet berekenen</translation>
</message>
</context>
<context>
@@ -2635,7 +3541,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
+ <translation>Kan hoofdsleutel niet berekenen</translation>
</message>
<message>
<source>Invalid header checksum size</source>
@@ -2646,10 +3552,6 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<translation>SHA256-kop komt niet overeen</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Verkeerde sleutel of database-bestand is beschadigd. (HMAC mismatch)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Onbekend versleutelingsalgoritme</translation>
</message>
@@ -2749,6 +3651,16 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Ongeldige grootte van variant map veld-type</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Ongeldige inloggegevens, probeer het opnieuw.
+Als dit vaker gebeurt, is het databasebestand mogelijk beschadigd.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2763,7 +3675,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
+ <translation>Kan hoofdsleutel niet berekenen</translation>
</message>
<message>
<source>Failed to serialize KDF parameters variant map</source>
@@ -2856,7 +3768,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open
</message>
<message>
<source>Missing custom data key or value</source>
- <translation>Ontbrekende aangepaste datasleutel of -waarde</translation>
+ <translation>Ontbrekende gebruikersinstelling of -waarde</translation>
</message>
<message>
<source>Multiple group elements</source>
@@ -2900,7 +3812,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open
</message>
<message>
<source>History element in history entry</source>
- <translation>Geschiedenis element in geschiedenis item</translation>
+ <translation>Geschiedenis element in vorige versie</translation>
</message>
<message>
<source>No entry uuid found</source>
@@ -2912,7 +3824,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open
</message>
<message>
<source>Duplicate custom attribute found</source>
- <translation>Duplicaat aangepast kenmerk gevonden</translation>
+ <translation>Duplicaat gebruikers-kenmerk gevonden</translation>
</message>
<message>
<source>Entry string key or value missing</source>
@@ -2957,7 +3869,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open
<message>
<source>Unable to decompress binary</source>
<extracomment>Translator meant is a binary data inside an entry</extracomment>
- <translation>Het is niet gelukt om de binary uit te pakken</translation>
+ <translation>Kan binary niet uitpakken</translation>
</message>
<message>
<source>XML error:
@@ -2971,23 +3883,23 @@ Lijn %2, kolom %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>KeePass 1-database importeren</translation>
+ <source>Unable to open the database.</source>
+ <translation>Kan database niet openen.</translation>
</message>
<message>
- <source>Unable to open the database.</source>
- <translation>Niet mogelijk om de database te openen.</translation>
+ <source>Import KeePass1 Database</source>
+ <translation>Importeer KeePass1 database</translation>
</message>
</context>
<context>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
- <translation>Niet mogelijk om sleutelbestand te lezen</translation>
+ <translation>Kan sleutelbestand niet lezen</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Geen KeePass-database</translation>
+ <translation>Geen KeePass-database.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
@@ -3000,7 +3912,7 @@ Lijn %2, kolom %3</translation>
<message>
<source>Unable to read encryption IV</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation>Versleuteling IV kon niet gelezen worden</translation>
+ <translation>Kan versleuteling IV niet lezen</translation>
</message>
<message>
<source>Invalid number of groups</source>
@@ -3024,7 +3936,7 @@ Lijn %2, kolom %3</translation>
</message>
<message>
<source>Unable to construct group tree</source>
- <translation>Groepsstructuur niet kunnen opbouwen</translation>
+ <translation>Kan groepsstructuur niet opbouwen</translation>
</message>
<message>
<source>Root</source>
@@ -3032,11 +3944,7 @@ Lijn %2, kolom %3</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Hoofdsleutel niet kunnen berekenen</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Verkeerde sleutel of beschadigde database.</translation>
+ <translation>Kan hoofdsleutel niet berekenen</translation>
</message>
<message>
<source>Key transformation failed</source>
@@ -3132,42 +4040,60 @@ Lijn %2, kolom %3</translation>
</message>
<message>
<source>unable to seek to content position</source>
- <translation>niet in staat om naar positie te springen</translation>
+ <translation>kan niet naar positie in inhoud springen</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Ongeldige inloggegevens, probeer het opnieuw.
+Als dit vaker gebeurt, is het databasebestand mogelijk beschadigd.</translation>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Delen uitgeschakeld</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importeren uit</translation>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Exporteren naar</translation>
+ <source>Imported from %1</source>
+ <translation>Geïmporteerd van %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchroniseren met</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Delen uitgeschakeld %1</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Geïmporteerd van %1</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Ge-exporteerd naar %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synchroniseren met %1</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation>Geëxporteerd naar</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>Gesynchroniseerd met</translation>
</message>
</context>
<context>
@@ -3191,12 +4117,12 @@ Lijn %2, kolom %3</translation>
<message>
<source>Add %1</source>
<comment>Add a key component</comment>
- <translation>Toevoegen van %1</translation>
+ <translation>Voeg %1 toe</translation>
</message>
<message>
<source>Change %1</source>
<comment>Change a key component</comment>
- <translation>Wijzigen van %1</translation>
+ <translation>Wijzig %1</translation>
</message>
<message>
<source>Remove %1</source>
@@ -3212,10 +4138,6 @@ Lijn %2, kolom %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Bladeren</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Genereren</translation>
</message>
@@ -3238,7 +4160,7 @@ unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
<translation>Je gebruikt een verouderd sleutelbestandsformaat dat in de toekomst niet ondersteund zal worden.
-Ga a.u.b. naar de hoofdsleutel instellingen en genereer een nieuw sleutelbestand.</translation>
+Ga naar de hoofdsleutel instellingen en genereer een nieuw sleutelbestand.</translation>
</message>
<message>
<source>Error loading the key file '%1'
@@ -3270,6 +4192,44 @@ Bericht: %2</translation>
<source>Select a key file</source>
<translation>Kies een sleutelbestand</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Sleutelbestand</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Blader naar sleutelbestand</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Bladeren…</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Een nieuw sleutelbestand genereren</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Merk op: gebruik geen bestand dat kan veranderen; elke verandering maakt het ontgrendelen van je database onmogelijk!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Ongeldig sleutelbestand</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Je kunt de huidige database niet gebruiken als zijn eigen sleutelbestand. Kies een ander bestand of genereer een nieuw sleutelbestand.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Verdacht sleutelbestand</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Het gekozen sleutelbestand ziet eruit als een wachtwoord databasebestand. Een sleutelbestand moet een statisch bestand zijn dat nooit wijzigt ander verlies je voor altijd toegang tot de database.
+Weet je zeker dat je wilt doorgaan met dit bestand?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3358,10 +4318,6 @@ Bericht: %2</translation>
<translation>&amp;Instellingen</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Wachtwoordgenerator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>Databases &amp;Vergrendelen</translation>
</message>
@@ -3439,7 +4395,7 @@ Er is een hoog risico op beschadiging. Bewaar een back-up van jouw databases.</t
</message>
<message>
<source>&amp;Donate</source>
- <translation>&amp; Doneren</translation>
+ <translation>&amp;Doneren</translation>
</message>
<message>
<source>Report a &amp;bug</source>
@@ -3469,7 +4425,7 @@ Wij raden je aan om de AppImage te gebruiken welke beschikbaar is op onze downlo
</message>
<message>
<source>Create a new database</source>
- <translation>Een nieuwe database maken</translation>
+ <translation>Nieuwe database maken</translation>
</message>
<message>
<source>&amp;Merge from database...</source>
@@ -3517,7 +4473,7 @@ Wij raden je aan om de AppImage te gebruiken welke beschikbaar is op onze downlo
</message>
<message>
<source>Perform &amp;Auto-Type</source>
- <translation>Uitvoeren &amp; Auto-Type</translation>
+ <translation>Uitvoeren &amp;Auto-Type</translation>
</message>
<message>
<source>Open &amp;URL</source>
@@ -3548,30 +4504,90 @@ Wij raden je aan om de AppImage te gebruiken welke beschikbaar is op onze downlo
<translation>Toon TOTP QR code...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Controleren op Updates...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Deel item</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
- <translation>Opmerking: Je gebruikt een pre-release versie van KeePassXC!
+ <translation>Merk op: Je gebruikt een pre-release versie van KeePassXC!
Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor productiedoeleinden.</translation>
</message>
<message>
<source>Check for updates on startup?</source>
- <translation>Controleren op updates bij het opstarten?</translation>
+ <translation>Zoek naar updates bij het opstarten?</translation>
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation>Wil je dat KeePassXC controleert op updates bij het opstarten?</translation>
+ <translation>Wil je dat KeePassXC naar updates zoekt bij het opstarten?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
- <translation>Je kunt altijd handmatig controleren of er updates zijn vanuit het programmamenu.</translation>
+ <translation>Je kunt altijd handmatig naar updates zoeken vanuit het menu.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Exporteren</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Zoek naar updates...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Alle favicons downloaden</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Wachtwoordgenerator</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Favicon downloaden</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Aan de slag</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Open de aan de slag gids PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>&amp;Online hulp...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Online documentatie (opent een browser)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>&amp;Gebruikershandleiding</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Open de gebruikershandleiding PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Sneltoetsen</translation>
</message>
</context>
<context>
@@ -3632,6 +4648,14 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<source>Adding missing icon %1</source>
<translation>Toevoegen van ontbrekend pictogram %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Gebruikersinstellingen verwijderd %1[%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Gebruikersinstellingen toegevoegd %1[%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3702,6 +4726,72 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3801,6 +4891,17 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Wachtwoorden komen niet overeen</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Wachtwoorden overeenkomst tot nu toe</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3826,6 +4927,22 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<source>Generate master password</source>
<translation>Genereer een hoofdwachtwoord</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Wachtwoord invulveld</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Laat wachtwoord wel/niet zien.</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Wachtwoord herhaling veld</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Laat wachtwoordgenerator wel/niet zien</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3855,22 +4972,10 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<translation>Tekens</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Hoofdletters</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Kleine letters</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Cijfers</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Speciale tekens</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Uitgebreide ASCII</translation>
</message>
@@ -3951,18 +5056,10 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<translation>Geavanceerd</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Hoofdletters A tot F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Kleine letters A tot F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3980,7 +5077,7 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
<message>
<source>Punctuation</source>
- <translation>Leestekens</translation>
+ <translation>Interpunctie</translation>
</message>
<message>
<source>.,:;</source>
@@ -3995,18 +5092,10 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Wiskunde</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!? =</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Streepjes</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4036,7 +5125,7 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
<message>
<source>Add non-hex letters to &quot;do not include&quot; list</source>
- <translation>Voeg niet-hex karakters toe aan de &quot;niet gebruiken&quot; lijst</translation>
+ <translation>Voeg niet-hex tekens toe aan de &quot;niet gebruiken&quot; lijst</translation>
</message>
<message>
<source>Hex</source>
@@ -4044,7 +5133,7 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
- <translation>Niet te gebruiken karakters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
+ <translation>Niet te gebruiken tekens: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
</message>
<message>
<source>Word Co&amp;unt:</source>
@@ -4052,7 +5141,75 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
<message>
<source>Regenerate</source>
- <translation>Regenereren</translation>
+ <translation>Opnieuw genereren</translation>
+ </message>
+ <message>
+ <source>Generated password</source>
+ <translation>Gegenereerd wachtwoord</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Hoofdletters</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Kleine letters</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Speciale tekens</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Wiskunde tekens</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Streepjes en schuine streepjes</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Niet te gebruiken tekens</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Hex wachtwoord</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Wachtwoordlengte</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Wachtwoord opnieuw genereren</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Wachtwoord kopiëren</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Wachtwoord accepteren</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>kleine letters</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>HOOFDLETTERS</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Titel in hoofd-/kleine letters</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Laat wachtwoord wel/niet zien</translation>
</message>
</context>
<context>
@@ -4061,12 +5218,9 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Selecteer</translation>
+ <source>Statistics</source>
+ <translation>Statistieken</translation>
</message>
</context>
<context>
@@ -4103,6 +5257,10 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<source>Merge</source>
<translation>Samenvoegen</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Doorgaan</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4195,10 +5353,6 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<translation>Genereer een wachtwoord voor het item.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Lengte van het gegenereerde wachtwoord.</translation>
- </message>
- <message>
<source>length</source>
<translation>lengte</translation>
</message>
@@ -4248,25 +5402,13 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
<translation>Geavanceerde analyse op het wachtwoord uitvoeren.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>De inhoud van de database uitpakken en afdrukken.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Pad naar de database.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Geef het wachtwoord voor %1:</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>WAARSCHUWING: Je gebruikt een verouderd sleutelbestandsformaat dat in de toekomst mogelijk niet ondersteund zal worden.
-Overweeg a.u.b. een nieuw sleutelbestand te genereren.</translation>
+Overweeg een nieuw sleutelbestand te genereren.</translation>
</message>
<message>
<source>
@@ -4303,16 +5445,12 @@ Beschikbare opdrachten:
<translation>Twee databases samenvoegen.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Pad naar de doeldatabase.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Pad naar de samen te voegen brondatabase.</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation>Gebruik dezelfde gegevens voor beide gegevensbestanden.</translation>
+ <translation>Gebruik dezelfde inloggegevens voor beide gegevensbestanden.</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
@@ -4324,7 +5462,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
- <translation>Namen van de te tonen kenmerken. Deze optie kan meer dan eens worden opgegeven, waarbij elk kenmerk op een regel wordt getoond in de opgegeven volgorde. Als er geen kenmerken worden opgegeven, wordt een samenvatting van de standaardkenmerken gegeven.</translation>
+ <translation>Namen van de weer te geven kenmerken. Deze optie kan meer dan eens worden opgegeven, waarbij elk kenmerk op een regel wordt getoond in de opgegeven volgorde. Als er geen kenmerken worden opgegeven, wordt een samenvatting van de standaardkenmerken gegeven.</translation>
</message>
<message>
<source>attribute</source>
@@ -4383,10 +5521,6 @@ Beschikbare opdrachten:
<translation>Browserintegratie</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] challenge/response - slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Druk</translation>
</message>
@@ -4417,10 +5551,6 @@ Beschikbare opdrachten:
<translation>Genereer een willekeurig wachtwoord</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Ongeldige waarde voor wachtwoordlengte %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Kan geen item maken met pad %1.</translation>
</message>
@@ -4462,7 +5592,7 @@ Beschikbare opdrachten:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Het klemboard wordt over %1 seconde(n) gewist...</numerusform><numerusform>Het klemboard wordt over %1 seconde(n) gewist...</numerusform></translation>
+ <translation><numerusform>Het klembord wordt over %1 seconde(n) gewist...</numerusform><numerusform>Het klembord wordt over %1 seconde(n) gewist...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4478,10 +5608,6 @@ Beschikbare opdrachten:
<translation>aantal</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Ongeldige waarde voor wachtwoordlengte %1.</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Kan item met pad %1 niet vinden.</translation>
</message>
@@ -4523,7 +5649,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Type: Dictionary</source>
- <translation>Type: woordenboek</translation>
+ <translation>Type: Woordenboek</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
@@ -4606,40 +5732,16 @@ Beschikbare opdrachten:
<translation>Er ging iets fout bij het laden van sleutelbestand %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Bestand %1 bestaat niet.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Kan bestand %1 niet openen.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Fout bij het lezen van de database:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Fout bij het ontleden van de database:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Lengte van het gegenereerde wachtwoord</translation>
</message>
<message>
<source>Use lowercase characters</source>
- <translation>Gebruik kleine letters</translation>
+ <translation>Kleine letters gebruiken</translation>
</message>
<message>
<source>Use uppercase characters</source>
- <translation>Gebruik hoofdletters</translation>
- </message>
- <message>
- <source>Use numbers.</source>
- <translation>Getallen gebruiken.</translation>
+ <translation>Hoofdletters gebruiken</translation>
</message>
<message>
<source>Use special characters</source>
@@ -4651,11 +5753,11 @@ Beschikbare opdrachten:
</message>
<message>
<source>Exclude character set</source>
- <translation>Niet te gebruiken karakterset</translation>
+ <translation>Niet te gebruiken tekens</translation>
</message>
<message>
<source>chars</source>
- <translation>karakters</translation>
+ <translation>tekens</translation>
</message>
<message>
<source>Exclude similar looking characters</source>
@@ -4721,19 +5823,19 @@ Beschikbare opdrachten:
</message>
<message>
<source>AES: 256-bit</source>
- <translation>AES: 256-bits</translation>
+ <translation>AES: 256-bit</translation>
</message>
<message>
<source>Twofish: 256-bit</source>
- <translation>Twofish: 256-bits</translation>
+ <translation>Twofish: 256-bit</translation>
</message>
<message>
<source>ChaCha20: 256-bit</source>
- <translation>ChaCha20: 256-bits</translation>
+ <translation>ChaCha20: 256-bit</translation>
</message>
<message>
<source>Argon2 (KDBX 4 – recommended)</source>
- <translation>Argon2 (KDBX 4 – aanbevolen)</translation>
+ <translation>Argon2 (KDBX 4 - aanbevolen)</translation>
</message>
<message>
<source>AES-KDF (KDBX 4)</source>
@@ -4786,10 +5888,6 @@ Beschikbare opdrachten:
<translation>Nieuwe database is gemaakt</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Voer het wachtwoord in voor het versleutelen van de database (druk op enter om het te laat leeg): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Creëren van sleutelbestand %1 is mislukt: %2</translation>
</message>
@@ -4798,10 +5896,6 @@ Beschikbare opdrachten:
<translation>Laden van sleutelbestand %1 is mislukt: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Een item uit de database verwijderen.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Pad van het te verwijderen item.</translation>
</message>
@@ -4857,6 +5951,330 @@ Beschikbare opdrachten:
<source>Cannot create new group</source>
<translation>Kon nieuwe groep niet maken</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versie %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Bouwtype: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisie: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distributie: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Besturingssysteem: %1
+CPU-architectuur: %2
+Kernelversie: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Auto-type</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (getekend en ongetekend delen)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (alleen ondertekend delen)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (alleen niet-ondertekend delen)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Geen</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Geactiveerde extensies:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Groep %1 bestaat al!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Groep %1 niet gevonden.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Groep %1 toegevoegd.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Controleer of er wachtwoorden zijn gelekt en openbaar zijn gemaakt. BESTANDSNAAM moet het pad zijn van een bestand met SHA-1-hashes van gelekte wachtwoorden in HIBP-indeling, zoals beschikbaar op https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>BESTANDSNAAM</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analyseer wachtwoorden op zwakke punten en problemen.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Kon HIBP bestand niet openen %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>De database items worden onderzocht met behulp van het HIBP-bestand, dit zal een tijdje duren...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Sluit de geopende database.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Toont deze helptekst.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>YubiKey positie voor het versleutelen van de database.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>positie</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>De woordenlijst is te klein (&lt; 1000 items)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Getallen gebruiken.</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Ongeldige wachtwoordlengte %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Toon helptekst voor opdracht.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Beschikbare opdrachten:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Database is geïmporteerd.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Onbekende opdracht %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>YubiKey positie voor de tweede database.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>%1 en %2 zijn samengevoegd.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Database werd niet gewijzigd door het samenvoegen.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Open een gegevensbestand.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Groep %1 is hergebruikt.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Groep %1 is verwijderd.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Geef het wachtwoord om %1 te ontgrendelen:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Ongeldige YubiKey positie %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Druk op de knop van je YubiKey om %1 te ontgrendelen</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Voer een wachtwoord in om de database te versleutelen (optioneel):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Gebruikersnaam</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] challenge/response - Positie %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Wachtwoord voor &apos;%1&apos; is %2 keer gelekt!</numerusform><numerusform>Wachtwoord voor &apos;%1&apos; is %2 keer gelekt!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Ongeldige wachtwoordgenerator na het toepassen van alle opties</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4908,7 +6326,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation>Geen agent wordt uitgevoerd, niet het verwijderen van identiteit.</translation>
+ <translation>Geen agent wordt uitgevoerd, kan deze identiteit niet verwijderen.</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
@@ -4920,11 +6338,11 @@ Beschikbare opdrachten:
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation>Beperkte levensduur wordt niet ondersteund door de agent (selectievakje opties).</translation>
+ <translation>Beperkte levensduur wordt niet ondersteund door de agent (controleer de instellingen).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
- <translation>Een aanvraag voor transactiebevestiging wordt niet ondersteund door de agent (selectievakje opties).</translation>
+ <translation>Een aanvraag voor transactiebevestiging wordt niet ondersteund door de agent (controleer de instellingen).</translation>
</message>
</context>
<context>
@@ -4943,7 +6361,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Modifiers</source>
- <translation>Modifiers</translation>
+ <translation>wijzigers</translation>
</message>
<message>
<source>exclude term from results</source>
@@ -5003,7 +6421,7 @@ Beschikbare opdrachten:
<message>
<source>Search (%1)...</source>
<comment>Search placeholder text, %1 is the keyboard shortcut</comment>
- <translation>Zoeken (%1)...</translation>
+ <translation>Zoek (%1)...</translation>
</message>
<message>
<source>Case sensitive</source>
@@ -5011,6 +6429,93 @@ Beschikbare opdrachten:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Opties</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Algemeen</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Toon een melding wanneer inloggegevens worden gevraagd</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;Als de prullenbak is ingeschakeld voor de database, worden items rechtstreeks naar de prullenbak verplaatst. Anders, zullen ze zonder bevestiging worden verwijderd.&lt;/p&gt;&lt;p&gt;Je wordt nog steeds gevraagd voor het verwijderen van items waarnaar wordt verwezen door andere items.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Vraag niet om bevestiging wanneer items worden verwijderd door clients.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Bestandsnaam</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Groep</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Beheren</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorisatie</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Deze programma&apos;s zijn momenteel verbonden:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Programma</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Verbreken</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Database-instellingen</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Database ontgrendelen</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Ontgrendel de database voor meer informatie</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Database vergrendelen</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Ontgrendel voor deze informatie</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Geen</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5133,9 +6638,100 @@ Beschikbare opdrachten:
<source>Signer:</source>
<translation>Ondertekenaar:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Sleutel</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Ondertekenaar naam veld</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Het overschrijven van een ondertekende deel-container wordt niet ondersteund - export is niet uitgevoerd</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Kan geen export-container schrijven (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Kon handtekening niet insluiten: kan bestand niet openen om te schrijven (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Kon handtekening niet insluiten: kan niet schrijven naar bestand (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Kan database niet insluiten: kan bestand niet openen om te schrijven (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Kan database niet insluiten: kan niet schrijven naar bestand (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Overschrijven van een niet-ondertekende deel-container wordt niet ondersteund - export is niet uitgevoerd</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Kan niet schrijven naar export-container</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Onverwachte fout bij het exporteren</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importeren vanuit de container zonder handtekening</translation>
@@ -5149,6 +6745,10 @@ Beschikbare opdrachten:
<translation>Importeren uit de container met certificaat</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Wil je %1 met vingerafdruk %2 vanaf %3 vertrouwen? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Deze keer niet</translation>
</message>
@@ -5165,20 +6765,8 @@ Beschikbare opdrachten:
<translation>Alleen deze keer</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Importeren van %1 is mislukt (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Importeren van %1 is gelukt (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Geïmporteerd van %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
- <translation>Ondertekende deel-containers worden niet ondersteund - import is voorkomen</translation>
+ <translation>Ondertekende deel-containers worden niet ondersteund - import is niet uitgevoerd</translation>
</message>
<message>
<source>File is not readable</source>
@@ -5190,7 +6778,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Untrusted import prevented</source>
- <translation>Niet vertrouwde import voorkomen</translation>
+ <translation>Onbetrouwbare import is niet uitgevoerd</translation>
</message>
<message>
<source>Successful signed import</source>
@@ -5202,7 +6790,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation>Niet ondertekende deel-container worden niet ondersteund - import is voorkomen</translation>
+ <translation>Niet ondertekende deel-container worden niet ondersteund - import is niet uitgevoerd</translation>
</message>
<message>
<source>Successful unsigned import</source>
@@ -5216,25 +6804,20 @@ Beschikbare opdrachten:
<source>Unknown share container type</source>
<translation>Type van deel-container is onbekend</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Het overschrijven van een ondertekende deel-container wordt niet ondersteund - export is voorkomen</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Kan geen export container schrijven (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Overschrijven van een niet-ondertekende deel-container wordt niet ondersteund - export is voorkomen</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Importeren van %1 is mislukt (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Kan niet schrijven naar export container</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Importeren van %1 is gelukt (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Onverwachte fout bij het exporteren</translation>
+ <source>Imported from %1</source>
+ <translation>Geïmporteerd van %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5249,10 +6832,6 @@ Beschikbare opdrachten:
<translation>Exporteer naar %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Wil je %1 met de vingerafdruk van %2 vanaf %3 vertrouwen? {1 ?} {2 ?} </translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Meerdere import bronpaden naar %1 in %2</translation>
</message>
@@ -5260,22 +6839,6 @@ Beschikbare opdrachten:
<source>Conflicting export target path %1 in %2</source>
<translation>Conflicterende exporteerdoelpad %1 in %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Kon handtekening niet insluiten: Kan bestand niet openen om naar te schrijven (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Kon handtekening niet insluiten: Kan niet schrijven naar bestand (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Kon database niet insluiten: Kan bestand niet openen om naar te schrijven (%1) </translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Kon database niet insluiten: Kan niet schrijven naar bestand (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5293,7 +6856,7 @@ Beschikbare opdrachten:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Verloopt in &lt;b&gt;%n&lt;/b&gt; seconde(n)</numerusform><numerusform>Verloopt in &lt;b&gt;%n&lt;/b&gt; seconde(n)</numerusform></translation>
+ <translation><numerusform>Verloopt over &lt;b&gt;%n&lt;/b&gt; seconde(n)</numerusform><numerusform>Verloopt over &lt;b&gt;%n&lt;/b&gt; seconde(n)</numerusform></translation>
</message>
</context>
<context>
@@ -5305,26 +6868,22 @@ Beschikbare opdrachten:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation>Let op: deze TOTP-instellingen zijn applicatie specifiek en werken mogelijk niet met andere authenticators.</translation>
+ <translation>Merk op: deze TOTP-instellingen zijn op maat en werken mogelijk niet met andere authenticators.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation>Er was een fout bij het maken van de QR-code.</translation>
+ <translation>Er ging iets fout bij het creëren van de QR-code.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation>Sluiten in %1 seconden.</translation>
+ <translation>Sluit over %1 seconden.</translation>
</message>
</context>
<context>
<name>TotpSetupDialog</name>
<message>
<source>Setup TOTP</source>
- <translation>TOTP-instellen</translation>
- </message>
- <message>
- <source>Key:</source>
- <translation>Sleutel:</translation>
+ <translation>TOTP instellen</translation>
</message>
<message>
<source>Default RFC 6238 token settings</source>
@@ -5356,27 +6915,57 @@ Beschikbare opdrachten:
<translation>Grootte van de code:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 cijfers</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Geheime sleutel veld</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritme:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Tijd-stap veld</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 cijfers</translation>
+ <source> digits</source>
+ <translation>cijfers</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 cijfers</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>Ongeldig TOTP-geheim</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Je hebt een ongeldige geheime sleutel ingevoerd. De sleutel moet in Base32-indeling zijn.
+Voorbeeld: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Bevestig het verwijderen van de TOTP instellingen</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Weet je zeker dat je de TOTP-instellingen voor dit item wilt verwijderen?</translation>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation>Controleren op updates</translation>
+ <translation>Updates worden gezocht</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation>Controleren op updates...</translation>
+ <translation>Updates worden gezocht...</translation>
</message>
<message>
<source>Close</source>
@@ -5388,7 +6977,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation>Er is iets fout gegaan bij het ophalen van update informatie.</translation>
+ <translation>Er is iets fout gegaan bij het zoeken naar updates.</translation>
</message>
<message>
<source>Please try again later.</source>
@@ -5396,7 +6985,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Software Update</source>
- <translation>Software-update</translation>
+ <translation>Software update</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
@@ -5449,6 +7038,14 @@ Beschikbare opdrachten:
<source>Welcome to KeePassXC %1</source>
<translation>Welkom bij KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Van 1Password importeren</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Een recente database openen</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5462,15 +7059,23 @@ Beschikbare opdrachten:
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Als je zelf een &lt;a href=&quot;https://www.yubico.com/&quot;&gt; YubiKey&lt;/a&gt; hebt, kun je deze gebruiken voor extra beveiliging.&lt;/p&gt; &lt;p&gt;De YubiKey vereist dat een van zijn &quot;slots&quot; wordt geprogrammeerd als &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt; HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Als je zelf een &lt;a href=&quot;https://www.yubico.com/&quot;&gt; YubiKey&lt;/a&gt; hebt, kun je deze gebruiken voor extra beveiliging.&lt;/p&gt; &lt;p&gt;De YubiKey vereist dat een van zijn posities &quot;slots&quot; wordt geprogrammeerd als &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt; HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation>Geen YubiKey gedetecteerd, plug deze a.u.b. in.</translation>
+ <translation>Geen YubiKey gedetecteerd, plug deze alsjeblieft in.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
<translation>Geen YubiKey ingeplugd.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Hardwaretoken verversen</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Hardwaresleutel positie selectie</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_pl.ts b/share/translations/keepassx_pl.ts
index 9bcb1f41a..977c075ca 100644
--- a/share/translations/keepassx_pl.ts
+++ b/share/translations/keepassx_pl.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Utrzymaj styl</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Zresetować ustawienia?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Czy na pewno chcesz zresetować wszystkie ustawienia ogólne i zabezpieczeń do domyślnych?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Uruchom tylko jedną instancję KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Pamiętaj ostatnią bazę danych</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Zapamiętaj ostatnie pliki klucze i klucze sprzętowe</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Załaduj poprzednie bazy danych podczas uruchomienia</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimalizuj okno podczas uruchomienia aplikacji</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Użyj ikony grupy podczas tworzenia wpisu</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Zminimalizuj po skopiowaniu do schowka</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Ukryj panel podglądu wpisu</translation>
</message>
@@ -180,7 +172,7 @@
</message>
<message>
<source>Minimize instead of app exit</source>
- <translation>Zminimalizuj zamiast wyjść z aplikacji</translation>
+ <translation>Minimalizuj zamiast wyjść z aplikacji</translation>
</message>
<message>
<source>Show a system tray icon</source>
@@ -195,10 +187,6 @@
<translation>Schowaj okno do zasobnika podczas minimalizacji</translation>
</message>
<message>
- <source>Language</source>
- <translation>Język</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Autowpisywanie</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Opóźnienie rozpoczęcia autowpisywania</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Sprawdź aktualizacje podczas uruchomienia aplikacji</translation>
+ <source>Movable toolbar</source>
+ <translation>Ruchomy pasek narzędzi</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>Pamiętaj wcześniej używane bazy danych</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Uwzględnij wstępne wydania podczas sprawdzania aktualizacji</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Załaduj wcześniej otwarte bazy danych podczas uruchamiania</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Ruchomy pasek narzędzi</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Pamiętaj pliki kluczy bazy danych i klucze sprzętowe</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Styl przycisku</translation>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Sprawdzaj aktualizacje przy uruchamianiu aplikacji raz w tygodniu</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Uwzględnij wersje beta podczas sprawdzania aktualizacji</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Styl przycisku:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Język:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(uruchom ponownie program, aby aktywować)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Minimalizuj okno po odblokowaniu bazy danych</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimalizuj podczas otwierania adresu URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Ukryj okno podczas kopiowania do schowka</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimalizuj</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Upuść w tle</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Limit czasu pobierania ikony ulubionych:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Limit czasu pobierania ikony witryny w sekundach</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> s</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Styl przycisku paska narzędzi</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Użyj czcionek o stałej szerokości w notatkach</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Wybór języka</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Zresetuj ustawienia do domyślnych</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Globalny skrót autowpisywania</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Opóźnienie wpisywania znaków przez autowpisywanie w milisekundach</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Opóźnienie rozpoczęcia autowpisywania w milisekundach</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Prywatność</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Użyj DuckDuckGo jako zastępstwo dla pobierania ikon witryn</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Użyj usługi DuckDuckGo do pobierania ikon witryn</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Wyczyszczenie schowka w sekundach</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Reset nieaktywności Touch ID</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Limit czasu blokady bazy danych w sekundach</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Wyczyść wyszukaną frazę po</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Skopi&amp;uj nazwę użytkownika</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Skopiuj &amp;hasło</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Wybierz wpis do autowpisywania:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Szukaj...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 zażądał dostępu do haseł dla następujących element(ów).
Wybierz, czy chcesz zezwolić na dostęp.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Zezwól na dostęp</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Odmów dostępu</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -450,17 +563,13 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
<name>BrowserOptionDialog</name>
<message>
<source>Dialog</source>
- <translation>Dialog</translation>
+ <translation>Okno dialogowe</translation>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
<translation>Wymagane jest to aby uzyskać dostęp do baz danych za pomocą KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Włącz integrację KeePassXC z przeglądarką</translation>
- </message>
- <message>
<source>General</source>
<translation>Ogólne</translation>
</message>
@@ -487,7 +596,7 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
<message>
<source>Show a &amp;notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>P&amp;okaż powiadomienie, gdy wymagane są poświadczenia</translation>
+ <translation>P&amp;okaż powiadomienie, gdy wymagane są dane uwierzytelniające</translation>
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
@@ -507,17 +616,17 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
- <translation>Z&amp;wróć tylko najlepiej pasujące poświadczenia</translation>
+ <translation>Z&amp;wróć tylko najlepiej pasujące dane uwierzytelniające</translation>
</message>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Sortuj dopasowane poświadczenia według &amp;tytułu</translation>
+ <translation>Sortuj dopasowane dane uwierzytelniające według &amp;tytułu</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Sortuj dopasowane poświadczenia według &amp;użytkownika</translation>
+ <translation>Sortuj dopasowane dane uwierzytelniające według nazwy &amp;użytkownika</translation>
</message>
<message>
<source>Advanced</source>
@@ -526,21 +635,17 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Nigdy nie &amp;pytaj przed uzyskaniem dostępu do poświadczeń</translation>
+ <translation>Nigdy nie &amp;pytaj przed uzyskaniem dostępu do danych uwierzytelniających</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Nigdy nie &amp;pytaj przed aktualizacją poświadczeń</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Tylko wybrana baza danych musi być podłączona do klienta.</translation>
+ <translation>Nigdy nie &amp;pytaj przed aktualizacją danych uwierzytelniających</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Szuk&amp;aj we wszystkich otwartych bazach danych dopasowanych poświadczeń</translation>
+ <translation>Szuk&amp;aj we wszystkich otwartych bazach danych dopasowanych danych uwierzytelniających</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
@@ -593,10 +698,6 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Ostrzeżenie&lt;/b&gt;, aplikacja keepassxc-proxy nie została znaleziona!&lt;br /&gt;Proszę sprawdzić katalog instalacyjny KeePassXC albo potwierdzić niestandardową ścieżkę w opcjach zaawansowanych.&lt;br /&gt;Integracja z przeglądarką NIE BĘDZIE DZIAŁAĆ bez aplikacji proxy.&lt;br /&gt;Oczekiwana ścieżka: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Pliki wykonywalne</translation>
</message>
@@ -607,7 +708,7 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation>Nie pytaj o uprawnienie dla HTTP &amp;Basic Auth</translation>
+ <translation>Nie pytaj o uprawnienie dla podstawowego &amp;uwierzytelniania HTTP</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
@@ -621,6 +722,50 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser jest potrzebny do integracji przeglądarki. &lt;br /&gt;Pobierz go dla %1 i %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Zwraca wygasłe dane uwierzytelniające. Ciąg [wygasłe] jest dodawany do tytułu.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Zezwalaj na zwrot wygasłych danych uwierzytelniających.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Włącz integrację z przeglądarką</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Przeglądarki zainstalowane jako snapy są obecnie nieobsługiwane.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Wszystkie bazy danych podłączone do rozszerzenia zwrócą pasujące dane uwierzytelniające.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Nie wyświetlaj wyskakującego okienka sugerującego migrację przestarzałych ustawień KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>&amp;Nie pytaj o migrację ustawień KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Niestandardowe pole lokalizacji proxy</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Przeglądarka niestandardowego pliku proxy</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Ostrzeżenie&lt;/b&gt;, aplikacja keepassxc-proxy nie została znaleziona!&lt;br /&gt;Proszę sprawdzić katalog instalacyjny KeePassXC albo potwierdzić niestandardową ścieżkę w opcjach zaawansowanych.&lt;br /&gt;Integracja z przeglądarką NIE BĘDZIE DZIAŁAĆ bez aplikacji proxy.&lt;br /&gt;Oczekiwana ścieżka: %1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -696,7 +841,7 @@ Przeniesiono %2 klucze do niestandardowych danych.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation>KeePassXC: Utwórz nową grupę</translation>
+ <translation>KeePassXC: Stwórz nową grupę</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Jest to konieczne, aby utrzymać bieżące połączenia przeglądarki.
Czy chcesz teraz migrować istniejące ustawienia?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Nie wyświetlaj ponownie tego ostrzeżenia</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -723,7 +872,7 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>Dodaj &apos; - Klon&apos; do nazwy</translation>
+ <translation>Dodaj &apos; - klon&apos; do nazwy</translation>
</message>
<message>
<source>Replace username and password with references</source>
@@ -773,10 +922,6 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
<translation>Pierwszy rekord zawiera nazwy pól</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Liczba linii nagłówków do odrzucenia</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Traktuj &apos;\&apos; jako znak ucieczki</translation>
</message>
@@ -818,7 +963,7 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform> [%n więcej komunikat pominięto]</numerusform><numerusform> [%n więcej komunikatów pominięto]</numerusform><numerusform> [%n więcej komunikatów pominięto]</numerusform><numerusform> [%n więcej komunikatów pominięto]</numerusform></translation>
+ <translation><numerusform> [%n więcej komunikat pominięto]</numerusform><numerusform> [%n więcej komunikaty pominięto]</numerusform><numerusform> [%n więcej komunikatów pominięto]</numerusform><numerusform> [%n więcej komunikatów pominięto]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -826,6 +971,22 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
<translation>Import CSV: zapisywanie z błędami:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Kwalifikacja tekstu</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Separacja pola</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Liczba linii nagłówka do odrzucenia</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Podgląd importu CSV</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -867,10 +1028,6 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
<translation>Błąd podczas odczytu bazy danych: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Nie można zapisać, baza danych nie ma nazwy pliku.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Plik nie może zostać zapisany, ponieważ jest otwarty w trybie tylko do odczytu.</translation>
</message>
@@ -878,6 +1035,28 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Klucz nie został przekształcony. To jest błąd, zgłoś go deweloperom!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Zapasowa baza danych znajduje się w %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Nie można zapisać, baza danych nie wskazuje poprawnego pliku.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Nie można zapisać, plik bazy danych jest tylko do odczytu.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>Plik bazy danych zawiera niescalone zmiany.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Kosz</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1068,14 @@ Czy chcesz teraz migrować istniejące ustawienia?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Wprowadź klucz główny</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Plik klucza:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Hasło:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Przeglądaj</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Odśwież</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Wyzwanie-odpowiedź:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Przestarzały format pliku klucza</translation>
</message>
@@ -943,20 +1106,100 @@ Proszę rozważyć wygenerowanie nowego pliku klucza.</translation>
<translation>Wybierz plik klucza</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
+ <translation>Nie można otworzyć pliku klucza: %1</translation>
+ </message>
+ <message>
+ <source>Select slot...</source>
+ <translation>Wybierz slot...</translation>
+ </message>
+ <message>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Odblokuj bazę danych KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Wprowadź hasło:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Przełącz widoczność hasła</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Wprowadź dodatkowe dane uwierzytelniające:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Wybór pliku klucza</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Wybór slotu klucza sprzętowego</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Przeglądaj plik klucza</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Przeglądaj...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Odśwież tokeny sprzętowe</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Klucz sprzętowy:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Możesz użyć sprzętowego klucza bezpieczeństwa, takiego jak &lt;strong&gt;YubiKey&lt;/strong&gt; albo &lt;strong&gt;OnlyKey&lt;/strong&gt; ze slotami skonfigurowanymi dla HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Kliknij, aby uzyskać więcej informacji...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Pomoc klucza sprzętowego</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
<translation>TouchID do szybkiego odblokowania</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Nie można otworzyć bazy danych:
-%1</translation>
+ <source>Clear</source>
+ <translation>Wyczyść</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Nie można otworzyć pliku klucza:
-%1</translation>
+ <source>Clear Key File</source>
+ <translation>Wyczyść plik klucza</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Wybierz plik...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Odblokowanie nie powiodło się i nie podano hasła</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Odblokowanie bazy danych nie powiodło się i nie wprowadzono hasła.
+Czy zamiast tego chcesz spróbować ponownie z &quot;pustym&quot; hasłem?
+
+Aby zapobiec pojawianiu się tego błędu, musisz przejść do &quot;Ustawienia bazy danych / Bezpieczeństwo&quot; i zresetować hasło.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Spróbuj ponownie z pustym hasłem</translation>
</message>
</context>
<context>
@@ -1111,6 +1354,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Czy na pewno chcesz przenieść wszystkie dane przestarzałej integracji z przeglądarką do najnowszego standardu?
Jest to konieczne, aby zachować zgodność z wtyczką przeglądarki.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Przechowywane klucze przeglądarki</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Usuń wybrany klucz</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1253,6 +1504,57 @@ Jeśli zachowasz tę liczbę, twoja baza danych może być zbyt łatwa do złama
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Zmień istniejący czas odszyfrowywania</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Czas odszyfrowania w sekundach</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Format bazy danych</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Algorytm szyfrowania</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Funkcja derywacji klucza</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Liczba rund szyfrowania</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Zużycie pamięci</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Paralelizm</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Odsłonięte wpisy</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Nie o&amp;dsłaniaj tej bazy danych</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Odsłoń wpisy w &amp;tej grupie:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>Włącz usługę sekretną fd.o , aby uzyskać dostęp do tych ustawień.</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1300,6 +1602,40 @@ Jeśli zachowasz tę liczbę, twoja baza danych może być zbyt łatwa do złama
<source>Enable &amp;compression (recommended)</source>
<translation>Włącz &amp;kompresję (zalecane)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Pole nazwy bazy danych</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Pole opisu bazy danych</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Pole domyślnej nazwy użytkownika</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Maksymalna liczba pozycji historii na wpis</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Maksymalny rozmiar historii na wpis</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Usuń kosz</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Czy chcesz usunąć bieżący kosz i całą jego zawartość?
+To działanie jest nieodwracalne.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation> (stare)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1367,6 +1703,10 @@ Czy na pewno chcesz kontynuować bez hasła?</translation>
<source>Failed to change master key</source>
<translation>Nie udało się zmienić klucza głównego</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Kontynuuj bez hasła</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1718,129 @@ Czy na pewno chcesz kontynuować bez hasła?</translation>
<source>Description:</source>
<translation>Opis:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Pole nazwy bazy danych</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Pole opisu bazy danych</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Statystyka</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Najedź kursorem na linie z ikonami błędów, aby uzyskać więcej informacji.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Wartość</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Nazwa bazy danych</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Opis</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Lokalizacja</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Ostatnio zapisane</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Niezapisane zmiany</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>tak</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>nie</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Baza danych została zmodyfikowana, ale zmiany nie zostały jeszcze zapisane na dysku.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Liczba grup</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Liczba wpisów</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Liczba wygasłych wpisów</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Baza danych zawiera wpisy, które wygasły.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Niepowtarzalne hasła</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Powtarzalne hasła</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Ponad 10% haseł jest ponownie wykorzystywanych. Jeśli to możliwe, używaj niepowtarzalnych haseł.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Maksymalne ponowne użycie hasła</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Niektóre hasła są używane więcej niż trzy razy. Jeśli to możliwe, używaj niepowtarzalnych haseł.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Liczba krótkich haseł</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Zalecana minimalna długość hasła to co najmniej 8 znaków.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Liczba słabych haseł</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Zaleca się używanie długich, losowych haseł z oceną &apos;dobra&apos; lub &apos;znakomita&apos;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Średnia długość hasła</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 znaków</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>Średnia długość hasła wynosi mniej niż dziesięć znaków. Dłuższe hasła zapewniają większe bezpieczeństwo.</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1395,7 +1858,7 @@ Czy na pewno chcesz kontynuować bez hasła?</translation>
</message>
<message>
<source>CSV file</source>
- <translation>plik CSV</translation>
+ <translation>Plik CSV</translation>
</message>
<message>
<source>Merge database</source>
@@ -1428,10 +1891,6 @@ This is definitely a bug, please report it to the developers.</source>
Jest to z pewnością błąd, zgłoś go programistom.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Plik bazy danych nie istnieje lub nie jest dostępny.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Wybierz plik CSV</translation>
</message>
@@ -1454,6 +1913,30 @@ Jest to z pewnością błąd, zgłoś go programistom.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Tylko do odczytu]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Nie udało się otworzyć %1. To nie istnieje lub jest niedostępne.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Eksportuj bazę danych do pliku HTML</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>Plik HTML</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Nie udało się zapisać pliku HTML.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Potwierdzenie eksportu</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Za chwilę wyeksportujesz bazę danych do niezaszyfrowanego pliku. To narazi twoje hasła i wrażliwe informacje! Jesteś pewien, że chcesz kontynuować?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1544,10 +2027,6 @@ Czy chcesz scalić twoje zmiany?</translation>
<translation><numerusform>Przenieść wpis do kosza?</numerusform><numerusform>Przenieść wpisy do kosza?</numerusform><numerusform>Przenieść wpisy do kosza?</numerusform><numerusform>Przenieść wpisy do kosza?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Plik otwarty w trybie tylko do odczytu.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Zablokować bazę danych?</translation>
</message>
@@ -1588,12 +2067,6 @@ Disable safe saves and try again?</source>
Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Błąd zapisu bazy danych.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Hasła</translation>
</message>
@@ -1637,6 +2110,14 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Shared group...</source>
<translation>Grupa współdzielona...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Błąd zapisu bazy danych: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Ta baza danych jest otwarta w trybie tylko do odczytu. Automatyczne zapisywanie jest wyłączone.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1722,7 +2203,7 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n miesiąc</numerusform><numerusform>%n miesiące</numerusform><numerusform>%n miesięcy</numerusform><numerusform>%n miesięcy</numerusform></translation>
+ <translation><numerusform>%n miesiąc</numerusform><numerusform>%n miesięce</numerusform><numerusform>%n miesięcy</numerusform><numerusform>%n miesięcy</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1756,6 +2237,18 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Confirm Removal</source>
<translation>Potwierdź usunięcie</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integracja z przeglądarką</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;pusty adres URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Czy na pewno chcesz usunąć ten adres URL?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1795,6 +2288,42 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Background Color:</source>
<translation>Kolor tła:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Wybór atrybutu</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Wartość atrybutu</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Dodaj nowy atrybut</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Usuń wybrany atrybut</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Edytuj nazwę atrybutu</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Przełącz ochronę atrybutu</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Pokaż chroniony atrybut</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Wybór koloru pierwszego planu</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Wybór koloru tła</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1828,7 +2357,78 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
</message>
<message>
<source>Use a specific sequence for this association:</source>
- <translation>Użyj określonej sekwencji dla tego powiązania:</translation>
+ <translation>Użyj określonej sekwencji dla tego skojarzenia:</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Niestandardowa sekwencja autowpisywania</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Otwórz stronę pomocy autowpisywania</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Istniejące skojarzenia okien</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Dodaj nowe skojarzenie okna</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Usuń wybrane skojarzenie okna</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Możesz użyć gwiazdki (*), aby dopasować wszystko</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Ustaw tytuł skojarzonego okna</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Możesz użyć gwiazdki, aby dopasować wszystko</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Niestandardowa sekwencja autowpisywania dla tego okna</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Te ustawienia wpływają na zachowanie wpisu z rozszerzeniem przeglądarki.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Ogólne</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Pomiń autoprzesyłanie dla tego wpisu</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Ukryj ten wpis przed rozszerzeniem przeglądarki</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>Dodatkowe adresy URL</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Dodaj</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Usuń</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Edytuj</translation>
</message>
</context>
<context>
@@ -1849,6 +2449,26 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Delete all</source>
<translation>Usuń wszystkie</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Wybór historii wpisów</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Pokaż wpis w wybranym stanie historii</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Przywróć wpis do wybranego stanu historii</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Usuń wybrany stan historii</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Usuń całą historię</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2508,62 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Expires</source>
<translation>Wygasa</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Pole URL</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Pobierz ikonę ulubionych dla adresu URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Pole powtórzenia hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Przełącz generator haseł</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Przełącz widoczność hasła</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Przełącz widoczność notatek</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Pole wygaśnięcia</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Presety wygaśnięcia</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Presety wygaśnięcia</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Pole notatek</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Pole tytułu</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Pole nazwy użytkownika</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Przełącz wygasanie</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1964,6 +2640,22 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Wymagaj potwierdzenia użytkownika, gdy ten klucz jest używany</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Usuń klucz z agenta po określonych sekundach</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Przeglądaj plik klucza</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Zewnętrzny plik klucza</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Wybierz plik załącznika</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1999,6 +2691,10 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Dziedzicz z nadrzędnej grupy (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Wpis ma niezapisane zmiany</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,68 +2723,99 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<translation>Nieaktywne</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importuj ze ścieżki</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Niepodpisany kontener KeeShare</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Eksportuj do ścieżki</translation>
+ <source>KeeShare signed container</source>
+ <translation>Podpisany kontener KeeShare</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchronizuj ze ścieżką</translation>
+ <source>Select import source</source>
+ <translation>Wybierz cel importu</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Twoja wersja KeePassXC nie obsługuje udostępniania tego typu kontenera. Proszę użyć %1.</translation>
+ <source>Select export target</source>
+ <translation>Wybierz cel eksportu</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Udostępnianie bazy danych jest wyłączone</translation>
+ <source>Select import/export file</source>
+ <translation>Wybierz plik importu/eksportu</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Eksportowanie bazy danych jest wyłączone</translation>
+ <source>Clear</source>
+ <translation>Wyczyść</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Importowanie bazy danych jest wyłączone</translation>
+ <source>Import</source>
+ <translation>Importuj</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Niepodpisany kontener KeeShare</translation>
+ <source>Export</source>
+ <translation>Eksportuj</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Podpisany kontener KeeShare</translation>
+ <source>Synchronize</source>
+ <translation>Synchronizuj</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Wybierz cel importu</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>Twoja wersja KeePassXC nie obsługuje udostępniania tego typu kontenera.
+Obsługiwane rozszerzenia to: %1.</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Wybierz cel eksportu</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 jest już eksportowany przez tę bazę danych.</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Wybierz plik importu/eksportu</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 jest już importowany przez tę bazę danych.</translation>
</message>
<message>
- <source>Clear</source>
- <translation>Wyczyść</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 jest importowany i eksportowany przez różne grupy w tej bazie danych.</translation>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare jest obecnie wyłączony. Możesz włączyć import/eksport w ustawieniach aplikacji.</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Odwołanie do kontenera eksportu %1 już istnieje.</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Eksport bazy danych jest obecnie wyłączony przez ustawienia aplikacji.</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Kontener importu %1 jest już zaimportowany.</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Import danych jest obecnie wyłączony przez ustawienia aplikacji.</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Kontener %1 importowany i eksportowany przez różne grupy.</translation>
+ <source>Sharing mode field</source>
+ <translation>Pole trybu udostępniania</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Ścieżka do pola udostępniania pliku</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Przeglądaj plik udostępniania</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Przełącz widoczność hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Przełącz generator haseł</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Wyczyść pola</translation>
</message>
</context>
<context>
@@ -2121,6 +2848,34 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Ustaw domyślną se&amp;kwencję autowpisywania</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Pole nazwy</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Pole notatek</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Przełącz wygasanie</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Przełączenie autowpisywania dla tej i podgrup</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Pole wygaśnięcia</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>Przełączenie wyszukiwania dla tej i podgrup</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>Pole domyślnej sekwencji autowpisywnaia</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2157,22 +2912,10 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<translation>Wszystkie pliki</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Ikona niestandardowa już istnieje</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Potwierdź usunięcie</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Ikona niestandardowa została pomyślnie pobrana</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Podpowiedź: Możesz włączyć DuckDuckGo jako zastępstwo w menu Narzędzia&gt;Ustawienia&gt;Bezpieczeństwo</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Wybierz obraz(y)</translation>
</message>
@@ -2186,7 +2929,7 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n ikona już istnieje w bazie danych</numerusform><numerusform>%n ikony już istnieją w bazie danych</numerusform><numerusform>%n ikon już istnieje w bazie danych</numerusform><numerusform>%n ikon już istnieje w bazie danych</numerusform></translation>
+ <translation><numerusform>%n ikona już istnieje w bazie danych</numerusform><numerusform>%n ikony już istnieje w bazie danych</numerusform><numerusform>%n ikon już istnieje w bazie danych</numerusform><numerusform>%n ikon już istnieje w bazie danych</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
@@ -2196,6 +2939,42 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Ta ikona używana jest przez %n wpis i zostanie zamieniona na ikonę domyślną. Czy na pewno chcesz ją usunąć?</numerusform><numerusform>Ta ikona używana jest przez %n wpisy i zostanie zamieniona na ikonę domyślną. Czy na pewno chcesz ją usunąć?</numerusform><numerusform>Ta ikona używana jest przez %n wpisów i zostanie zamieniona na ikonę domyślną. Czy na pewno chcesz ją usunąć?</numerusform><numerusform>Ta ikona używana jest przez %n wpisów i zostanie zamieniona na ikonę domyślną. Czy na pewno chcesz ją usunąć?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Możesz włączyć usługę ikon witryn DuckDuckGo w menu Narzędzia -&gt; Ustawienia -&gt; Bezpieczeństwo</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Pobierz ikonę ulubionych dla adresu URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Zastosuj wybraną ikonę do podgrup i wpisów</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Zastosuj ikonę &amp;do ...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Zastosuj tylko do tego</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Zastosuj również do grup podrzędnych</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Zastosuj również do wpisów podrzędnych</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Zastosuj również do wszystkich podrzędnych</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Wybrano istniejącą ikonę.</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2241,6 +3020,30 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<source>Value</source>
<translation>Wartość</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Utworzono datę i godzinę</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Zmodyfikowano datę i godzinę</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Ostatnio używano datę i godzinę</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>Niepowtarzalny identyfikator</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Dane wtyczki</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Usuń wybrane dane wtyczki</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2333,12 +3136,32 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Nie można otworzyć pliku:
-%1</numerusform><numerusform>Nie można otworzyć plików:
+ <translation><numerusform>Nie można otworzyć plik:
+%1</numerusform><numerusform>Nie można otworzyć pliki:
%1</numerusform><numerusform>Nie można otworzyć plików:
%1</numerusform><numerusform>Nie można otworzyć plików:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Załączniki</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Dodaj nowy załącznik</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Usuń wybrany załącznik</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Otwórz wybrany załącznik</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Zapisz wybrany załącznik na dysk</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2433,10 +3256,6 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Wygeneruj token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Zamknij</translation>
</message>
@@ -2521,6 +3340,14 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<source>Share</source>
<translation>Udział</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Wyświetl bieżącą wartość TOTP</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Zaawansowane</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2554,15 +3381,37 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Kosz</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Wpis &quot;%1&quot; z bazy danych &quot;%2&quot; został użyty przez %3</translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Rejestracja usługi DBus w %1 nie powiodła się: uruchomiona jest inna usługa sekretna.</translation>
</message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n wpis był używany przez %1</numerusform><numerusform>%n wpisy były używane przez %1</numerusform><numerusform>%n wpisów było używanych przez %1</numerusform><numerusform>%n wpisów było używanych przez %1</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Usługa sekretna Fdo: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
- <translation>[pusty]</translation>
+ <translation>[puste]</translation>
</message>
</context>
<context>
@@ -2577,6 +3426,59 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Pobierz ikony ulubionych</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Masz problem z pobraniem ikon?
+Możesz włączyć usługę ikon witryn DuckDuckGo w sekcji bezpieczeństwa ustawień aplikacji.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Proszę czekać, przetwarzanie listy wpisów...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Pobieranie...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Już istnieje</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Pobieranie nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Pobieranie ikon ulubionych (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2598,16 +3500,12 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<translation>Nie można wywołać wyzwania-odpowiedzi.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Błędny klucz lub baza danych jest uszkodzona.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>brakuje nagłówków bazy danych</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation>Nagłówek nie pasuje do hasza</translation>
+ <translation>Nagłówek nie pasuje do hashu</translation>
</message>
<message>
<source>Invalid header id size</source>
@@ -2621,6 +3519,12 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<source>Invalid header data length</source>
<translation>Nieprawidłowa długość danych nagłowka</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Podano nieprawidłowe dane uwierzytelniające, spróbuj ponownie.
+Jeśli wystąpi to ponownie, plik bazy danych może być uszkodzony.</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2652,10 +3556,6 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<translation>Niepoprawny nagłówek SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Nieprawidłowy klucz lub uszkodzony plik bazy danych (niedopasowanie HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Nieznany szyfr</translation>
</message>
@@ -2698,7 +3598,7 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<message>
<source>Unsupported KeePass variant map version.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Niewspierana wersja mapy odmian KeePass.</translation>
+ <translation>Nieobsługiwana wersja mapy odmian KeePass.</translation>
</message>
<message>
<source>Invalid variant map entry name length</source>
@@ -2755,6 +3655,16 @@ Może to spowodować nieprawidłowe działanie wtyczek.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Nieprawidłowy rozmiar typu pola mapy odmian</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Podano nieprawidłowe dane uwierzytelniające, spróbuj ponownie.
+Jeśli wystąpi to ponownie, plik bazy danych może być uszkodzony.</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(Niezgodność HMAC)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2835,7 +3745,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
- <translation>Nieprawidłowa długość szyfru uuid: %1 (długość=%2)</translation>
+ <translation>Nieprawidłowa długość szyfru UUID: %1 (długość=%2)</translation>
</message>
<message>
<source>Unable to parse UUID: %1</source>
@@ -2858,7 +3768,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>Brakujące uuid ikony lub danych</translation>
+ <translation>Brakujący UUID ikony lub danych</translation>
</message>
<message>
<source>Missing custom data key or value</source>
@@ -2870,7 +3780,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>Null group uuid</source>
- <translation>Zerowa grupa uuid</translation>
+ <translation>Zerowa grupa UUID</translation>
</message>
<message>
<source>Invalid group icon number</source>
@@ -2886,19 +3796,19 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>No group uuid found</source>
- <translation>Nie znaleziono grupy uuid</translation>
+ <translation>Nie znaleziono grupy UUID</translation>
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>Zerowy uuid DeleteObject</translation>
+ <translation>Zerowy UUID DeleteObject</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
- <translation>Brakujące uuid DeletedObject lub czasu</translation>
+ <translation>Brakujący UUID DeletedObject lub czasu</translation>
</message>
<message>
<source>Null entry uuid</source>
- <translation>Zerwoy wpis uuid</translation>
+ <translation>Zerowy wpis UUID</translation>
</message>
<message>
<source>Invalid entry icon number</source>
@@ -2910,11 +3820,11 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>No entry uuid found</source>
- <translation>Nie znaleziono wpisu uuid</translation>
+ <translation>Nie znaleziono wpisu UUID</translation>
</message>
<message>
<source>History element with different uuid</source>
- <translation>Element historii z innym uuid</translation>
+ <translation>Element historii z innym UUID</translation>
</message>
<message>
<source>Duplicate custom attribute found</source>
@@ -2934,7 +3844,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>Auto-type association window or sequence missing</source>
- <translation>Brak przypisanego okna lub sekwencji autowpisywania</translation>
+ <translation>Brak skojarzonego okna lub sekwencji autowpisywania</translation>
</message>
<message>
<source>Invalid bool value</source>
@@ -2950,7 +3860,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>Invalid color rgb part</source>
- <translation>Nieprawidłowa wartość części koloru rgb</translation>
+ <translation>Nieprawidłowa wartość części koloru RGB</translation>
</message>
<message>
<source>Invalid number value</source>
@@ -2958,7 +3868,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz
</message>
<message>
<source>Invalid uuid value</source>
- <translation>Nieprawidłowa wartość uuid</translation>
+ <translation>Nieprawidłowa wartość UUID</translation>
</message>
<message>
<source>Unable to decompress binary</source>
@@ -2977,13 +3887,13 @@ Wiersz %2, kolumna %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importuj bazę danych KeePass1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Nie można otworzyć bazy danych.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importuj bazę danych KeePass1</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3041,10 +3951,6 @@ Wiersz %2, kolumna %3</translation>
<translation>Nie mogę wyliczyć głównego klucza</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Błędny klucz lub baza danych jest uszkodzona.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Nie udało się transformować klucza</translation>
</message>
@@ -3110,7 +4016,7 @@ Wiersz %2, kolumna %3</translation>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation>Nieprawidłowy rozmiar pola wpisu uuid</translation>
+ <translation>Nieprawidłowy rozmiar pola wpisu UUID</translation>
</message>
<message>
<source>Invalid entry group id field size</source>
@@ -3140,40 +4046,58 @@ Wiersz %2, kolumna %3</translation>
<source>unable to seek to content position</source>
<translation>niezdolny do szukania pozycji treści</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>Podano nieprawidłowe dane uwierzytelniające, spróbuj ponownie.
+Jeśli wystąpi to ponownie, plik bazy danych może być uszkodzony.</translation>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Wyłączony udział</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Nieprawidłowe odwołanie do udostępniania</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importuj z</translation>
+ <source>Inactive share %1</source>
+ <translation>Nieaktywny udział %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Eksportuj do</translation>
+ <source>Imported from %1</source>
+ <translation>Importowane z %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchronizuj z</translation>
+ <source>Exported to %1</source>
+ <translation>Wyeksportowano do %1</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Wyłączony udział %1</translation>
+ <source>Synchronized with %1</source>
+ <translation>Zsynchronizowano z %1</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importuj z udziału %1</translation>
+ <source>Import is disabled in settings</source>
+ <translation>Import jest wyłączony w ustawieniach</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Eksportuj do udziału %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation>Eksport jest wyłączony w ustawieniach</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synchronizuj z udziałem %1</translation>
+ <source>Inactive share</source>
+ <translation>Nieaktywny udział</translation>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation>Importowane z</translation>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation>Eksportowane do</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>Zsynchronizowane z</translation>
</message>
</context>
<context>
@@ -3218,10 +4142,6 @@ Wiersz %2, kolumna %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Przeglądaj</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Wygeneruj</translation>
</message>
@@ -3277,6 +4197,44 @@ Komunikat: %2</translation>
<source>Select a key file</source>
<translation>Wybierz plik klucza</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Wybór pliku klucza</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Przeglądaj plik klucza</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Przeglądaj...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Generuj nowy plik klucza</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>Uwaga: nie należy używać pliku, który może ulec zmianie, ponieważ uniemożliwi to odblokowanie bazy danych!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Nieprawidłowy plik klucza</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Nie można użyć bieżącej bazy danych jako własnego pliku klucza. Proszę wybrać inny plik lub wygenerować nowy plik klucza.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Podejrzany plik klucza</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Wybrany plik klucza wygląda jak plik bazy danych haseł. Plik klucza musi być plikiem statycznym, który nigdy się nie zmienia albo utracisz dostęp do bazy danych na zawsze.
+Czy na pewno chcesz kontynuować z tym plikiem?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3365,10 +4323,6 @@ Komunikat: %2</translation>
<translation>&amp;Ustawienia</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Generator hasła</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Zablokuj bazy danych</translation>
</message>
@@ -3555,14 +4509,6 @@ Zalecamy korzystanie z AppImage dostępnego na naszej stronie pobierania.</trans
<translation>Pokaż kod QR TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Sprawdź aktualizacje...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Udostępnij wpis</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>UWAGA: Używasz wstępnej wersji KeePassXC! Spodziewaj się pewnych błędów i drobnych problemów, ta wersja nie jest przeznaczona do użytku produkcyjnego.</translation>
@@ -3579,6 +4525,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>Zawsze możesz sprawdzić aktualizacje ręcznie w menu aplikacji.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Eksportuj</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>Sprawdź &amp;aktualizacje...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Pobierz wszystkie ikony &amp;ulubionych</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>Sortuj &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>Sortuj &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>&amp;Generator hasła</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Pobierz ikonę ulubionych</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Eksportuj do pliku HTML...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>Sejf 1Password...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importuj sejf 1Password</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Pierwsze kroki</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Otwórz przewodnik pierwszych kroków w formacie PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>Po&amp;moc online...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Przejdź do dokumentacji online (otwiera przeglądarkę)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>Podręcznik uż&amp;ytkownika</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Otwórz podręcznik użytkownika w formacie PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>&amp;Skróty klawiaturowe</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3638,6 +4652,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>Dodawanie brakującej ikony %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Usunięto niestandardowe dane %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>Dodawanie niestandardowych danych %1 [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3708,6 +4730,73 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>Nieprawidłowy OpData01, nie zawiera nagłówka</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Nie można odczytać wszystkich bajtów IV, poszukiwano 16, ale otrzymano %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Nie można zainicjować szyfru dla opdata01: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Nie można odczytać wszystkich bajtów podpisu HMAC</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>Nieprawidłowo sformułowany OpData01 z powodu błędnego HMAC</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>Nie można przetworzyć czystego tekstu w miejscu</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>Oczekiwano %1 bajtów czystego tekstu, znaleziono %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>Odczyt bazy danych nie wytworzył wystąpienia
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Katalog .opvault musi istnieć</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>Katalog .opvault musi być czytelny</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Katalog .opvault/default musi istnieć</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>Katalog .opvault/default musi być czytelny</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Nie można zdekodować klucza głównego: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Nie można wyprowadzić klucza głównego: %1</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3807,6 +4896,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Hasła nie są zgodne</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>Hasła są do tej pory zgodne</translation>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3832,6 +4932,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Wygeneruj hasło główne</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Przełącz widoczność hasła</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Pole powtórzenia hasła</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Przełącz generator haseł</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3861,22 +4977,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Typy znaków</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Duże litery</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Małe litery</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Liczby</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Znaki specjalne</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Rozszerzony ASCII</translation>
</message>
@@ -3957,18 +5061,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Zaawansowane</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Duże litery A do F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Małe litery A do F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4001,18 +5097,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematyka</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Myślniki</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4060,6 +5148,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>Regeneruj</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Wygenerowane hasło</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Wielkie litery</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Małe litery</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Znaki specjalne</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Symbole matematyczne</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Kreski i ukośniki</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Wykluczone znaki</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Hasła szesnastkowe</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Długość hasła</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>Rozmiar słowa:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Wygeneruj ponownie hasło</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Skopiuj hasło</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Zaakceptuj hasło</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>małe litery</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>WIELKIE LITERY</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Tytułowe Litery</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Przełącz widoczność hasła</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4067,12 +5223,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Wybierz</translation>
+ <source>Statistics</source>
+ <translation>Statystyka</translation>
</message>
</context>
<context>
@@ -4109,6 +5262,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>Scal</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Kontynuuj</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4201,10 +5358,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Wygeneruj hasło dla wpisu.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Długość wygenerowanego hasła.</translation>
- </message>
- <message>
<source>length</source>
<translation>długość</translation>
</message>
@@ -4254,18 +5407,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Wykonaj zaawansowaną analizę hasła.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Wyodrębnij i drukuj zawartość bazy danych.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Ścieżka bazy danych do wyodrębnienia.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Wprowadź hasło by odblokować %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4310,16 +5451,12 @@ Dostępne polecenia:
<translation>Scal dwie bazy danych.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Ścieżka bazy danych, do której scalić.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Ścieżka bazy danych, z której scalić.</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation>Użyj tych samych poświadczeń dla obu plików bazy danych.</translation>
+ <translation>Użyj tych samych danych uwierzytelniających dla obu plików bazy danych.</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
@@ -4390,10 +5527,6 @@ Dostępne polecenia:
<translation>Integracja z przeglądarką</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>Wyzwanie-odpowiedź YubiKey[%1] - slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Naciśnij</translation>
</message>
@@ -4424,10 +5557,6 @@ Dostępne polecenia:
<translation>Wygeneruj nowe hasło losowe.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Niepoprawna wartość długości hasła %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Nie można utworzyć wpisu ze ścieżką %1.</translation>
</message>
@@ -4485,10 +5614,6 @@ Dostępne polecenia:
<translation>liczba</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Niepoprawna wartość długości hasła: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Nie można znaleźć wpisu ze ścieżką %1.</translation>
</message>
@@ -4613,26 +5738,6 @@ Dostępne polecenia:
<translation>Nie udało się załadować pliku klucza %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Plik %1 nie istnieje.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Nie można otworzyć pliku %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Błąd podczas odczytu bazy danych:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Błąd podczas parsowania bazy danych:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Długość wygenerowanego hasła</translation>
</message>
@@ -4645,10 +5750,6 @@ Dostępne polecenia:
<translation>Użyj dużych liter</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Użyj liczb.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Użyj znaków specjalnych</translation>
</message>
@@ -4696,7 +5797,7 @@ Dostępne polecenia:
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation>Pomyślnie przeniesiono do kosza wpis %1.</translation>
+ <translation>Pomyślnie przetworzono wpis %1.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
@@ -4793,10 +5894,6 @@ Dostępne polecenia:
<translation>Pomyślnie utworzono nową bazę danych.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Wstaw hasło, aby zaszyfrować bazę danych (naciśnij Enter, aby pozostawić puste): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Tworzenie pliku klucza %1 nie powiodło się: %2</translation>
</message>
@@ -4805,10 +5902,6 @@ Dostępne polecenia:
<translation>Ładowanie pliku klucza %1 nie powiodło się: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Usuń wpis z bazy danych.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Ścieżka wpisu do usunięcia.</translation>
</message>
@@ -4864,6 +5957,330 @@ Dostępne polecenia:
<source>Cannot create new group</source>
<translation>Nie można utworzyć nowej grupy</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>Dezaktywuj klucz hasła dla bazy danych.</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Wyświetla informacje o debugowaniu.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>Dezaktywuj klucz hasła dla bazy danych do scalenia.</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Wersja %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Typ kompilacji: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Rewizja: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Dystrybucja: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Tryb debugowania jest wyłączony.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Tryb debugowania jest włączony.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>System operacyjny: %1
+Architektura procesora: %2
+Jądro: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Autowpisywanie</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (podpisane i niepodpisane udostępnianie)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (tylko podpisane udostępnianie)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (tylko niepodpisane udostępnianie)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Żaden</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Włączone rozszerzenia:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Biblioteki kryptograficzne:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>Nie można wygenerować hasła i monitu w tym samym czasie!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Dodaje nową grupę do bazy danych.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Ścieżka grupy do dodania.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>Grupa %1 już istnieje!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Grupy %1 nie została znaleziona.</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Pomyślnie dodano grupę %1.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>Sprawdź, czy jakiekolwiek hasła nie zostały publicznie ujawnione. NAZWA PLIKU musi być ścieżką do pliku zawierającego hashe SHA-1 wyciekłych haseł w formacie HIBP dostępnych na https://haveibeenpwned.com/Passwords.</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>NAZWA PLIKU</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analizuj hasła pod kątem słabych punktów i problemów.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Nie można otworzyć pliku HIBP %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>Oceniam wpisy w bazie danych w stosunku do pliku HIBP, to zajmie trochę czasu...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Zamknij aktualnie otwartą bazę danych.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Wyświetl tę pomoc.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>Slot YubiKey używany do szyfrowania bazy danych.</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>slot</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>Nieprawidłowa liczba wyrazów %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>Lista wyrazów jest za mała (&lt; 1000 elementów)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Wyjdź z trybu interaktywnego.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>Format używany podczas eksportowania. Dostępne opcje to XML lub CSV. Domyślnie XML.</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>Eksportuje zawartość bazy danych do standardowego wyjścia w określonym formacie.</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Nie można wyeksportować bazy danych do pliku XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Nieobsługiwany format %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Użyj liczb</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Nieprawidłowa długość hasła %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Wyświetl pomoc dotyczącą poleceń.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Dostępne polecenia:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Importuj zawartość bazy danych XML.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>Ścieżka eksportu bazy danych XML.</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Ścieżka nowej bazy danych.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>Nie można zaimportować eksportu bazy danych XML %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Pomyślnie zaimportowano bazę danych.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Nieznane polecenie %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>Spłaszcza dane wyjściowe do pojedynczych linii.</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>Drukuj tylko zmiany wykryte przez operację scalania.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>Slot YubiKey dla drugiej bazy danych.</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>Pomyślnie scalono %1 z %2.</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Baza danych nie została zmodyfikowana operacją scalania.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Przenosi wpis do nowej grupy.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Ścieżka wpisu do przeniesienia.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Ścieżka grupy docelowej.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Nie można odnaleźć grupy ze ścieżką %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>Wpis jest już w grupie %1.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Pomyślnie przeniesiono wpis %1 do grupy %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Otwórz bazę danych.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Ścieżka grupy do usunięcia.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>Nie można usunąć grupy głównej z bazy danych.</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Pomyślnie przetworzono grupę %1.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>Pomyślnie usunięto grupę %1.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Nie można otworzyć pliku bazy danych %1: nie znaleziono</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Nie można otworzyć pliku bazy danych %1: nie jest to zwykły plik</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Nie można otworzyć pliku bazy danych %1: nieczytelny</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Wprowadź hasło odblokowujące %1:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>Nieprawidłowy slot YubiKey %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Proszę dotknąć przycisku na YubiKey, aby odblokować %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Wprowadź hasło do szyfrowania bazy danych (opcjonalnie):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>Plik HIBP, wiersz %1: błąd analizy</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Integracja usługi sekretnej</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Nazwa użytkownika</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1 [%2] wyzwanie-odpowiedź - slot %3-%4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>Hasło do &apos;%1&apos; wyciekło %2 raz!</numerusform><numerusform>Hasło do &apos;%1&apos; wyciekło %2 razy!</numerusform><numerusform>Hasło do &apos;%1&apos; wyciekło %2 razy!</numerusform><numerusform>Hasło do &apos;%1&apos; wyciekło %2 razy!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>Nieprawidłowy generator haseł po zastosowaniu wszystkich opcji</translation>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5018,6 +6435,93 @@ Dostępne polecenia:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Opcje</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Włącz integrację KeepassXC z usługą sekretną Freedesktop.org</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Ogólne</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Pokaż powiadomienie, gdy wymagane są dane uwierzytelniające</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Jeżeli kosz jest włączony dla bazy danych, wpisy zostaną przeniesione do kosza bezpośrednio. W przeciwnym razie zostaną one usunięte bez potwierdzenia.&lt;/p&gt;&lt;p&gt;Nadal będzie wyświetlany monit, jeśli jakiekolwiek wpisy są przywoływane przez inne.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Nie potwierdzaj, kiedy wpisy są usuwane przez klienty.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Odsłonięte grupy bazy danych:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Nazwa pliku</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupa</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Zarządzaj</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Uwierzytelnienie</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Aplikacje te są obecnie podłączone:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Aplikacja</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Odłącz</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Ustawienia bazy danych</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Edytuj ustawienia bazy danych</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Odblokuj bazę danych</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Odblokuj bazę danych, aby wyświetlić więcej informacji</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Zablokuj bazę danych</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Odblokuj, aby pokazać</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Żaden</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5140,9 +6644,100 @@ Dostępne polecenia:
<source>Signer:</source>
<translation>Podpisujący:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Zezwalaj na importowanie KeeShare</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Zezwalaj na eksportowanie KeeShare</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Pokazuj tylko ostrzeżenia i błędy</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Klucz</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Pole nazwy osoby podpisującej</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Wygeneruj nowy certyfikat</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importuj istniejący certyfikat</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Eksportuj własny certyfikat</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Znane zasoby</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Zaufaj wybranym certyfikatom</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Pytaj za każdym razem, czy chcesz ufać wybranemu certyfikatowi</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Przestań ufać wybranemu certyfikatowi</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Usuń wybrany certyfikat</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Zastąpienie podpisanego kontenera udostępniania nie jest obsługiwane - eksport został zablokowany</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Nie można zapisać kontenera eksportu (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Nie można osadzić podpisu: Nie można otworzyć pliku do zapisu (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Nie można osadzić podpisu: Nie można zapisać pliku (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Nie można osadzić bazy danych: Nie można otworzyć pliku do zapisu (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Nie można osadzić bazy danych: Nie można zapisać pliku (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Zastąpienie niepodpisanego kontenera udostępniania nie jest obsługiwane - eksport został zablokowany</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Nie można zapisać kontenera eksportu</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Wystąpił nieoczekiwany błąd eksportu</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importuj z kontenera bez podpisu</translation>
@@ -5156,6 +6751,10 @@ Dostępne polecenia:
<translation>Importuj z kontenera z certyfikatem</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Czy chcesz zaufać %1 z odciskiem palca %2 z %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Nie tym razem</translation>
</message>
@@ -5172,18 +6771,6 @@ Dostępne polecenia:
<translation>Tylko tym razem</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Import z %1 zakończył się niepomyślnie (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Import z %1 zakończył się pomyślnie (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importowane z %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Podpisany kontener udostępniania nie jest obsługiwany - import został zablokowany</translation>
</message>
@@ -5223,25 +6810,20 @@ Dostępne polecenia:
<source>Unknown share container type</source>
<translation>Nieznany typ kontenera udostępniania</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Zastąpienie podpisanego kontenera udostępniania nie jest obsługiwane - eksport został zablokowany</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Nie można zapisać kontenera eksportu (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Zastąpienie niepodpisanego kontenera udostępniania nie jest obsługiwane - eksport został zablokowany</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import z %1 zakończył się niepomyślnie (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Nie można zapisać kontenera eksportu</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import z %1 zakończył się pomyślnie (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Wystąpił nieoczekiwany błąd eksportu</translation>
+ <source>Imported from %1</source>
+ <translation>Importowane z %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5256,10 +6838,6 @@ Dostępne polecenia:
<translation>Eksportuj do %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Czy chcesz zaufać %1 z odciskiem palca %2 z %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Wiele ścieżek źródłowych importu do %1 w %2</translation>
</message>
@@ -5267,22 +6845,6 @@ Dostępne polecenia:
<source>Conflicting export target path %1 in %2</source>
<translation>Sprzeczna ścieżka docelowa eksportu %1 w %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Nie można osadzić podpisu: Nie można otworzyć pliku do zapisu (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Nie można osadzić podpisu: Nie można zapisać pliku (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Nie można osadzić bazy danych: Nie można otworzyć pliku do zapisu (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Nie można osadzić bazy danych: nie można zapisać pliku (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5330,10 +6892,6 @@ Dostępne polecenia:
<translation>Ustaw TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Klucz:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Domyślne ustawienia tokenu RFC 6238</translation>
</message>
@@ -5363,16 +6921,46 @@ Dostępne polecenia:
<translation>Rozmiar kodu:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 cyfr</translation>
+ <source>Secret Key:</source>
+ <translation>Klucz sekretny:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>Klucz sekretny musi być w formacie Base32</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Pole klucza sekretnego</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algorytm:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>Pole kroku czasu</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 cyfr</translation>
+ <source> digits</source>
+ <translation>cyfry</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 cyfr</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>Nieprawidłowy sekret TOTP</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Wprowadzono nieprawidłowy klucz sekretny. Klucz musi być w formacie Base32.
+Przykład: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Potwierdź usunięcie ustawień TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Czy na pewno chcesz usunąć ustawienia TOTP dla tego wpisu?</translation>
</message>
</context>
<context>
@@ -5456,6 +7044,14 @@ Dostępne polecenia:
<source>Welcome to KeePassXC %1</source>
<translation>Witaj w KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importuj z 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Otwórz ostatnią bazę danych</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5469,7 +7065,7 @@ Dostępne polecenia:
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Jeśli jesteś właścicielem &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, możesz go użyć do zwiększenia bezpieczeństwa.&lt;/p&gt;&lt;p&gt;YubiKey wymaga zaprogramowania jednego z jego slotów jako&lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Jeśli jesteś właścicielem &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, możesz go użyć do zwiększenia bezpieczeństwa.&lt;/p&gt;&lt;p&gt;YubiKey wymaga zaprogramowania jednego z jego slotów jako &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
@@ -5479,5 +7075,13 @@ Dostępne polecenia:
<source>No YubiKey inserted.</source>
<translation>Nie włożono YubiKey.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Odśwież tokeny sprzętowe</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Wybór slotu klucza sprzętowego</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_pt.ts b/share/translations/keepassx_pt.ts
index c2aad239c..2672bbd9b 100644
--- a/share/translations/keepassx_pt.ts
+++ b/share/translations/keepassx_pt.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Seguir estilo</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Abrir apenas uma instância do KeepassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Memorizar últimas bases de dados</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Memorizar últimos ficheiros-chave e dispositivos de segurança</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Ao iniciar, carregar a última base de dados utilizada</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimizar janela ao iniciar a aplicação</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Utilizar ícone do grupo ao criar a entrada</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimizar ao copiar para a área de transferência</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Ocultar painel de pré-visualização de entradas</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Ao minimizar, ocultar a janela na bandeja do sistema</translation>
</message>
<message>
- <source>Language</source>
- <translation>Idioma</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Escrita automática</translation>
</message>
@@ -216,11 +204,11 @@
</message>
<message>
<source>Global Auto-Type shortcut</source>
- <translation>Atalho global para escrita automática</translation>
+ <translation>Atalho global de escrita automática</translation>
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation>Atraso para escrita automática</translation>
+ <translation>Atraso para a escrita automática</translation>
</message>
<message>
<source> ms</source>
@@ -232,20 +220,101 @@
<translation>Atraso para iniciar a escrita automática</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Ao iniciar, verificar se existem atualizações</translation>
+ <source>Movable toolbar</source>
+ <translation>Barra de ferramentas amovível</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Incluir pré-lançamentos ao verificar se existem atualizações</translation>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Barra de ferramentas amovível</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Estilo do botão</translation>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> seg</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -320,19 +389,40 @@
<translation>Privacidade</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Utilizar DuckDuckGo como recurso para descarregar os ícones dos sites</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>AutoType</name>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
- <translation>Não foi encontrada uma entrada coincidente com o título da janela:</translation>
+ <translation>Não foi possível encontrar uma entrada coincidente com o título da janela:</translation>
</message>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation>KeePassXC - Escrita automática</translation>
+ <translation>Escrita automática - KeePassXC</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -348,7 +438,7 @@
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>O comando de escrita automática tem uma pressão de teclas muito lenta. Deseja mesmo continuar?</translation>
+ <translation>O comando de escrita automática tem uma pressão de teclas muito lento. Deseja mesmo continuar?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
@@ -390,21 +480,36 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copiar nome de &amp;utilizador</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copiar &amp;palavra-passe</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation>KeePassXC - Escrita automática</translation>
+ <translation>Escrita automática - KeePassXC</translation>
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation>Selecionar entrada para escrita automática:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Pesquisa...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
<message>
<source>KeePassXC-Browser Confirm Access</source>
- <translation>KeePassXC-Browser - Confirmar acesso</translation>
+ <translation>KeePassXC Navegador - Confirmar acesso</translation>
</message>
<message>
<source>Remember this decision</source>
@@ -421,9 +526,17 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
- <translation>%1 solicitou o acesso a palavras-passe para o(s) seguinte(s) itens.
+ <translation>%1 solicitou o acesso a palavras-passe para o(s) seguinte(s) iten(s).
Selecione se deseja permitir o acesso.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -454,11 +567,7 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>Necessário para aceder às suas bases de dados com KeePassXC-Browser</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Ativar integração com o navegador</translation>
+ <translation>Isto é necessário para aceder às suas bases de dados com KeePassXC-Browser</translation>
</message>
<message>
<source>General</source>
@@ -512,7 +621,7 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Ordenar credenciais coi&amp;ncidentes por título</translation>
+ <translation>Ordenar &amp;entradas por título</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
@@ -534,10 +643,6 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<translation>Nun&amp;ca perguntar antes de atualizar as credenciais</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Apenas a base de dados selecionada tem que estar conectada a um cliente.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Pesquisar por credenciais semel&amp;hantes em todas as base de dados abertas</translation>
@@ -552,11 +657,11 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation>Ao iniciar, atualizar automaticamente o caminho do KeePassXC ou do binário keepassxc-proxy para os &apos;sripts&apos; nativos de mensagens.</translation>
+ <translation>Atualiza automaticamente o caminho do KeePassXC ou do caminho do binário keepassxc-proxy para os &apos;sripts&apos; nativos de mensagens ao iniciar.</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>Ao iniciar, atualizar ficheiros de mensagens &amp;nativas</translation>
+ <translation>Atualizar ficheiros de mensagens &amp;nativas ao iniciar</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -578,11 +683,11 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Explorar...</translation>
+ <translation>Procurar...</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
- <translation>&lt;b&gt;Aviso&lt;/b&gt;: as opções seguintes podem ser perigosas!</translation>
+ <translation>&lt;b&gt;AVISO&lt;/b&gt;: as opções seguintes podem ser perigosas!</translation>
</message>
<message>
<source>Select custom proxy location</source>
@@ -593,10 +698,6 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<translation>Navegador &amp;Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Atenção&lt;/b&gt;, a aplicação keepassxc-proxy não foi encontrada!&lt;br /&gt;Verifique o diretório de instalação do KeePassXC ou confirme o caminho nas definições avançadas.&lt;br /&gt;A integração com o navegador não irá funcionar sem esta aplicação.&lt;br /&gt;Caminho esperado: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Ficheiros executáveis</translation>
</message>
@@ -621,12 +722,56 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>Necessita do KeePassXC-Browser para que a integração funcione corretamente.&lt;br /&gt;Pode descarregar para %1 e para %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
<message>
<source>KeePassXC: New key association request</source>
- <translation>KeePassXC: Pedido de associação da nova chave</translation>
+ <translation>KeePassXC: Pedido de associação de nova chave</translation>
</message>
<message>
<source>You have received an association request for the above key.
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Este procedimento é necessário para manter as ligações existentes.
Quer migrar as definições agora?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Não mostrar novamente</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Quer migrar as definições agora?</translation>
<translation>Primeiro registo tem nome dos campos</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Número de linhas de cabeçalho a ignorar</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Considerar &apos;\&apos; como carácter de escape</translation>
</message>
@@ -786,7 +931,7 @@ Quer migrar as definições agora?</translation>
</message>
<message>
<source>Column layout</source>
- <translation>Disposição de colunas</translation>
+ <translation>Disposição das colunas</translation>
</message>
<message>
<source>Not present in CSV file</source>
@@ -826,12 +971,28 @@ Quer migrar as definições agora?</translation>
<translation>Importação CSV com erros:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n coluna,</numerusform><numerusform>%n coluna(s),</numerusform></translation>
+ <translation><numerusform>%n coluna</numerusform><numerusform>%n colunas</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -867,10 +1028,6 @@ Quer migrar as definições agora?</translation>
<translation>Erro ao ler a base de dados: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Não é possível guardar porque a base de dados não tem nome.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Não é possível escrever no ficheiro porque este foi aberto no modo de leitura.</translation>
</message>
@@ -878,6 +1035,27 @@ Quer migrar as definições agora?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Chave não transformada. Isto é um erro e deve ser reportado aos programadores!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Reciclagem</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,32 +1067,16 @@ Quer migrar as definições agora?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Introduza a chave-mestre</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Ficheiro-chave:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Palavra-passe:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Explorar</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Recarregar</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Pergunta de segurança:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation>Ficheiro-chave no formato legado</translation>
+ <translation>Formato legado de ficheiro-chave</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
@@ -924,7 +1086,7 @@ Please consider generating a new key file.</source>
<translation>Está a utilizar um formato legado que pode, no futuro, deixar
de ser suportado.
-Deve considerar a geração de um novo ficheiro-chave.</translation>
+Deve considerar a geração de uma novo ficheiro-chave.</translation>
</message>
<message>
<source>Don&apos;t show this warning again</source>
@@ -943,20 +1105,96 @@ Deve considerar a geração de um novo ficheiro-chave.</translation>
<translation>Selecione o ficheiro-chave</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID para desbloqueio rápido</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Não foi possível abrir a base de dados:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Não foi possível abrir o ficheiro-chave:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Procurar...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Limpar</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1065,7 +1303,7 @@ Esta ação pode interferir com a ligação ao suplemento.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Removida com sucesso %n chave de cifra das definições do KeePassXC.</numerusform><numerusform>Removidas com sucesso %n chaves de cifra das definições do KeePassXC.</numerusform></translation>
+ <translation><numerusform>%n chave de cifra removida das configurações do KeePassXC.</numerusform><numerusform>%n chaves de cifra removidas das configurações do KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1111,6 +1349,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Tem a certeza de que deseja atualizar todos os dados legados para a versão mais recente?
Esta atualização é necessária para manter a compatibilidade com o suplemento.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1231,7 +1477,7 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation>Erro ao transformar a chave com os novos parâmetros KDF; KDF inalterado.</translation>
+ <translation>Falha ao transformar a chave com os novos parâmetros KDF; KDF inalterado.</translation>
</message>
<message numerus="yes">
<source> MiB</source>
@@ -1253,6 +1499,57 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1294,12 +1591,45 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
</message>
<message>
<source>Additional Database Settings</source>
- <translation>Definições extra para a base de dados</translation>
+ <translation>Definições extra da base de dados</translation>
</message>
<message>
<source>Enable &amp;compression (recommended)</source>
<translation>Ativar compr&amp;essão (recomendado)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1367,6 +1697,10 @@ Tem a certeza de que deseja continuar?</translation>
<source>Failed to change master key</source>
<translation>Erro ao alterar a chave-mestre</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1712,129 @@ Tem a certeza de que deseja continuar?</translation>
<source>Description:</source>
<translation>Descrição:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valor</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1415,7 +1872,7 @@ Tem a certeza de que deseja continuar?</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
- <translation>Erro ao escrever no ficheiro CSV.</translation>
+ <translation>Falha ao escrever no ficheiro CSV.</translation>
</message>
<message>
<source>Database creation error</source>
@@ -1428,10 +1885,6 @@ This is definitely a bug, please report it to the developers.</source>
Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>O ficheiro da base de dados não existe ou não pode ser acedido.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Selecionar ficheiro CSV</translation>
</message>
@@ -1454,12 +1907,36 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Apenas leitura]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Searching...</source>
- <translation>Pesquisar..</translation>
+ <translation>Pesquisar...</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
@@ -1467,11 +1944,11 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
- <translation>Tem a certeza de que deseja mover a entrada &quot;%1&quot; para a reciclagem?</translation>
+ <translation>Deseja mesmo mover a entrada &quot;%1&quot; para a reciclagem?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Tem a certeza de que deseja mover %n entrada para a reciclagem?</numerusform><numerusform>Tem a certeza de que deseja mover %n entradas para a reciclagem?</numerusform></translation>
+ <translation><numerusform>Quer mesmo mover %n entrada para a reciclagem?</numerusform><numerusform>Quer mesmo mover %n entradas para a reciclagem?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1479,7 +1956,7 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message>
<source>Do you really want to execute the following command?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</source>
- <translation>Tem a certeza de que deseja executar este comando?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
+ <translation>Deseja mesmo executar o seguinte comando?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
</message>
<message>
<source>Remember my choice</source>
@@ -1515,13 +1992,13 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message>
<source>Merge Request</source>
- <translation>Pedido de combinação</translation>
+ <translation>Pedido de união</translation>
</message>
<message>
<source>The database file has changed and you have unsaved changes.
Do you want to merge your changes?</source>
- <translation>A base de dados foi alterada e tem alterações não guardadas.
-Deseja combinar as suas alterações?</translation>
+ <translation>A base de dados foi alterada e tem alterações não gravadas.
+Deseja juntar as suas alterações?</translation>
</message>
<message>
<source>Empty recycle bin?</source>
@@ -1533,19 +2010,15 @@ Deseja combinar as suas alterações?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Tem a certeza de que deseja eliminar %n entrada?</numerusform><numerusform>Tem a certeza de que deseja eliminar %n entradas?</numerusform></translation>
+ <translation><numerusform>Tem a certeza de que quer eliminar %n entrada?</numerusform><numerusform>Tem a certeza de que quer eliminar %n entradas?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Eliminar entrada?</numerusform><numerusform>Eliminar entradas?</numerusform></translation>
+ <translation><numerusform>Eliminar a entrada?</numerusform><numerusform>Eliminar as entradas?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Mover entrada para a reciclagem?</numerusform><numerusform>Mover entradas para a reciclagem?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Ficheiro aberto no modo de leitura.</translation>
+ <translation><numerusform>Mover a entrada para a reciclagem?</numerusform><numerusform>Mover as entradas para a reciclagem?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1584,16 +2057,10 @@ Erro: %1</translation>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
- <translation>O KeePassXC não conseguiu guardar a base de dados múltiplas vezes. Muito provavelmente, os serviços de sincronização não o permitiram.
+ <translation>O KeePassXC não conseguiu guardar a base de dados múltiplas vezes. Muito provavelmente, os serviços de sincronização não permitira a gravação.
Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Erro ao escrever na base de dados:
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Palavras-passe</translation>
</message>
@@ -1611,7 +2078,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>A entrada &quot;%1&quot; tem %2 referência. Deseja substituir as referências com valores, ignorar a entrada ou eliminar?</numerusform><numerusform>A entrada &quot;%1&quot; tem %2 referências. Deseja substituir as referências com valores, ignorar a entrada ou eliminar?</numerusform></translation>
+ <translation><numerusform>A entrada &quot;%1&quot; tem %2 referência. Quer substituir as referência com valores, ignorar a entrada ou eliminar?</numerusform><numerusform>A entrada &quot;%1&quot; tem %2 referências. Quer substituir as referências com valores, ignorar a entrada ou eliminar?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1637,6 +2104,14 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Shared group...</source>
<translation>Grupo partilhado...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Erro ao escrever na base de dados: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1686,7 +2161,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>Erro ao abrir a chave privada</translation>
+ <translation>Falha ao abrir a chave privada</translation>
</message>
<message>
<source>Entry history</source>
@@ -1756,6 +2231,18 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Confirm Removal</source>
<translation>Confirmação de remoção</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integração com navegador</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1781,7 +2268,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Reveal</source>
- <translation>Mostrar</translation>
+ <translation>Revelar</translation>
</message>
<message>
<source>Attachments</source>
@@ -1795,6 +2282,42 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Background Color:</source>
<translation>Cor secundária:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1804,11 +2327,11 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation>Utilizar sequência de escrita automática deste &amp;grupo</translation>
+ <translation>Herdar sequência de escrita automática deste &amp;grupo</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
- <translation>&amp;Utilizar sequência personalizada de escrita automática:</translation>
+ <translation>&amp;Usar sequência personalizada de escrita automática:</translation>
</message>
<message>
<source>Window Associations</source>
@@ -1830,6 +2353,77 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Utilizar sequência específica para esta associação:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Geral</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Adicionar</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remover</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2443,26 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Delete all</source>
<translation>Eliminar tudo</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2502,62 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Expires</source>
<translation>Expira</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1964,6 +2634,22 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Solicitar confirmação para utilizar esta chave</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1997,7 +2683,11 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
- <translation>Herdar do grupo (%1)</translation>
+ <translation>Herdar a partir do grupo (%1)</translation>
+ </message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>A entrada tem alterações por guardar</translation>
</message>
</context>
<context>
@@ -2027,68 +2717,97 @@ Desativar salvaguardas e tentar novamente?</translation>
<translation>Inativo</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importar do caminho</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Contentor KeeShare não assinado</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportar para o caminho</translation>
+ <source>KeeShare signed container</source>
+ <translation>Contentor KeeShare assinado</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Sincronizar com o caminho</translation>
+ <source>Select import source</source>
+ <translation>Selecione a origem da importação</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>A sua versão do KeePassXC não tem suporte a partilha do tipo de contentor.
-Por favor utilize %1.</translation>
+ <source>Select export target</source>
+ <translation>Selecione o destino da exportação</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>A partilha da base de dados está desativada</translation>
+ <source>Select import/export file</source>
+ <translation>Selecione o ficheiro de importação/exportação</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>A exportação da base de dados está desativada</translation>
+ <source>Clear</source>
+ <translation>Limpar</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>A importação da base de dados está desativada</translation>
+ <source>Import</source>
+ <translation>Importar</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Contentor KeeShare não assinado</translation>
+ <source>Export</source>
+ <translation>Exportar</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Contentor KeeShare assinado</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Selecione a origem da importação</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Selecione o destino da exportação</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Selecione o ficheiro de importação/exportação</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Limpar</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>O contentor de exportação %1 já está referenciado.</translation>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>O contentor de importação %1 já está referenciado.</translation>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2116,12 +2835,40 @@ Por favor utilize %1.</translation>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
- <translation>&amp;Utilizar sequência de escrita automática do grupo relacionado</translation>
+ <translation>Herdar sequência de escrita a&amp;utomática do grupo relacionado</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Definir se&amp;quência padrão para escrita automática</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2158,28 +2905,16 @@ Por favor utilize %1.</translation>
<translation>Todos os ficheiros</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Já existe um ícone personalizado</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirmação de eliminação</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Ícone personalizado descarregado com sucesso</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Dica: pode ativar o serviço DuckDuckGo como recurso em Ferramentas -&gt; Definições -&gt; Segurança</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Selecionar imagens</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>%1 de %n ícones carregado com sucesso.</numerusform><numerusform>%1 de %n ícones carregados com sucesso.</numerusform></translation>
+ <translation><numerusform>%1 de %n ícone carregados com sucesso.</numerusform><numerusform>%1 de %n ícones carregados com sucesso.</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2191,11 +2926,47 @@ Por favor utilize %1.</translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>O ícone seguinte falhou:</numerusform><numerusform>Os ícones seguintes falharam:</numerusform></translation>
+ <translation><numerusform>Erro no seguinte ícone:</numerusform><numerusform>Erro nos seguintes ícones:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Este ícone é utilizado por % entrada e será substituído pelo ícone padrão. Tem a certeza de que deseja eliminar o ícone?</numerusform><numerusform>Este ícone é utilizado por % entradas e será substituído pelo ícone padrão. Tem a certeza de que deseja eliminar o ícone?</numerusform></translation>
+ <translation><numerusform>Este ícone é utilizado por % entrada e será substituído pelo ícone padrão. Tem a certeza de que quer eliminar o ícone?</numerusform><numerusform>Este ícone é utilizado por % entradas e será substituído pelo ícone padrão. Tem a certeza de que quer eliminar o ícone?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2218,7 +2989,7 @@ Por favor utilize %1.</translation>
</message>
<message>
<source>Plugin Data</source>
- <translation>Dados do suplemento</translation>
+ <translation>Dados do plugin</translation>
</message>
<message>
<source>Remove</source>
@@ -2242,6 +3013,30 @@ Esta ação pode implicar um funcionamento errático.</translation>
<source>Value</source>
<translation>Valor</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2289,7 +3084,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Tem a certeza de que deseja remover %n anexo?</numerusform><numerusform>Tem a certeza de que deseja remover %n anexos?</numerusform></translation>
+ <translation><numerusform>Tem a certeza de que quer remover %n anexo?</numerusform><numerusform>Tem a certeza de que quer remover %n anexos?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2338,6 +3133,26 @@ Esta ação pode implicar um funcionamento errático.</translation>
%1</numerusform><numerusform>Não foi possível abrir os ficheiros:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Anexos</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2432,10 +3247,6 @@ Esta ação pode implicar um funcionamento errático.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>A gerar token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Fechar</translation>
</message>
@@ -2520,6 +3331,14 @@ Esta ação pode implicar um funcionamento errático.</translation>
<source>Share</source>
<translation>Partilhar</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avançado</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2553,11 +3372,33 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Reciclagem</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2576,6 +3417,58 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Estado</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Aceitar</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2597,10 +3490,6 @@ Esta ação pode implicar um funcionamento errático.</translation>
<translation>Não foi possível emitir a pergunta de segurança.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chave errada ou base de dados danificada.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>cabeçalhos em falta</translation>
</message>
@@ -2618,7 +3507,12 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>Comprimento dos dados de cabeçalho inválido</translation>
+ <translation>Comprimento de dados cabeçalho inválido</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2651,10 +3545,6 @@ Esta ação pode implicar um funcionamento errático.</translation>
<translation>Disparidade no cabeçalho SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Chave errada ou base de dados danificada (disparidade HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Cifra desconhecida</translation>
</message>
@@ -2668,11 +3558,11 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>Comprimento dos dados de cabeçalho inválido</translation>
+ <translation>Comprimento de dados cabeçalho inválido</translation>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
- <translation>Erro ao processar os parâmetros KDF no cabeçalho</translation>
+ <translation>Falha ao processar os parâmetros KDF no cabeçalho</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
@@ -2702,22 +3592,22 @@ Esta ação pode implicar um funcionamento errático.</translation>
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Comprimento inválido no nome da entrada da variante do mapa</translation>
+ <translation>Comprimento inválido do nome da entrada da variante do mapa</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Dados inválidos no nome da entrada da variante do mapa</translation>
+ <translation>Dados inválidos do nome da entrada da variante do mapa</translation>
</message>
<message>
<source>Invalid variant map entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Comprimento inválido no valor de entrada do mapa</translation>
+ <translation>Comprimento inválido do valor de entrada do mapa</translation>
</message>
<message>
<source>Invalid variant map entry value data</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>Dados inválidos no valor da entrada da variante do mapa</translation>
+ <translation>Dados inválidos do valor da entrada da variante do mapa</translation>
</message>
<message>
<source>Invalid variant map Bool entry value length</source>
@@ -2754,6 +3644,15 @@ Esta ação pode implicar um funcionamento errático.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Tamanho inválido do tipo de campo da variante do mapa</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2764,7 +3663,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
<message>
<source>Invalid symmetric cipher IV size.</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation>Tamanho inválido da cifra simétrica IV.</translation>
+ <translation>Algoritmo inválido de cifra simétrica IV.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2773,7 +3672,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>Erro ao serializar os parâmetros KDF da variante do mapa</translation>
+ <translation>Falhou a serialização dos parâmetros da KDF (função de derivação de chave) da variante do mapa</translation>
</message>
</context>
<context>
@@ -2808,7 +3707,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
<message>
<source>Invalid random stream id size</source>
- <translation>Tamanho inválido do ID do fluxo aleatório</translation>
+ <translation>Tamanho inválido do ID do stream aleatório</translation>
</message>
<message>
<source>Invalid inner random stream cipher</source>
@@ -2849,7 +3748,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
<name>KdbxXmlReader</name>
<message>
<source>XML parsing failure: %1</source>
- <translation>Erro ao processar o XML: %1</translation>
+ <translation>Falha no processamento XML: %1</translation>
</message>
<message>
<source>No root group</source>
@@ -2889,11 +3788,11 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>UUID nulo em DeleteObject</translation>
+ <translation>UUID de DeleteObject nulo</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
- <translation>Tempo ou UUID em falta para DeletedObject</translation>
+ <translation>Tempo ou UUID de DeletedObject em falta</translation>
</message>
<message>
<source>Null entry uuid</source>
@@ -2901,7 +3800,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>Invalid entry icon number</source>
- <translation>Número inválido na entrada de ícone</translation>
+ <translation>Número inválido da entrada de ícone</translation>
</message>
<message>
<source>History element in history entry</source>
@@ -2909,7 +3808,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>No entry uuid found</source>
- <translation>Não foi encontrado o UUID da entrada</translation>
+ <translation>Não foi encontrada uma entrada UUID</translation>
</message>
<message>
<source>History element with different uuid</source>
@@ -2976,13 +3875,13 @@ Linha %2, coluna %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importar base de dados do KeePass 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Não foi possível abrir a base de dados.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3040,12 +3939,8 @@ Linha %2, coluna %3</translation>
<translation>Não foi possível calcular a chave-mestre</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chave errada ou base de dados danificada.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
- <translation>Erro ao transformar a chave</translation>
+ <translation>Falha ao transformar a chave</translation>
</message>
<message>
<source>Invalid group field type number</source>
@@ -3139,40 +4034,57 @@ Linha %2, coluna %3</translation>
<source>unable to seek to content position</source>
<translation>Não foi possível pesquisar no conteúdo</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Partilha desativada</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importado de %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importar de</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Exportar para</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Sincronizar com</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Desativar partilha %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importar da partilha %1</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportar para a partilha %1</translation>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Sincronizar com a partilha %1</translation>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3217,10 +4129,6 @@ Linha %2, coluna %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Explorar</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Gerar</translation>
</message>
@@ -3276,6 +4184,43 @@ Mensagem: %2</translation>
<source>Select a key file</source>
<translation>Selecione o ficheiro-chave</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Procurar...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3364,12 +4309,8 @@ Mensagem: %2</translation>
<translation>Definiçõe&amp;s</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Gerador de palavras-passe</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation>B&amp;loquear bases de dados</translation>
+ <translation>B&amp;loquear base de dados</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -3439,7 +4380,7 @@ Mensagem: %2</translation>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation>AVISO: está a utilizar uma versão instável do KeePassXC!
+ <translation>AVISO: está a utilizar uma versão instável do KeepassXC!
Existe um risco bastante grande e deve efetuar um backup da base de dados.
Esta versão não deve ser utilizada para uma utilização regular.</translation>
</message>
@@ -3554,14 +4495,6 @@ Recomendamos que utilize a versão AppImage disponível no nosso site.</translat
<translation>Mostrar código QR TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Procurar atualizações...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Partilhar entrada</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOTA: está a utilizar uma versão de teste do KeePassXC!
@@ -3579,6 +4512,74 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>You can always check for updates manually from the application menu.</source>
<translation>Também pode verificar se existem atualizações através do menu da aplicação.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Descarregar &apos;favicon&apos;</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3638,6 +4639,14 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Adding missing icon %1</source>
<translation>Adicionar ícone em falta %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3708,6 +4717,72 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3719,7 +4794,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Base64 decoding failed</source>
- <translation>Erro de descodificação Base64</translation>
+ <translation>Falha na descodificação Base64</translation>
</message>
<message>
<source>Key file way too small.</source>
@@ -3735,7 +4810,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Failed to read public key.</source>
- <translation>Erro ao ler a chave pública.</translation>
+ <translation>Falha ao ler a chave pública.</translation>
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
@@ -3755,11 +4830,11 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation>Erro na derivação da chave, ficheiro-chave danificado?</translation>
+ <translation>Falha na derivação da chave, ficheiro-chave danificado?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation>Erro ao decifrar, frase-chave errada?</translation>
+ <translation>Falha ao decifrar, frase-chave errada?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
@@ -3807,6 +4882,17 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3832,6 +4918,22 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Generate master password</source>
<translation>Gerar palavra-passe principal</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3861,22 +4963,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Tipos de caracteres</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Letras maiúsculas</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Letras minúsculas</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Números</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caracteres especiais</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>ASCII expandido</translation>
</message>
@@ -3957,18 +5047,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Avançado</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Letras maiúsculas de A até F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Letras minúsculas de A até F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4001,18 +5083,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matemática</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Traços</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4060,6 +5134,74 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Regenerate</source>
<translation>Recriar</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4067,12 +5209,9 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Selecionar</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4109,6 +5248,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Merge</source>
<translation>Combinar</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4134,7 +5277,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>KeePassXC association failed, try again</source>
- <translation>Erro ao associar o KeePassXC. Tente novamente.</translation>
+ <translation>Falha ao associar o KeePassXC. Tente novamente.</translation>
</message>
<message>
<source>Encryption key is not recognized</source>
@@ -4201,10 +5344,6 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Gerar palavra-passe para a entrada.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Tamanho da palavra-passe gerada.</translation>
- </message>
- <message>
<source>length</source>
<translation>tamanho</translation>
</message>
@@ -4254,18 +5393,6 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Executar análise avançada da palavra-passe.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extrair e mostrar o conteúdo da base de dados.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Caminho da base de dados a extrair.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Introduza a palavra-passe para desbloquear %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4303,17 +5430,13 @@ Comandos disponíveis:
</message>
<message>
<source>Search term.</source>
- <translation>Termo de pesquisa.</translation>
+ <translation>Termo de pesquisa</translation>
</message>
<message>
<source>Merge two databases.</source>
<translation>Combinar duas bases de dados.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Caminho da base de dados de destino da combinação.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Caminho da base de dados de origem da combinação.</translation>
</message>
@@ -4390,10 +5513,6 @@ Comandos disponíveis:
<translation>Integração com navegador</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Pergunta de segurança - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Prima</translation>
</message>
@@ -4424,10 +5543,6 @@ Comandos disponíveis:
<translation>Gerar nova palavra-passe aleatória.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Valor inválido para o tamanho da palavra-passe %1</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Não foi possível criar a entrada com o caminho %1</translation>
</message>
@@ -4485,10 +5600,6 @@ Comandos disponíveis:
<translation>número</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Valor inválido para o tamanho da palavra-passe: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Não foi possível encontrar a entrada com o caminho %1.</translation>
</message>
@@ -4613,26 +5724,6 @@ Comandos disponíveis:
<translation>Erro ao carregar o ficheiro-chave %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>%1 não existe.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Não foi possível abrir o ficheiro %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Erro ao ler a base de dados:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Erro ao analisar a base de dados:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Tamanho da palavra-passe gerada</translation>
</message>
@@ -4645,10 +5736,6 @@ Comandos disponíveis:
<translation>Utilizar letras maiúsculas</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Utilizar números</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Utilizar caracteres especiais</translation>
</message>
@@ -4793,10 +5880,6 @@ Comandos disponíveis:
<translation>A base de dados foi criada com sucesso.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Introduza a palavra-passe para cifrar a base de dados (prima Enter para não cifrar):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Não foi possível criar o ficheiro-chave %1: %2</translation>
</message>
@@ -4805,10 +5888,6 @@ Comandos disponíveis:
<translation>Não foi possível carregar o ficheiro-chave %1: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Remover uma entrada da base de dados.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Caminho da entrada a remover.</translation>
</message>
@@ -4864,6 +5943,330 @@ Comandos disponíveis:
<source>Cannot create new group</source>
<translation>Não foi possível criar o novo grupo</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versão %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Tipo de compilação: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisão: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribuição: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistema operativo: %1
+Arquitetura do CPU: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Escrita automática</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (partilha assinada e não assinada)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (apenas partilha assinada)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (apenas partilha não assinada)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nada</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Extensões ativas:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>A base de dados não foi alterada pela combinação.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4903,7 +6306,7 @@ Comandos disponíveis:
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation>Erro ao conectar com o agente.</translation>
+ <translation>Falha ao conectar com o agente.</translation>
</message>
<message>
<source>Agent protocol error.</source>
@@ -5018,6 +6421,93 @@ Comandos disponíveis:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Geral</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupo</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Definições da base de dados</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Desbloquear base de dados</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Bloquear base de dados</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nada</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5140,9 +6630,100 @@ Comandos disponíveis:
<source>Signer:</source>
<translation>Signatário:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Chave</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>A substituição de contentor de partilha não assinado não é suportada - exportação evitada</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Não foi possível escrever contentor de exportação (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Assinatura não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Assinatura não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Base de dados não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Base de dados não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>A substituição de contentor de partilha assinado não é suportada - exportação evitada</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Não foi possível escrever contentor de exportação</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Ocorreu um erro inesperado ao exportar</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importar de um contentor sem assinatura</translation>
@@ -5156,6 +6737,10 @@ Comandos disponíveis:
<translation>Importar de um contentor com certificado</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Deseja confiar em %1 com a impressão digital de %2 em %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Agora não</translation>
</message>
@@ -5172,18 +6757,6 @@ Comandos disponíveis:
<translation>Apenas agora</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>A importação de %1 falhou (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>A importação de %1 foi bem sucedida (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importado de %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>O contentor de partilha assinado não é suportado - importação evitada</translation>
</message>
@@ -5223,25 +6796,20 @@ Comandos disponíveis:
<source>Unknown share container type</source>
<translation>Tipo de contentor de partilha desconhecido</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>A substituição de contentor de partilha não assinado não é suportada - exportação evitada</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Não foi possível escrever contentor de exportação (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>A substituição de contentor de partilha assinado não é suportada - exportação evitada</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>A importação de %1 falhou (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Não foi possível escrever contentor de exportação</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>A importação de %1 foi bem sucedida (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Ocorreu um erro inesperado ao exportar</translation>
+ <source>Imported from %1</source>
+ <translation>Importado de %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5256,10 +6824,6 @@ Comandos disponíveis:
<translation>Exportar para %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Deseja confiar em %1 com a impressão digital de %2 em %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Diversos caminhos de importação para %1 em %2</translation>
</message>
@@ -5267,22 +6831,6 @@ Comandos disponíveis:
<source>Conflicting export target path %1 in %2</source>
<translation>Conflito no caminho de exportação para %1 em %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Assinatura não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Assinatura não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Base de dados não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Base de dados não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5330,10 +6878,6 @@ Comandos disponíveis:
<translation>Configurar TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Chave:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Definições padrão do token RFC 6238</translation>
</message>
@@ -5343,7 +6887,7 @@ Comandos disponíveis:
</message>
<message>
<source>Use custom settings</source>
- <translation>Utilizar definições personalizadas</translation>
+ <translation>Usar definições personalizadas</translation>
</message>
<message>
<source>Custom Settings</source>
@@ -5363,16 +6907,45 @@ Comandos disponíveis:
<translation>Tamanho do código:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 dígitos</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7 dígitos</translation>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 dígitos</translation>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5456,6 +7029,14 @@ Comandos disponíveis:
<source>Welcome to KeePassXC %1</source>
<translation>Bem-vindo ao KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5479,5 +7060,13 @@ Comandos disponíveis:
<source>No YubiKey inserted.</source>
<translation>Youbikey não inserida.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_pt_BR.ts b/share/translations/keepassx_pt_BR.ts
index 2e2fd4ac7..e1a90e218 100644
--- a/share/translations/keepassx_pt_BR.ts
+++ b/share/translations/keepassx_pt_BR.ts
@@ -23,11 +23,11 @@
</message>
<message>
<source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;Ver Colaborações no GitHub&lt;/a&gt;</translation>
+ <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;Ver colaborações no GitHub&lt;/a&gt;</translation>
</message>
<message>
<source>Debug Info</source>
- <translation>Informações de Depuração</translation>
+ <translation>Informações de depuração</translation>
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
@@ -39,18 +39,18 @@
</message>
<message>
<source>Project Maintainers:</source>
- <translation>Mantedores do Projeto:</translation>
+ <translation>Mantedores do projeto:</translation>
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
- <translation>A equipe KeePassXC agradece especialmente a debfx pela criação do KeePassX original.</translation>
+ <translation>A equipe do KeePassXC agradece especialmente a debfx pela criação do KeePassX original.</translation>
</message>
</context>
<context>
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>Habilitar Agente SSH (requer reinicialização)</translation>
+ <translation>Habilitar agente SSH (requer reinicialização)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Seguir o estilo</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Restaurar Configurações?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Você tem certeza que quer restaurar todas as configurações gerais e de segurança para o padrão?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Iniciar apenas uma única instância do KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Lembrar dos últimos bancos de dados</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Lembre-se de arquivos de chave passados e dongles de segurança</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Carregar bancos de dados anteriores na inicialização</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Iniciar programa com janela minimizada</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Usar ícone de grupo na criação da entrada</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimizar ao copiar para área de transferência</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Ocultar entrada do painel de visualização</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Ocultar janela na bandeja de sistema quando minimizada</translation>
</message>
<message>
- <source>Language</source>
- <translation>Idioma</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Autodigitação</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Atraso ao iniciar Auto-Digitar</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Verificar atualizações na inicialização do aplicativo</translation>
+ <source>Movable toolbar</source>
+ <translation>Barra de Ferramentas Móvel</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Incluir pré-lançamentos quando checar por atualizações</translation>
+ <source>Remember previously used databases</source>
+ <translation>Lembrar dos bancos de dados usados anteriormente</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Barra de Ferramentas Móvel</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Carregar bancos de dados previamente abertos na inicialização</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Verificar atualizações na inicialização do aplicativo uma vez por semana</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Incluem versões betas durante a verificação de atualizações</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Estilo de botão:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Idioma:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(reiniciar programa ao ativar)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Minimizar a janela após desbloquear banco de dados</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimizar quando abrir uma URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Ocultar a janela quando copiar para área de transferência</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimizar</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Soltar no fundo</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Tempo limite de download Favicon:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Esgotamento do download de ícone do website em segundos</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> seg</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>Estilo de botão da barra de ferramentas</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Usar fonte monoespaçada para Notas</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Seleção de idioma</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Restaurar Configurações para o Padrão</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Atalho global para Auto-Digitar</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Digitação de caracteres com Auto-Digitar com atraso de milissegundos</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Estilo de botão</translation>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Auto-Digitar inicia com atraso de milissegundos</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Privacidade</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Use DuckDuckGo como substituto para baixar ícones de sites</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Usar o serviço DuckDuckGo para baixar ícones de websites</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -332,27 +422,27 @@
</message>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation>Auto-Digitação - KeePassXC</translation>
+ <translation>Autodigitação - KeePassXC</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-Digitação</translation>
+ <translation>Autodigitação</translation>
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation>A sintaxe da sua sequência de Auto-Digitação está incorreta!</translation>
+ <translation>A sintaxe da sua sequência de autodigitação está incorreta!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
- <translation>Este comando de Auto-Digitação contém um tempo de espera muito longo. Você tem certeza que deseja continuar?</translation>
+ <translation>Este comando de autodigitação contém um tempo de espera muito longo. Você tem certeza de que deseja continuar?</translation>
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>Este comando Autotipo contém pressionamentos de teclas muito lentos. Você realmente deseja prosseguir?</translation>
+ <translation>Este comando de autodigitação contém pressionamentos de teclas muito lentos. Você tem certeza de que deseja continuar?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
- <translation>Este comando Auto-Type contém os argumentos que são repetidos muitas vezes. Você realmente deseja prosseguir?</translation>
+ <translation>Este comando de autodigitação contém parâmetros que são repetidos muitas vezes. Você tem certeza de que deseja continuar?</translation>
</message>
</context>
<context>
@@ -390,14 +480,29 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copiar nome de &amp;usuário</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copiar &amp;senha</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation>Auto-Digitação - KeePassXC</translation>
+ <translation>Autodigitação - KeePassXC</translation>
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation>Escolha uma entrada para Auto-Digitar:</translation>
+ <translation>Escolha uma entrada para digitar automaticamente:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>Buscar...</translation>
</message>
</context>
<context>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 solicitou acesso a senhas para o(s) seguinte(s) iten(s).
Selecione se deseja permitir o acesso.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Permitir acesso</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Negar acesso</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
<translation>Isso é necessário para acessar os seus bancos de dados usando o KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Habilitar integração do KeepassXC com navegadores</translation>
- </message>
- <message>
<source>General</source>
<translation>Geral</translation>
</message>
@@ -491,7 +600,7 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
- <translation>Pe&amp;dir para desbloquear a banco de dados se estiver bloqueado</translation>
+ <translation>Pe&amp;dir para desbloquear a base de dados se estiver bloqueada</translation>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
@@ -526,7 +635,7 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Nunca peça confirmação antes de acessar as credenciais</translation>
+ <translation>Nunca peça confirmação antes de &amp;acessar as credenciais</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
@@ -534,10 +643,6 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
<translation>Nunca peça confirmação antes de at&amp;ualizar as credenciais</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Somente o banco de dados selecionado deve estar conectado com um cliente.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>&amp;Buscar em todos os bancos de dados abertos por credenciais correspondentes</translation>
@@ -556,7 +661,7 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>Atualizar arquivos de manifesto de mensagens nativos na inicialização</translation>
+ <translation>Atualizar arquivos de manifesto de mensagens &amp;nativas na inicialização</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -593,10 +698,6 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
<translation>&amp;Navegador Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Alerta&lt;/b&gt;, o aplicativo keepassxc-proxy não foi encontrado!&lt;br /&gt;Por favor, verifique o diretório de instalação do KeePassXC ou confirme o caminho personalizado nas opções avançadas.&lt;br /&gt;A integração do navegador não funcionará sem o aplicativo proxy.&lt;br /&gt;Caminho esperado: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Arquivos Executáveis</translation>
</message>
@@ -621,6 +722,50 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>O KeePassXC-Browser é necessário para que a integração do navegador funcione. &lt;br /&gt;Faça o download para %1 e %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>&amp;Permitir retorno de credenciais expiradas.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Habilitar integração com navegadores</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Navegadores instalados como snaps atualmente não são suportados.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Todos os bancos de dados conectados a extensão irão retornar as credenciais correspondentes.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -648,8 +793,8 @@ Se você gostaria de permitir acesso ao seu banco de dados KeePassXC, atribua um
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
- <translation>Uma chave de criptografia compartilhada com o nome &quot;% 1&quot; já existe.
-Você deseja sobrescreve-la?</translation>
+ <translation>Uma chave de criptografia compartilhada com o nome &quot;%1&quot; já existe.
+Você deseja sobrescrever-la?</translation>
</message>
<message>
<source>KeePassXC: Update Entry</source>
@@ -713,6 +858,10 @@ Would you like to migrate your existing settings now?</source>
Isso é necessário para manter as conexões atuais do navegador.
Gostaria de migrar suas configurações existentes agora?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Não mostrar este alerta novamente</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -772,10 +921,6 @@ Gostaria de migrar suas configurações existentes agora?</translation>
<translation>O primeiro registro contém os nomes dos campos</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Número de linhas do cabeçalho a descartar</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Considere &apos;\&apos; como caractere de escape</translation>
</message>
@@ -825,6 +970,22 @@ Gostaria de migrar suas configurações existentes agora?</translation>
<translation>Importação de CSV: o gravador tem erros:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Prever importação de CSV</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -839,11 +1000,11 @@ Gostaria de migrar suas configurações existentes agora?</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte</numerusform><numerusform>%n bytes</numerusform></translation>
+ <translation><numerusform>%n byte(s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n linha</numerusform><numerusform>%n linhas</numerusform></translation>
+ <translation><numerusform>%n linha(s)</numerusform><numerusform>%n linha(s)</numerusform></translation>
</message>
</context>
<context>
@@ -866,10 +1027,6 @@ Gostaria de migrar suas configurações existentes agora?</translation>
<translation>Erro ao ler o banco de dados: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Não foi possível salvar, o banco de dados não possui nome de arquivo.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>O arquivo não pode ser gravado, pois é aberto no modo somente leitura.</translation>
</message>
@@ -877,6 +1034,27 @@ Gostaria de migrar suas configurações existentes agora?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Chave não transformada. Este é um bug, por favor denuncie para os desenvolvedores!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Lixeira</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -888,30 +1066,14 @@ Gostaria de migrar suas configurações existentes agora?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Insira a chave-mestra</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Arquivo-Chave:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Senha:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Navegar</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Atualizar</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Resposta do Desafio:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Formato de chave antigo</translation>
</message>
@@ -941,20 +1103,96 @@ Por favor, considere-se gerar um novo arquivo de chave.</translation>
<translation>Escolha o arquivo-chave</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID para desbloqueio rápido</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Não é possível abrir o banco de dados:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Não é possível abrir o arquivo de chaves:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Desbloquear Banco de Dados do KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Digitar Senha:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de senha</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da senha</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Digitar Credenciais Adicionais:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Navegar por arquivo chave</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Navegar...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Limpar</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Selecionar arquivo...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Retentar com senha vazia</translation>
</message>
</context>
<context>
@@ -1063,7 +1301,7 @@ Isso pode impedir a conexão com o plugin do navegador.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Removido com sucesso% n chave (s) criptográficas das configurações do KeePassXC.</numerusform><numerusform>Removido com sucesso% n chave (s) criptográficas das configurações do KeePassXC.</numerusform></translation>
+ <translation><numerusform>Removeu com sucesso %n chave(s) de criptografia das configurações do KeePassXC.</numerusform><numerusform>Removeu com sucesso %n chave(s) de criptografia das configurações do KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1097,7 +1335,7 @@ Permissões para acessar entradas serão revogadas.</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
- <translation>O banco de dados ativo não contém uma entrada com permissões.</translation>
+ <translation>A base de dados ativa não contém uma entrada com permissões.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
@@ -1109,6 +1347,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Você realmente deseja mover todos os dados de integração do navegador herdados para o padrão mais recente?
Isso é necessário para manter a compatibilidade com o plugin do navegador.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Remover chave selecionada</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1251,6 +1497,57 @@ Se você manter este número, seu banco de dados pode ser facilmente crackeado!<
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Formato do banco de dados</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Algorítimo da criptografia</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Uso da memória</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Paralelismo</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Entradas Expostas</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1284,7 +1581,7 @@ Se você manter este número, seu banco de dados pode ser facilmente crackeado!<
</message>
<message>
<source> MiB</source>
- <translation> MB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1296,7 +1593,40 @@ Se você manter este número, seu banco de dados pode ser facilmente crackeado!<
</message>
<message>
<source>Enable &amp;compression (recommended)</source>
- <translation>Ativar &amp;compressão</translation>
+ <translation>Ativar &amp;compressão (recomendado)</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Esvaziar Lixeira</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(antigo)</translation>
</message>
</context>
<context>
@@ -1365,6 +1695,10 @@ Tem certeza de que deseja continuar sem uma senha?</translation>
<source>Failed to change master key</source>
<translation>Não foi possível alterar a chave mestra</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Continuar sem senha</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1376,6 +1710,129 @@ Tem certeza de que deseja continuar sem uma senha?</translation>
<source>Description:</source>
<translation>Descrição:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Estatísticas</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valor</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Nome do banco de dados</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descrição</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Localização</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Mudanças não-salvas</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>sim</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>não</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>O banco de dados foi modificado, mas as mudanças ainda não foram salvas no disco.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Número de grupos</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Número de entradas</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Número de entradas expiradas</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>O banco de dados contém entradas que expiraram.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Senhas únicas</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Senhas não-únicas</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Algumas senhas são usadas mais do que três vezes. Use senhas únicas quando possível.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Comprimento mínimo recomendado de senha é pelo menos 8 caracteres.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Número de senhas fracas</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Recomendamos o uso de senhas longas e randomizados com uma classificação de &apos;bom&apos; ou &apos;excelente&apos;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Comprimento médio da senha</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 caracteres</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1426,10 +1883,6 @@ This is definitely a bug, please report it to the developers.</source>
Este é definitivamente um bug, por favor denuncie para os desenvolvedores.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>O arquivo de banco de dados não existe ou não está acessível.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Selecionar arquivo CSV</translation>
</message>
@@ -1452,6 +1905,30 @@ Este é definitivamente um bug, por favor denuncie para os desenvolvedores.</tra
<comment>Database tab name modifier</comment>
<translation>%1 [Apenas leitura]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Exportar banco de dados como arquivo HTML</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>Arquivo HTML</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Confirmação da Exportação</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Você está prestes a exportar o seu banco de dados para um arquivo não criptografado. Isso vai deixar suas senhas e informações confidenciais vulneráveis! Você tem certeza que quer continuar?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1469,7 +1946,7 @@ Este é definitivamente um bug, por favor denuncie para os desenvolvedores.</tra
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Você quer realmente mudar %n entradas para a lixeira?</numerusform><numerusform>Você deseja realmente mover %n entrada(s) para a lixeira?</numerusform></translation>
+ <translation><numerusform>Você realmente quer mover %n entrada(s) para a lixeira?</numerusform><numerusform>Você realmente quer mover %n entrada(s) para a lixeira?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1489,11 +1966,11 @@ Este é definitivamente um bug, por favor denuncie para os desenvolvedores.</tra
</message>
<message>
<source>No current database.</source>
- <translation>Nenhuma banco de dados atual.</translation>
+ <translation>Nenhuma base de dados atual.</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
- <translation>Nenhuma banco de dados de origem, nada a fazer.</translation>
+ <translation>Nenhuma base de dados de origem, nada a fazer.</translation>
</message>
<message>
<source>Search Results (%1)</source>
@@ -1509,7 +1986,7 @@ Este é definitivamente um bug, por favor denuncie para os desenvolvedores.</tra
</message>
<message>
<source>The database file has changed. Do you want to load the changes?</source>
- <translation>O banco de dados foi alterado. Deseja carregar as alterações?</translation>
+ <translation>A base de dados foi alterada. Deseja carregar as alterações?</translation>
</message>
<message>
<source>Merge Request</source>
@@ -1535,15 +2012,11 @@ Você deseja combinar suas alterações?</translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Apagar entrada?</numerusform><numerusform>Apagar entradas?</numerusform></translation>
+ <translation><numerusform>Excluir entrada(s)?</numerusform><numerusform>Excluir entrada(s)?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Mover entrada para a lixeira?</numerusform><numerusform>Mover entradas para a lixeira?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Arquivo aberto no modo somente leitura.</translation>
+ <translation><numerusform>Mover entrada(s) para lixeira?</numerusform><numerusform>Mover entrada(s) para lixeira?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1586,12 +2059,6 @@ Disable safe saves and try again?</source>
Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Escrevendo o banco de dados falhou.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Senhas</translation>
</message>
@@ -1635,6 +2102,14 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Shared group...</source>
<translation>Grupo compartilhado...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Gravação do banco de dados falhou: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Este banco de dados está aberto em modo de leitura. Auto-salvar está desabilitado.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1652,7 +2127,7 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-Digitação</translation>
+ <translation>Autodigitação</translation>
</message>
<message>
<source>Properties</source>
@@ -1720,7 +2195,7 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n mese(s)</numerusform><numerusform>%n mese(s)</numerusform></translation>
+ <translation><numerusform>%n mês(es)</numerusform><numerusform>%n mês(es)</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1748,12 +2223,24 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n ano</numerusform><numerusform>%n anos</numerusform></translation>
+ <translation><numerusform>%n ano(s)</numerusform><numerusform>%n ano(s)</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Confirme a Remoção</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integração com o Navegador</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Tem certeza de que deseja remover esta URL?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1793,6 +2280,42 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Background Color:</source>
<translation>Cor de fundo:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Valor do atributo</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Adicionar um novo atributo</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Remover atributo selecionado</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Editar nome do atributo</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Mostrar um atributo protegido</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1828,6 +2351,77 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Usar sequência especifica para essa associação:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Personalizar sequência de Auto-Digitar</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Geral</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Ignorar Auto-Envio para esta entrada</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Ocultar esta entrada da extensão do navegador</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Adicionar</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remover</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Editar</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1847,6 +2441,26 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Delete all</source>
<translation>Excluir todos</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Apagar todo histórico</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1886,6 +2500,62 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Expires</source>
<translation>Expira em</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Campo da url</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Baixar favicon para URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de senha</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da senha</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Alternar visibilidade das notas</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo notas</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1962,6 +2632,22 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Requer confirmação do usuário quando essa chave é usada</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1997,6 +2683,10 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Herdar do grupo pai (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>A entrada tem alterações não salvas</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2025,68 +2715,98 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<translation>Inativo</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importar do caminho</translation>
+ <source>KeeShare unsigned container</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportar para o caminho</translation>
+ <source>KeeShare signed container</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Sincronize com o caminho</translation>
+ <source>Select import source</source>
+ <translation>Selecione a fonte de importação</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Sua versão do KeePassXC não suporta o compartilhamento do tipo de contêiner. Por favor, use %1.</translation>
+ <source>Select export target</source>
+ <translation>Selecione o destino de exportação</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>O compartilhamento de banco de dados está desativado</translation>
+ <source>Select import/export file</source>
+ <translation>Selecione o arquivo de importação/exportação</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>A exportação de banco de dados está desativada</translation>
+ <source>Clear</source>
+ <translation>Limpar</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>A importação do banco de dados está desativada</translation>
+ <source>Import</source>
+ <translation>Importar</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>Export</source>
+ <translation>Exportar</translation>
+ </message>
+ <message>
+ <source>Synchronize</source>
+ <translation>Sincronizar</translation>
+ </message>
+ <message>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Selecione a fonte de importação</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Selecione o destino de exportação</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Selecione o arquivo de importação/exportação</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Limpar</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>Exportação de banco de dados está atualmente desativado por configurações do aplicativo.</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>O contêiner de exportado %1 já é referenciado.</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>Importação de banco de dados está atualmente desativado por configurações do aplicativo.</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>O contêiner de importado %1 já foi importado.</translation>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>O contêiner %1 importado e exportado por diferentes grupos.</translation>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de senha</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da senha</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>Limpar campos</translation>
</message>
</context>
<context>
@@ -2109,7 +2829,7 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-Digitação</translation>
+ <translation>Autodigitação</translation>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
@@ -2117,7 +2837,35 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
- <translation>Definir sequência padrão de Auto-Digitar</translation>
+ <translation>Definir se&amp;quência padrão de Auto-Digitar</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation>Campo nome</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo notas</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2155,28 +2903,16 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<translation>Todos arquivos</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Ícone personalizado já existe</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirmar Exclusão</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Ícone personalizado baixado com sucesso</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Dica: você pode habilitar o DuckDuckGo como um reserva em Ferramentas&gt; Configurações&gt; Segurança</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Selecionar Imagem(ns)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Carregado com sucesso %1 de %n ícone(s)</numerusform><numerusform>Carregado com sucesso %1 de %n ícone(s)</numerusform></translation>
+ <translation><numerusform>Carregou com sucesso %1 de %n ícone(s)</numerusform><numerusform>Carregou com sucesso %1 de %n ícone(s)</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2188,12 +2924,48 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Os seguintes ícones falharam:</numerusform><numerusform>O(s) seguinte(s) ícone(s) falharam:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Este ícone é usado por %n entrada(s) e será substituído pelo ícone padrão. Tem certeza de que deseja excluí-lo?</numerusform><numerusform>Este ícone é usado por %n entrada(s) e será substituído pelo ícone padrão. Tem certeza de que deseja excluí-lo?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Baixar favicon para URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2239,6 +3011,30 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<source>Value</source>
<translation>Valor</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>ID única</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Dados do plugin</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Remover dados do plugin selecionado</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2286,7 +3082,7 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Tem certeza que deseja remover anexos de %n?</numerusform><numerusform>Tem certeza que deseja remover os %n anexo(s)?</numerusform></translation>
+ <translation><numerusform>Tem certeza de que deseja remover %n anexo(s)?</numerusform><numerusform>Tem certeza de que deseja remover %n anexo(s)?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2333,6 +3129,26 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
%1</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Anexos</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Adicionar novo anexo</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Remover anexo selecionado</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Abrir anexo selecionado</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Salvar anexo selecionado no disco</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2427,10 +3243,6 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Gerar Token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Fechar</translation>
</message>
@@ -2515,6 +3327,14 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<source>Share</source>
<translation>Compartilhar</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Mostrar valor TOTP atual</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avançado</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2528,7 +3348,7 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
</message>
<message>
<source>Hide Passwords</source>
- <translation>Ocultar senhas</translation>
+ <translation>Ocultar Senhas</translation>
</message>
<message>
<source>Fit to window</source>
@@ -2548,11 +3368,33 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Lixeira</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>Entrada &quot;%1&quot; do banco de dados &quot;%2&quot; foi usada por %3</translation>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2571,6 +3413,58 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Baixar Favicons</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>Baixando...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Já Existe</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Falha no Download</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>Baixando favicons (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2592,10 +3486,6 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<translation>Impossibilitado de expedir o desafio-resposta.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chave errada ou banco de dados corrompido.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>cabeçalhos de banco de dados ausente</translation>
</message>
@@ -2615,6 +3505,11 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<source>Invalid header data length</source>
<translation>Comprimento de dados cabeçalho inválido</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2646,10 +3541,6 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<translation>Incompatibilidade de cabeçalho SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Chave inválida ou arquivo banco de dados está corrompido. (Incompatibilidade de HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Cifra desconhecida</translation>
</message>
@@ -2749,6 +3640,15 @@ Isto pode causar mal funcionamento dos plugins afetados.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Tamanho inválido do tipo de campo da variante do mapa</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2880,7 +3780,7 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da
</message>
<message>
<source>No group uuid found</source>
- <translation>Nenhum grupo uuid encontrado</translation>
+ <translation>Nenhum uuid de grupo encontrado</translation>
</message>
<message>
<source>Null DeleteObject uuid</source>
@@ -2971,13 +3871,13 @@ Linha %2, coluna %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importar banco de dados KeePass1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Não foi possível abrir o banco de dados.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3016,7 +3916,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Tamanho de sementes de transformação inválido</translation>
+ <translation>Tamanho de semente de transformação inválido</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
@@ -3035,10 +3935,6 @@ Linha %2, coluna %3</translation>
<translation>Não foi possível calcular a chave mestre</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chave errada ou banco de dados corrompido.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Transformação de chave falhou</translation>
</message>
@@ -3104,7 +4000,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation>Item inválido tamanho do campo uuid</translation>
+ <translation>Entrada inválida tamanho do campo uuid</translation>
</message>
<message>
<source>Invalid entry group id field size</source>
@@ -3134,40 +4030,57 @@ Linha %2, coluna %3</translation>
<source>unable to seek to content position</source>
<translation>incapaz de buscar a posição de conteúdo</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Compartilhamento desativado</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importar de</translation>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Exportar para</translation>
+ <source>Imported from %1</source>
+ <translation>Importado de %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Sincronizar com</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Desabilitar compartilhamento %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importar do compartilhamento %1</translation>
+ <source>Imported from</source>
+ <translation>Importado de</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportar para compartilhamento %1</translation>
+ <source>Exported to</source>
+ <translation>Exportado para</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Sincronizar com compartilhamento %1</translation>
+ <source>Synchronized with</source>
+ <translation>Sincronizado com</translation>
</message>
</context>
<context>
@@ -3212,10 +4125,6 @@ Linha %2, coluna %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Navegar</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Gerar</translation>
</message>
@@ -3271,6 +4180,43 @@ Mensagem: %2</translation>
<source>Select a key file</source>
<translation>Escolha um arquivo-chave</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Navegar por arquivo chave</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Navegar...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3312,11 +4258,11 @@ Mensagem: %2</translation>
</message>
<message>
<source>&amp;Save database</source>
- <translation>&amp;Salvar banco de dados</translation>
+ <translation>&amp;Salvar base de dados</translation>
</message>
<message>
<source>&amp;Close database</source>
- <translation>&amp;Fechar banco de dados</translation>
+ <translation>&amp;Fechar base de dados</translation>
</message>
<message>
<source>&amp;Delete entry</source>
@@ -3359,12 +4305,8 @@ Mensagem: %2</translation>
<translation>&amp;Configurações</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Gerador de Senha</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation>&amp;Trancar banco de dados</translation>
+ <translation>&amp;Trancar base de dados</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -3444,7 +4386,7 @@ Esta versão não se destina ao uso em produção.</translation>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation>Relatar um &amp;bug</translation>
+ <translation>Reportar um &amp;bug</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
@@ -3549,14 +4491,6 @@ Recomendamos que você use o AppImage disponível em nossa página de downloads.
<translation>Exibir Código QR do TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Checar por Atualizações...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Compartilhar entrada</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOTA: Você está usando uma versão de pré-lançamento do KeePassXC!
@@ -3574,6 +4508,74 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<source>You can always check for updates manually from the application menu.</source>
<translation>Você sempre pode verificar atualizações manualmente no menu do aplicativo.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Exportar</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>&amp;Verificar Atualizações...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Baixar favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3633,6 +4635,14 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<source>Adding missing icon %1</source>
<translation>Adicionando ícone ausente %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3703,6 +4713,72 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3730,7 +4806,7 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
<message>
<source>Failed to read public key.</source>
- <translation>Falha ao ler chave pública</translation>
+ <translation>Falha ao ler chave pública.</translation>
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
@@ -3758,27 +4834,27 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation>EOF inesperado enquanto lendo a chave pública.</translation>
+ <translation>EOF inesperado enquanto lendo a chave pública</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation>EOF inesperado enquanto lendo a chave privada.</translation>
+ <translation>EOF inesperado enquanto lendo a chave privada</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
- <translation>Não é possível escrever a chave pública enquanto estiver vazio.</translation>
+ <translation>Não é possível escrever a chave pública enquanto estiver vazio</translation>
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation>EOF inesperado enquanto escrevendo a chave pública.</translation>
+ <translation>EOF inesperado enquanto escrevendo a chave pública</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
- <translation>EOF inesperado enquanto escrevendo a chave privada.</translation>
+ <translation>Não é possível escrever a chave privada enquanto estiver vazio</translation>
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation>EOF inesperado enquanto escrevendp a chave privada.</translation>
+ <translation>EOF inesperado enquanto escrevendp a chave privada</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
@@ -3802,6 +4878,17 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3827,6 +4914,22 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<source>Generate master password</source>
<translation>Gerar senha mestra</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo de senha</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da senha</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3856,22 +4959,10 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<translation>Tipo de Caracteres</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Letras Maiúsculas</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Letras Minúsculas</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Números</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caracteres Especiais</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>ASCII extendido</translation>
</message>
@@ -3952,18 +5043,10 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<translation>Avançado</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Letras Maiúsculas A a F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Letras minúsculas de A a F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3996,18 +5079,10 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matemática</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4055,6 +5130,74 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<source>Regenerate</source>
<translation>Regenerar</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Regerar senha</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Copiar senha</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Aceitar senha</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>minúsculo</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>MAIÚSCULO</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da senha</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4062,12 +5205,9 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Selecionar</translation>
+ <source>Statistics</source>
+ <translation>Estatísticas</translation>
</message>
</context>
<context>
@@ -4104,6 +5244,10 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<source>Merge</source>
<translation>Fundir</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4161,7 +5305,7 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
<message>
<source>Path of the database.</source>
- <translation>Caminho do banco de dados</translation>
+ <translation>Caminho do banco de dados.</translation>
</message>
<message>
<source>Key file of the database.</source>
@@ -4196,10 +5340,6 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<translation>Gerar uma senha para a entrada.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Comprimento para a senha gerada.</translation>
- </message>
- <message>
<source>length</source>
<translation>tamanho</translation>
</message>
@@ -4249,18 +5389,6 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
<translation>Execute análise avançada sobre a senha.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extrair e imprimir o conteúdo do banco de dados.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Caminho do banco de dados para extração.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Inserir a senha para desbloquear 1%: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4304,10 +5432,6 @@ Comandos disponíveis:
<translation>Juntar dois bancos de dados.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Caminho do banco de dados para combinar.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Caminho do banco de dados para combinar como base.</translation>
</message>
@@ -4384,10 +5508,6 @@ Comandos disponíveis:
<translation>Integração com o Navegador</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey [%1] desafio resposta - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Aperte</translation>
</message>
@@ -4418,10 +5538,6 @@ Comandos disponíveis:
<translation>Gerar nova senha aleatória.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Valor inválido para o tamanho da senha %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Não foi possível criar uma entrada com o caminho %1.</translation>
</message>
@@ -4479,16 +5595,12 @@ Comandos disponíveis:
<translation>contagem</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Valor inválido para o tamanho da senha: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Não mudar qualquer campo para a entrada %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
@@ -4496,7 +5608,7 @@ Comandos disponíveis:
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Gravação do banco de dados falhou: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
@@ -4607,26 +5719,6 @@ Comandos disponíveis:
<translation>Falha ao carregar o arquivo de chave %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Arquivo %1 não existe.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Não é possível abrir o arquivo %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Erro ao ler o banco de dados:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Erro ao analisar o banco de dados:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Comprimento da senha gerada</translation>
</message>
@@ -4639,10 +5731,6 @@ Comandos disponíveis:
<translation>Usar caracteres maiúsculos</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Usar números.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Usar caracteres especiais</translation>
</message>
@@ -4786,20 +5874,12 @@ Comandos disponíveis:
<translation>Novo banco de dados criado com sucesso.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Inserir senha para criptografar banco de dados (Aperte enter para deixar em branco):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
+ <translation>Criação de Arquivo-Chave %1 falhou: %2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>Remover entrada do banco de dados.</translation>
+ <translation>Carregamento de Arquivo-Chave %1 falhou: %2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4857,6 +5937,330 @@ Comandos disponíveis:
<source>Cannot create new group</source>
<translation>Não é possível criar um novo grupo</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versão %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Tipo da Build: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisão: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribuição: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistema operacional: %1
+Arquitetura da CPU: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Autodigitação</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (compartilhamento assinado e não assinado)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (somente compartilhamento assinado)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (apenas compartilhamento não assinado)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nada</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Extensões habilitadas:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analisar senhas por fraquezas e problemas.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Fechar o atual banco de dados aberto.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Mostrar esta ajuda.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Sair do modo interativo.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Usar números</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Comandos disponíveis:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Comando desconhecido %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Banco de dados não foi modificado pela operação de mesclagem.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Abrir um banco de dados.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Nome de usuário</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4939,7 +6343,7 @@ Comandos disponíveis:
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>Cada termo pesquisado deve corresponder (exemplo, logical AND)</translation>
</message>
<message>
<source>Modifiers</source>
@@ -5011,6 +6415,93 @@ Comandos disponíveis:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Opções</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Geral</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Mostrar notificação quando credenciais forem solicitadas</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Nome do arquivo</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupo</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Gerenciar</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorização</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Esses aplicativos estão atualmente conectados:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Aplicativo</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Desconectar</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Configurações do Banco de Dados</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Editar configurações de banco de dados</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Destrancar banco de dados</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Desbloquear banco de dados para mostrar mais informações</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Trancar Banco de Dados</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Desbloquear para mostrar</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nada</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5133,9 +6624,100 @@ Comandos disponíveis:
<source>Signer:</source>
<translation>Signatário:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Mostrar apenas avisos e erros</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Chave</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Gerar novo certificado</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importar certificado existente</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Exportar próprio certificado</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Remover certificado selecionado</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Não foi possível incorporar o banco de dados: não foi possível gravar o arquivo (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>A substituição de contêiner de compartilhamento não assinado não é suportada - exportação impedida</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Não foi possível escrever o contêiner de exportação</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Ocorreu um erro de exportação inesperado</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importar do contêiner sem assinatura</translation>
@@ -5149,6 +6731,10 @@ Comandos disponíveis:
<translation>Importar do contêiner com certificado</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Não dessa vez</translation>
</message>
@@ -5165,18 +6751,6 @@ Comandos disponíveis:
<translation>Só desta vez</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Importação de %1 falhou (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Importado de %1 com sucesso (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importado de %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation type="unfinished"/>
</message>
@@ -5216,43 +6790,34 @@ Comandos disponíveis:
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>A substituição de contêiner de compartilhamento não assinado não é suportada - exportação impedida</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Importação de %1 falhou (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Não foi possível escrever o contêiner de exportação</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Importado de %1 com sucesso (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Ocorreu um erro de exportação inesperado</translation>
+ <source>Imported from %1</source>
+ <translation>Importado de %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <translation>Exportar para %1 falhou (%2)</translation>
</message>
<message>
<source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <translation>Exportado para %1 com sucesso (%2)</translation>
</message>
<message>
<source>Export to %1</source>
<translation>Exportar para %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
</message>
@@ -5260,22 +6825,6 @@ Comandos disponíveis:
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Não foi possível incorporar o banco de dados: não foi possível gravar o arquivo (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5293,7 +6842,7 @@ Comandos disponíveis:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Expira em &lt;b&gt;%n&lt;/b&gt; segundo(s)</numerusform><numerusform>Expira em &lt;b&gt;%n&lt;/b&gt; segundo(s)</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -5323,10 +6872,6 @@ Comandos disponíveis:
<translation>Configurar TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Chave:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Configurações de símbolo padrão RFC 6238</translation>
</message>
@@ -5356,16 +6901,45 @@ Comandos disponíveis:
<translation>Tamanho do código:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 dígitos</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritimo:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation>dígitos</translation>
</message>
<message>
- <source>7 digits</source>
- <translation>7 dígitos</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 dígitos</translation>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Confirmar Remoção de Configurações TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5449,6 +7023,14 @@ Comandos disponíveis:
<source>Welcome to KeePassXC %1</source>
<translation>Bem-vindo ao KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importar do 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Abrir um banco de dados recente</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5472,5 +7054,13 @@ Comandos disponíveis:
<source>No YubiKey inserted.</source>
<translation>Nenhuma YubiKey inserida.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_pt_PT.ts b/share/translations/keepassx_pt_PT.ts
index 1c264b06f..7f75f8dd4 100644
--- a/share/translations/keepassx_pt_PT.ts
+++ b/share/translations/keepassx_pt_PT.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Seguir estilo</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Repor definições?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Tem a certeza de que deseja repor todas as definições para os valores padrão?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Abrir apenas uma instância do KeepassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Memorizar últimas bases de dados</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Memorizar últimos ficheiros-chave e dispositivos de segurança</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Ao iniciar, carregar últimas base de dados utilizadas</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimizar janela ao iniciar a aplicação</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Utilizar ícone do grupo ao criar a entrada</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimizar ao copiar para a área de transferência</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Ocultar painel de pré-visualização de entradas</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Ao minimizar, ocultar a janela na bandeja do sistema</translation>
</message>
<message>
- <source>Language</source>
- <translation>Idioma</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Escrita automática</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Atraso para iniciar a escrita automática</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Ao iniciar, verificar se existem atualizações</translation>
+ <source>Movable toolbar</source>
+ <translation>Barra de ferramentas amovível</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>Memorizar últimas bases de dados utilizadas</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Incluir pré-lançamentos ao verificar se existem atualizações</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Ao iniciar, carregar as últimas base de dados utilizadas</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Barra de ferramentas amovível</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>Memorizar ficheiros-chave e dispositivos de segurança da base de dados</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>Procurar por atualizações semanalmente</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>Incluir versões beta ao procurar por atualizações</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Estilo dos botões:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Idioma:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(reinicie para aplicar as alterações)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>Minimizar janela após desbloquear a base de dados</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>Minimizar ao abrir um URL</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>Ocultar janela ao copiar para a área de transferência</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Minimizar</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>Enviar para segundo plano</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>Tempo limite para descarregar os &apos;favicons&apos;</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>Tempo limite para descarregar os ícones dos sites (em segundos)</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> seg</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Estilo do botão</translation>
+ <source>Toolbar button style</source>
+ <translation>Estilo dos botões da barra de ferramentas</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>Utilizar letra mono-espaçada nas notas</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Seleção de idioma</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Repor definições padrão</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>Atalho global para escrita automática</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>Atraso para a escrita automática de caracteres (milissegundos)</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>Atraso para iniciar a escrita automática (milissegundos)</translation>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Privacidade</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Utilizar DuckDuckGo como recurso para descarregar os ícones dos sites</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Utilizar DuckDuckGo para descarregar os ícones dos sites</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>Limpar área de transferência após </translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Repor inatividade de Touch ID</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>Bloquear base de dados após (segundos)</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>Limpar campo de pesquisa após</translation>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copiar nome de &amp;utilizador</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copiar &amp;palavra-passe</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Selecionar entrada para escrita automática:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Pesquisa...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 solicitou o acesso a palavras-passe para o(s) seguinte(s) itens.
Selecione se deseja permitir o acesso.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Permitir acesso</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Recusar acesso</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<translation>Necessário para aceder às suas bases de dados com KeePassXC-Browser</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Ativar integração com o navegador</translation>
- </message>
- <message>
<source>General</source>
<translation>Geral</translation>
</message>
@@ -534,10 +643,6 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<translation>Nun&amp;ca perguntar antes de atualizar as credenciais</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Apenas a base de dados selecionada tem que estar conectada a um cliente.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Pesquisar por credenciais semel&amp;hantes em todas as base de dados abertas</translation>
@@ -593,10 +698,6 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<translation>Navegador &amp;Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Atenção&lt;/b&gt;, a aplicação keepassxc-proxy não foi encontrada!&lt;br /&gt;Verifique o diretório de instalação do KeePassXC ou confirme o caminho nas definições avançadas.&lt;br /&gt;A integração com o navegador não irá funcionar sem esta aplicação.&lt;br /&gt;Caminho esperado: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Ficheiros executáveis</translation>
</message>
@@ -619,7 +720,51 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
- <translation>Necessita de KeePassXC-Browser para que a integração funcione corretamente.&lt;br /&gt;Pode descarregar para %1 e %2. %3</translation>
+ <translation>Necessita de KeePassXC-Browser para que a integração funcione corretamente.&lt;br /&gt;Pode descarregar para %1 e para %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>Devolve as credenciais expiradas. Adicionar [expirada] ao título.</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>Permitir devolução de credencias expir&amp;adas.</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Ativar integração com o navegador</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Ainda não temos suporte a navegadores no formato Snap.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>Todas as bases de dados conectadas à extensão devolverão as credenciais coincidentes.</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>Não mostrar janela para que sugere a migração das definições KeePassHTTP legadas.</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>Não perguntar para migrar as &amp;definições KeePassHTTP.</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>Campo Localização do proxy personalizado</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>Navegador para o ficheiro do proxy personalizado</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;Atenção&lt;/b&gt;, a aplicação keepassxc-proxy não foi encontrada!&lt;br /&gt;Verifique o diretório de instalação do KeePassXC ou confirme o caminho nas definições avançadas.&lt;br /&gt;A integração com o navegador não irá funcionar sem esta aplicação.&lt;br /&gt;Caminho esperado: %1</translation>
</message>
</context>
<context>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Este procedimento é necessário para manter as ligações existentes.
Gostaria de migrar agora as definições?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Não mostrar novamente</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Gostaria de migrar agora as definições?</translation>
<translation>Primeiro registo tem nome dos campos</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Número de linhas de cabeçalho a ignorar</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Considerar &apos;\&apos; como carácter de escape</translation>
</message>
@@ -826,12 +971,28 @@ Gostaria de migrar agora as definições?</translation>
<translation>Importação CSV com erros:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation>Qualificação de texto</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>Separação de campos</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>Número de linhas de cabeçalho a desconsiderar</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>Pré-visualização da importação CSV</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n coluna,</numerusform><numerusform>%n coluna(s),</numerusform></translation>
+ <translation><numerusform>%n coluna</numerusform><numerusform>%n colunas</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -867,10 +1028,6 @@ Gostaria de migrar agora as definições?</translation>
<translation>Erro ao ler a base de dados: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Não é possível guardar porque a base de dados não tem nome.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Não é possível escrever no ficheiro porque este foi aberto no modo de leitura.</translation>
</message>
@@ -878,6 +1035,28 @@ Gostaria de migrar agora as definições?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Chave não transformada. Isto é um erro e deve ser reportado aos programadores!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Backup localizado em %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Não foi possível guardar porque a base de dados não indica um ficheiro válido.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Não foi possível guardar porque a base de dados está no modo de leitura.</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>A base de dados tem alterações não guardadas.</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Reciclagem</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1068,14 @@ Gostaria de migrar agora as definições?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Introduza a chave-mestre</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Ficheiro-chave:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Palavra-passe:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Explorar</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Recarregar</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Pergunta de segurança:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Ficheiro-chave no formato legado</translation>
</message>
@@ -943,20 +1106,99 @@ Deve considerar a geração de um novo ficheiro-chave.</translation>
<translation>Selecione o ficheiro-chave</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
+ <translation>Não foi possível abrir o ficheiro chave: %1</translation>
+ </message>
+ <message>
+ <source>Select slot...</source>
+ <translation>Selecionar &apos;slot&apos;</translation>
+ </message>
+ <message>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Desbloquear base de dados do KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Introduza a palavra-passe:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo Palavra-passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da palavra-passe</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>Introduza as credenciais adicionais:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Seleção do ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Procurar ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Explorar...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Recarregar &apos;tokens&apos; de hardware</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Chave de hardware:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Ajuda para a chave de hardware</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
<translation>TouchID para desbloqueio rápido</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Não foi possível abrir a base de dados:
-%1</translation>
+ <source>Clear</source>
+ <translation>Limpar</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Não foi possível abrir o ficheiro-chave:
-%1</translation>
+ <source>Clear Key File</source>
+ <translation>Limpar ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Selecionar ficheiro</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Não foi possível desbloquear e palavra-passe não introduzida</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Não foi possível desbloquear a base de dados e não foi introduzida uma palavra-passe.
+Deseja tentar com uma palavra-passe vazia?
+
+Para impedir que este erro surja novamente, deve aceder a Definições da base de dados -&gt; Segurança para repor a palavra-passe.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Tentar com palavra-passe vazia</translation>
</message>
</context>
<context>
@@ -990,7 +1232,7 @@ Deve considerar a geração de um novo ficheiro-chave.</translation>
</message>
<message>
<source>Browser Integration</source>
- <translation>Integração com navegador</translation>
+ <translation>Integração com o navegador</translation>
</message>
</context>
<context>
@@ -1065,7 +1307,7 @@ Esta ação pode interferir com a ligação ao suplemento.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Removida com sucesso %n chave de cifra das definições do KeePassXC.</numerusform><numerusform>Removidas com sucesso %n chaves de cifra das definições do KeePassXC.</numerusform></translation>
+ <translation><numerusform>%n chave de cifra removida das definições do KeePassXC.</numerusform><numerusform>%n chaves de cifra removidas das definições do KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1111,6 +1353,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Tem a certeza de que deseja atualizar todos os dados legados para a versão mais recente?
Esta atualização é necessária para manter a compatibilidade com o suplemento.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Chaves armazenadas</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Remover chave selecionada</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1231,7 +1481,7 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation>Erro ao transformar a chave com os novos parâmetros KDF; KDF inalterado.</translation>
+ <translation>Não foi possível transformar a chave com os novos parâmetros KDF; KDF inalterado.</translation>
</message>
<message numerus="yes">
<source> MiB</source>
@@ -1241,7 +1491,7 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform> processo</numerusform><numerusform> processos</numerusform></translation>
+ <translation><numerusform>processo</numerusform><numerusform>processos</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1253,6 +1503,57 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Alterar tempo de decifragem</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Tem de decifragem em segundos</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Formato da base de dados</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Algoritmo de cifra</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Função derivação de chave</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>Ciclos de transformação</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Utilização de memória</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Paralelismo</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Entradas expostas</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Não e&amp;xpor esta base de dados</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>Expor entradas existentes neste gr&amp;upo:</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1300,6 +1601,40 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm
<source>Enable &amp;compression (recommended)</source>
<translation>Ativar compr&amp;essão (recomendado)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Campo Nome da base de dados</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Campo Descrição da base de dados</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>Campo Nome de utilizador</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>Número máximo de itens de histórico por entrada</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>Tamanho de histórico por entrada</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Limpar reciclagem</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Tem a certeza de que deseja limpar a reciclagem e o seu conteúdo?
+Esta ação é irreversível.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation>(antiga)</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1365,7 +1700,11 @@ Tem a certeza de que deseja continuar?</translation>
</message>
<message>
<source>Failed to change master key</source>
- <translation>Erro ao alterar a chave-mestre</translation>
+ <translation>Não foi possível alterar a chave-mestre</translation>
+ </message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Continuar sem palavra-passe</translation>
</message>
</context>
<context>
@@ -1378,6 +1717,129 @@ Tem a certeza de que deseja continuar?</translation>
<source>Description:</source>
<translation>Descrição:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>Campo Nome da base de dados</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>Campo Descrição da base de dados</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>Estatísticas</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Passe com o rato por cima das linhas com o erros para mais informações.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valor</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Nome da base de dados</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descrição</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Localização</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>Última gravação</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>Alterações por guardar</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>sim</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>não</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>A base de dados foi modificada mas as alterações ainda não foram guardadas.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>Número de grupos</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>Numero de entradas</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>Número de entradas expiradas</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>A base de dados contém entradas expiradas.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Palavras-passe unívocas </translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>Palavras-passe não unívocas</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>Mais de 10% das palavras-passes foram reutilizadas. Se possível, utilize palavras-passe unívocas.</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>Número máximo de reutilizações</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>Algumas palavras-passe estão a ser utilizadas mais do que 3 vezes. Se possível, utilize palavras-passes unívocas.</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>Número de palavras-passes curtas</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>Recomendamos que utilize palavras-passe com um mínimo de 8 caracteres.</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>Número de palavras-passe fracas</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>Recomendamos que utilize palavras-passe longas e aleatórias e que tenham uma avaliação &apos;boa&apos; ou &apos;excelente&apos;.</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>Tamanho médio das palavras-passe</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 caracteres</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1415,7 +1877,7 @@ Tem a certeza de que deseja continuar?</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
- <translation>Erro ao escrever no ficheiro CSV.</translation>
+ <translation>Não foi possível escrever no ficheiro CSV.</translation>
</message>
<message>
<source>Database creation error</source>
@@ -1428,10 +1890,6 @@ This is definitely a bug, please report it to the developers.</source>
Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>O ficheiro da base de dados não existe ou não pode ser acedido.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Selecionar ficheiro CSV</translation>
</message>
@@ -1454,6 +1912,30 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Apenas leitura]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>Não foi possível abrir %1. Provavelmente não existe ou não pode ser acedida.</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>Exportar base de dados para um ficheiro HTML</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>Ficheiro HTML</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>Não foi possível escrever o ficheiro HTML.</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>Confirmação de exportação</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>Está prestes a exportar a sua base de dados para um ficheiro não cifrado. As suas palavras-passe e informações pessoais ficarão vulneráveis. Tem a certeza de que deseja continuar?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1471,7 +1953,7 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Tem a certeza de que deseja mover %n entrada para a reciclagem?</numerusform><numerusform>Tem a certeza de que deseja mover %n entradas para a reciclagem?</numerusform></translation>
+ <translation><numerusform>Deseja mesmo mover %n entrada para a reciclagem?</numerusform><numerusform>Deseja mesmo mover %n entradas para a reciclagem?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1544,10 +2026,6 @@ Deseja combinar as suas alterações?</translation>
<translation><numerusform>Mover entrada para a reciclagem?</numerusform><numerusform>Mover entradas para a reciclagem?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Ficheiro aberto no modo de leitura.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Bloquear base de dados?</translation>
</message>
@@ -1588,12 +2066,6 @@ Disable safe saves and try again?</source>
Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Erro ao escrever na base de dados:
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Palavras-passe</translation>
</message>
@@ -1611,7 +2083,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>A entrada &quot;%1&quot; tem %2 referência. Deseja substituir as referências com valores, ignorar a entrada ou apagar?</numerusform><numerusform>A entrada &quot;%1&quot; tem %2 referências. Deseja substituir as referências com valores, ignorar a entrada ou apagar?</numerusform></translation>
+ <translation><numerusform>A entrada &quot;%1&quot; tem %2 referência. Deseja substituir as referência com valores, ignorar a entrada ou apagar?</numerusform><numerusform>A entrada &quot;%1&quot; tem %2 referências. Deseja substituir as referências com valores, ignorar a entrada ou apagar?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1637,6 +2109,14 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Shared group...</source>
<translation>Grupo partilhado...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Não foi possível escrever na base de dados: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>Esta base de dados está aberta no modo de leitura. Não é possível guardar as alterações.</translation>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1686,7 +2166,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>Erro ao abrir a chave privada</translation>
+ <translation>Não foi possível abrir a chave privada</translation>
</message>
<message>
<source>Entry history</source>
@@ -1756,6 +2236,18 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Confirm Removal</source>
<translation>Confirmação de remoção</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integração com o navegador</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>Tem a certeza de que deseja remover este URL?</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1795,6 +2287,42 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Background Color:</source>
<translation>Cor secundária:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>Seleção de atributo</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>Valor do atributo</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>Adicionar novo atributo</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>Remover atributo selecionado</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>Editar nome do atributo</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>Alternar proteção do atributo</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>Mostrar atributo protegido</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>Cor principal</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>Cor secundária</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1830,6 +2358,77 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Utilizar sequência específica para esta associação:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>Sequência personalizada de escrita automática</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>Abrir pagina de ajuda sobre escrita automática</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>Associações de janela existentes</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>Adicionar nova associação de janela</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>Remover associação de janela selecionada</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>Pode utilizar um asterisco (*) para correspondência global</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>Definir título de associação da janela</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>Pode utilizar um asterisco para correspondência global</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>Sequência personalizada de escrita automática para esta janela</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>Estas definições afetam o comportamento da entrada com a extensão do navegador.</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Geral</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>Ignorar submissão automática par esta entrada</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>Ocultar esta entrada da extensão do navegador</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>URL(s) extra </translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Adicionar</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remover</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Editar</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2448,26 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Delete all</source>
<translation>Apagar tudo</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>Seleção de histórico de entradas</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>Mostrar entrada num estado do histórico</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>Restaurar entrada para um valor do histórico</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>Apagar estado do histórico selecionado</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>Apagar todo o histórico</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2507,62 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Expires</source>
<translation>Expira</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>Campo URL</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Descarregar &apos;favicon&apos; para o URL</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Campo Repetição de palavra-passe</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Alternar gerador de palavras-passe</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo Palavra-passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da palavra-passe</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>Alternar visibilidade das notas</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Campo Expira</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>Predefinições de expiração</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>Predefinições de expiração</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo Notas</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>Campo Título</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>Campo Nome de utilizador</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Alternar expiração</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1946,7 +2621,7 @@ Desativar salvaguardas e tentar novamente?</translation>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Procurar...</translation>
+ <translation>Explorar...</translation>
</message>
<message>
<source>Attachment</source>
@@ -1964,6 +2639,22 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Solicitar confirmação para utilizar esta chave</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>Remover chave do agente após os segundos definidos</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>Explorador para ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>Ficheiro-chave externo</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>Selecionar anexo</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1999,6 +2690,10 @@ Desativar salvaguardas e tentar novamente?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Herdar do grupo (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>A entrada tem alterações por guardar</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,69 +2722,98 @@ Desativar salvaguardas e tentar novamente?</translation>
<translation>Inativo</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importar do caminho</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Contentor KeeShare não assinado</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportar para o caminho</translation>
+ <source>KeeShare signed container</source>
+ <translation>Contentor KeeShare assinado</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Sincronizar com o caminho</translation>
+ <source>Select import source</source>
+ <translation>Selecione a origem da importação</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>A sua versão do KeePassXC não tem suporte a partilha do tipo de contentor.
-Por favor utilize %1.</translation>
+ <source>Select export target</source>
+ <translation>Selecione o destino da exportação</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>A partilha da base de dados está desativada</translation>
+ <source>Select import/export file</source>
+ <translation>Selecione o ficheiro de importação/exportação</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>A exportação da base de dados está desativada</translation>
+ <source>Clear</source>
+ <translation>Limpar</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>A importação da base de dados está desativada</translation>
+ <source>Import</source>
+ <translation>Importar</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Contentor KeeShare não assinado</translation>
+ <source>Export</source>
+ <translation>Exportar</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Contentor KeeShare assinado</translation>
+ <source>Synchronize</source>
+ <translation>Sincronizar</translation>
</message>
<message>
- <source>Select import source</source>
- <translation>Selecione a origem da importação</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>A sua versão de KeePasXC não tem suporte a partilha deste tipo de contentor. As extensões suportadas são: %1</translation>
</message>
<message>
- <source>Select export target</source>
- <translation>Selecione o destino da exportação</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Selecione o ficheiro de importação/exportação</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Limpar</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare está desativada. Pode ativar a importação/exportação nas definições.</translation>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>As suas definições não permitem exportação de bases de dados.</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>As suas definições não permitem importação de bases de dados.</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>Campo Modo de partilha</translation>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation>Caminho para o campo ficheiro de partilha</translation>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation>Explorador para o ficheiro de partilha</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo Palavra-passe</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>O contentor de exportação %1 já está referenciado.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da palavra-passe</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>O contentor de importação %1 já está referenciado.</translation>
+ <source>Toggle password generator</source>
+ <translation>Alternar gerador de palavras-passe</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Erro ao exportar. A partilha %1 está a ser importada por outro grupo.</translation>
+ <source>Clear fields</source>
+ <translation>Limpar campos</translation>
</message>
</context>
<context>
@@ -2122,6 +2846,34 @@ Por favor utilize %1.</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Definir se&amp;quência padrão para escrita automática</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>Campo Nome</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>Campo Notas</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>Alternar expiração</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>Alternar escrita automática para este grupo e sub-grupos.</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>Campo Expira</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2158,28 +2910,16 @@ Por favor utilize %1.</translation>
<translation>Todos os ficheiros</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Já existe um ícone personalizado</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirmação de eliminação</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Ícone personalizado descarregado com sucesso</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Dica: pode ativar o serviço DuckDuckGo como recurso em Ferramentas -&gt; Definições -&gt; Segurança</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Selecionar imagens</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>%1 de %n ícones carregado com sucesso.</numerusform><numerusform>%1 de %n ícones carregados com sucesso.</numerusform></translation>
+ <translation><numerusform>%1 de %n ícone carregados com sucesso.</numerusform><numerusform>%1 de %n ícones carregados com sucesso.</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2191,12 +2931,48 @@ Por favor utilize %1.</translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>O ícone seguinte falhou:</numerusform><numerusform>Os ícones seguintes falharam:</numerusform></translation>
+ <translation><numerusform>Falha no seguinte ícone:</numerusform><numerusform>Falha nos seguintes ícones:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Este ícone é utilizado por % entrada e será substituído pelo ícone padrão. Tem a certeza de que deseja apagar o ícone?</numerusform><numerusform>Este ícone é utilizado por % entradas e será substituído pelo ícone padrão. Tem a certeza de que deseja apagar o ícone?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>Pode ativar o serviço DuckDuckGo em Ferramentas -&gt; Definições -&gt; Segurança</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>Descarregar &apos;favicon&apos; para o URL</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>Aplicar ícone aos sub-grupos e entradas</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>Aplicar ícone &amp;a...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>Aplicar apenas a este</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>Aplicar aos grupos dependentes</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>Aplicar às entradas dependentes</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>Aplicar também aos dependentes</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>Selecionou um ícone existente.</translation>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2242,6 +3018,30 @@ Esta ação pode implicar um funcionamento errático.</translation>
<source>Value</source>
<translation>Valor</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation>Data/hora de criação</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>Data/hora de modificação</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>Data/hora de acesso</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>ID unívoca</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>Dados do suplemento</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>Remover dados do suplemento selecionado</translation>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2338,6 +3138,26 @@ Esta ação pode implicar um funcionamento errático.</translation>
%1</numerusform><numerusform>Não foi possível abrir os ficheiros:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Anexos</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>Adicionar novo anexo</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>Remover anexo selecionado</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>Abrir anexo selecionado</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>Guardar anexo selecionado para o disco</translation>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2432,10 +3252,6 @@ Esta ação pode implicar um funcionamento errático.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>A gerar token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Fechar</translation>
</message>
@@ -2453,7 +3269,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
<message>
<source>Expiration</source>
- <translation>Expira</translation>
+ <translation>Expiração</translation>
</message>
<message>
<source>URL</source>
@@ -2520,6 +3336,14 @@ Esta ação pode implicar um funcionamento errático.</translation>
<source>Share</source>
<translation>Partilhar</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>Mostrar valor TOTP atual</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avançado</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2553,11 +3377,33 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Reciclagem</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>Não foi possível registar o serviço DBus em %1: já existe um serviço em execução.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo Secret Service: %1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2576,6 +3422,59 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>Descarregar &apos;favicons&apos;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>Problemas para descarregar ícones?
+Pode ativar o serviço DuckDuckGo na secção &apos;Segurança&apos; das definições.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Estado</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>Por favor aguarde...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>A descarregar...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Aceitar</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>Já existe</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>Falha ao descarregar</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>A descarregar (%1/%2)...</translation>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2597,10 +3496,6 @@ Esta ação pode implicar um funcionamento errático.</translation>
<translation>Não foi possível emitir a pergunta de segurança.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chave errada ou base de dados danificada.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>cabeçalhos em falta da base de dados</translation>
</message>
@@ -2620,6 +3515,11 @@ Esta ação pode implicar um funcionamento errático.</translation>
<source>Invalid header data length</source>
<translation>Comprimento dos dados de cabeçalho inválido</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2651,10 +3551,6 @@ Esta ação pode implicar um funcionamento errático.</translation>
<translation>Disparidade no cabeçalho SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Chave errada ou base de dados danificada (disparidade HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Cifra desconhecida</translation>
</message>
@@ -2672,7 +3568,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
- <translation>Erro ao processar os parâmetros KDF no cabeçalho</translation>
+ <translation>Não foi possível processar os parâmetros KDF no cabeçalho</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
@@ -2754,6 +3650,15 @@ Esta ação pode implicar um funcionamento errático.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Tamanho inválido do tipo de campo da variante do mapa</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(Disparidade HMAC)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2773,7 +3678,7 @@ Esta ação pode implicar um funcionamento errático.</translation>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>Erro ao serializar os parâmetros KDF da variante do mapa</translation>
+ <translation>Não foi possível serializar os parâmetros KDF da variante do mapa</translation>
</message>
</context>
<context>
@@ -2849,7 +3754,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
<name>KdbxXmlReader</name>
<message>
<source>XML parsing failure: %1</source>
- <translation>Erro ao processar o XML: %1</translation>
+ <translation>Não foi possível processar o XML: %1</translation>
</message>
<message>
<source>No root group</source>
@@ -2873,7 +3778,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>Invalid group icon number</source>
- <translation>Número inválido no ícone de grupo</translation>
+ <translation>Número inválido de ícone de grupo</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
@@ -2889,11 +3794,11 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>UUID nulo em DeleteObject</translation>
+ <translation>UUID de DeleteObject nulo</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
- <translation>Tempo ou UUID em falta para DeletedObject</translation>
+ <translation>Tempo ou UUID de DeletedObject em falta</translation>
</message>
<message>
<source>Null entry uuid</source>
@@ -2909,7 +3814,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>No entry uuid found</source>
- <translation>Não foi encontrado o UUID da entrada</translation>
+ <translation>Não foi encontrada uma entrada UUID</translation>
</message>
<message>
<source>History element with different uuid</source>
@@ -2976,13 +3881,13 @@ Linha %2, coluna %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importar base de dados do KeePass 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Não foi possível abrir a base de dados.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>Importar base de dados do KeePass 1</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3021,7 +3926,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Tamanho inválido na semente de transformação</translation>
+ <translation>Tamanho inválido da semente de transformação</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
@@ -3040,12 +3945,8 @@ Linha %2, coluna %3</translation>
<translation>Não foi possível calcular a chave-mestre</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Chave errada ou base de dados danificada.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
- <translation>Erro ao transformar a chave</translation>
+ <translation>Não foi possível transformar a chave</translation>
</message>
<message>
<source>Invalid group field type number</source>
@@ -3139,40 +4040,57 @@ Linha %2, coluna %3</translation>
<source>unable to seek to content position</source>
<translation>Não foi possível pesquisar no conteúdo</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Partilha desativada</translation>
+ <source>Invalid sharing reference</source>
+ <translation>Referência de partilha inválida</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Importar de</translation>
+ <source>Inactive share %1</source>
+ <translation>Partilha %1 inativa</translation>
</message>
<message>
- <source>Export to</source>
- <translation>Exportar para</translation>
+ <source>Imported from %1</source>
+ <translation>Importada de %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation>Exportada para %1</translation>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation>Sincronizada com %1</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Sincronizar com</translation>
+ <source>Import is disabled in settings</source>
+ <translation>A importação está desativada nas definições</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Desativar partilha %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation>A exportação está desativada nas definições</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importar da partilha %1</translation>
+ <source>Inactive share</source>
+ <translation>Partilha inativa</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportar para a partilha %1</translation>
+ <source>Imported from</source>
+ <translation>Importada de</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Sincronizar com a partilha %1</translation>
+ <source>Exported to</source>
+ <translation>Exportada para</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>Sincronizada com</translation>
</message>
</context>
<context>
@@ -3217,10 +4135,6 @@ Linha %2, coluna %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Explorar</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Gerar</translation>
</message>
@@ -3234,7 +4148,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Legacy key file format</source>
- <translation>Formato legado de ficheiro-chave</translation>
+ <translation>Ficheiro-chave no formato legado</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
@@ -3276,6 +4190,44 @@ Mensagem: %2</translation>
<source>Select a key file</source>
<translation>Selecione o ficheiro-chave</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Seleção do ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Procurar ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Explorar...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>Gerar um novo ficheiro-chave</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>AVISO: Não utilize um ficheiro que possa ser alterado pois poderá deixará de conseguir desbloquear a sua base de dados!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>Ficheiro-chave inválido</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>Não pode utilizar o ficheiro da base de dados atual como ficheiro-chave. Escolha um ficheiro diferente ou crie um novo ficheiro-chave.</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>Ficheiro-chave suspeito</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>Parece que o ficheiro-chave utilizado é um ficheiro de uma base de dados. Deve utilizar um ficheiro estático ou deixará de conseguir aceder à sua base de dados.
+Tem a certeza de que deseja utilizar este ficheiro? </translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3364,10 +4316,6 @@ Mensagem: %2</translation>
<translation>Definiçõe&amp;s</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Gerador de palavras-passe</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>B&amp;loquear bases de dados</translation>
</message>
@@ -3554,14 +4502,6 @@ Recomendamos que utilize a versão AppImage disponível no nosso site.</translat
<translation>Mostrar código QR TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Procurar atualizações...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Partilhar entrada</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOTA: está a utilizar uma versão de teste do KeePassXC!
@@ -3579,6 +4519,74 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>You can always check for updates manually from the application menu.</source>
<translation>Também pode verificar se existem atualizações através do menu da aplicação.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Exportar</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>Pro&amp;curar atualizações...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>Descarreg&amp;ar tos os &apos;favicon&apos;</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>De &amp;A-Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>De &amp;Z-A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>Gerador de &amp;palavras-passe</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Descarregar &apos;favicon&apos;</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>&amp;Exportar para ficheiro HTML...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>Cofre 1Password</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>Importar um cofre 1Password</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>&amp;Iniciação</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>Abrir guia de iniciação em PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>Ajuda &amp;online...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>Ir para a ajuda online (no navegador web)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>Guia de &amp;utilizador</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>Abrir guia de utilizador em PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>Atal&amp;hos do teclado</translation>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3638,12 +4646,20 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Adding missing icon %1</source>
<translation>Adicionar ícone em falta %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>Dados personalizados removidos %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>A adicionar dados personalizados %1 [%2]</translation>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation>Criar uma nova base de dados do KeePassXC...</translation>
+ <translation>A criar uma nova base de dados do KeePassXC...</translation>
</message>
<message>
<source>Root</source>
@@ -3708,6 +4724,72 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>OpData01 inválido porque não tem um cabeçalho.</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>Não foi possível ler todos os bytes IV, necessita 16 e obteve %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>Não foi possível iniciar a cifra para OpData01: %1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>Não foi possível ler todos os bytes da assinatura HMAC</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>Tem que existir um diretório .opvault</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>O diretório .opvault tem que ser legível</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>Tem que existir o diretório .opvault/default</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>O diretório .opvault/default tem que ser legível</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>Não foi possível descodificar a chave-mestre: %1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>Não foi possível derivar a chave-mestre: %1</translation>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3719,7 +4801,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Base64 decoding failed</source>
- <translation>Erro de descodificação Base64</translation>
+ <translation>Falha de descodificação Base64</translation>
</message>
<message>
<source>Key file way too small.</source>
@@ -3735,11 +4817,11 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Failed to read public key.</source>
- <translation>Erro ao ler a chave pública.</translation>
+ <translation>Não foi possível ler a chave pública.</translation>
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation>Ficheiro danificado, erro ao ler a chave privada</translation>
+ <translation>Ficheiro danificado, não foi possível ler a chave privada</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
@@ -3755,11 +4837,11 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation>Erro na derivação da chave, ficheiro-chave danificado?</translation>
+ <translation>Falha na derivação da chave, ficheiro-chave danificado?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation>Erro ao decifrar, frase-chave errada?</translation>
+ <translation>Falha ao decifrar, frase-chave errada?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
@@ -3807,6 +4889,17 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>Disparidade nas palavras-passe</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3832,6 +4925,22 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Generate master password</source>
<translation>Gerar palavra-passe principal</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Campo Palavra-passe</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da palavra-passe</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>Campo Repetição de palavra-passe</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>Alternar gerador de palavras-passe</translation>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3861,22 +4970,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Tipos de caracteres</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Letras maiúsculas</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Letras minúsculas</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Números</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caracteres especiais</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>ASCII expandido</translation>
</message>
@@ -3957,18 +5054,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Avançado</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Letras maiúsculas de A até F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Letras minúsculas de A até F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4001,18 +5090,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matemática</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Traços</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4060,6 +5141,74 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Regenerate</source>
<translation>Recriar</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation>Palavra-passe gerada</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>Letras maiúsculas</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>Letras minúsculas</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>Caracteres especiais</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>Símbolos matemáticos</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>Traços e travessões</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>Caracteres excluídos</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>Palavras-passe Hex</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>Tamanho da palavra-passe</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>Recriar palavra-passe</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Copiar senha</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>Aceitar palavra-passe</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>minúsculas</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>MAIÚSCULAS</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>Primeira Letra Em Maiúscula</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Alternar visibilidade da palavra-passe</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4067,12 +5216,9 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Selecionar</translation>
+ <source>Statistics</source>
+ <translation>Estatísticas</translation>
</message>
</context>
<context>
@@ -4109,6 +5255,10 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<source>Merge</source>
<translation>Combinar</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4134,7 +5284,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>KeePassXC association failed, try again</source>
- <translation>Erro ao associar o KeePassXC. Tente novamente.</translation>
+ <translation>Não foi possível associar KeePassXC. Tente novamente.</translation>
</message>
<message>
<source>Encryption key is not recognized</source>
@@ -4201,10 +5351,6 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Gerar palavra-passe para a entrada.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Tamanho da palavra-passe gerada.</translation>
- </message>
- <message>
<source>length</source>
<translation>tamanho</translation>
</message>
@@ -4254,18 +5400,6 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<translation>Executar análise avançada da palavra-passe.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Extrair e mostrar o conteúdo da base de dados.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Caminho da base de dados a extrair.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Introduza a palavra-passe para desbloquear %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4310,10 +5444,6 @@ Comandos disponíveis:
<translation>Combinar duas bases de dados.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Caminho da base de dados de destino da combinação.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Caminho da base de dados de origem da combinação.</translation>
</message>
@@ -4387,11 +5517,7 @@ Comandos disponíveis:
</message>
<message>
<source>Browser Integration</source>
- <translation>Integração com navegador</translation>
- </message>
- <message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Pergunta de segurança - Slot %2 - %3</translation>
+ <translation>Integração com o navegador</translation>
</message>
<message>
<source>Press</source>
@@ -4424,10 +5550,6 @@ Comandos disponíveis:
<translation>Gerar nova palavra-passe aleatória.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Valor inválido para o tamanho da palavra-passe %1</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Não foi possível criar a entrada com o caminho %1</translation>
</message>
@@ -4437,7 +5559,7 @@ Comandos disponíveis:
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation>Erro ao escrever na base de dados %1.</translation>
+ <translation>Não foi possível escrever na base de dados %1.</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
@@ -4485,10 +5607,6 @@ Comandos disponíveis:
<translation>número</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Valor inválido para o tamanho da palavra-passe: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Não foi possível encontrar a entrada com o caminho %1.</translation>
</message>
@@ -4502,7 +5620,7 @@ Comandos disponíveis:
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation>Erro ao escrever na base de dados: %1</translation>
+ <translation>Não foi possível escrever na base de dados: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
@@ -4610,27 +5728,7 @@ Comandos disponíveis:
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation>Erro ao carregar o ficheiro-chave %1: %2</translation>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation>%1 não existe.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Não foi possível abrir o ficheiro %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Erro ao ler a base de dados:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Erro ao analisar a base de dados:
-%1</translation>
+ <translation>Não foi possível carregar o ficheiro-chave %1: %2</translation>
</message>
<message>
<source>Length of the generated password</source>
@@ -4645,10 +5743,6 @@ Comandos disponíveis:
<translation>Utilizar letras maiúsculas</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Utilizar números</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Utilizar caracteres especiais</translation>
</message>
@@ -4700,7 +5794,7 @@ Comandos disponíveis:
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation>A entrada %1 foi eliminada.</translation>
+ <translation>A entrada %1 foi apagada.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
@@ -4762,7 +5856,7 @@ Comandos disponíveis:
</message>
<message>
<source>Message encryption failed.</source>
- <translation>Erro ao cifrar a mensagem.</translation>
+ <translation>Não foi possível cifrar a mensagem.</translation>
</message>
<message>
<source>No groups found</source>
@@ -4786,17 +5880,13 @@ Comandos disponíveis:
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation>Não foi possível criar a base de dados: %1.</translation>
+ <translation>Não foi possível guardar a base de dados: %1.</translation>
</message>
<message>
<source>Successfully created new database.</source>
<translation>A base de dados foi criada com sucesso.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Introduza a palavra-passe para cifrar a base de dados (prima Enter para não cifrar):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Não foi possível criar o ficheiro-chave %1: %2</translation>
</message>
@@ -4805,10 +5895,6 @@ Comandos disponíveis:
<translation>Não foi possível carregar o ficheiro-chave %1: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Remover uma entrada da base de dados.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Caminho da entrada a remover.</translation>
</message>
@@ -4864,6 +5950,330 @@ Comandos disponíveis:
<source>Cannot create new group</source>
<translation>Não foi possível criar o novo grupo</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>Mostra a informação de depuração.</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Versão %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Tipo de compilação: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revisão: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribuição: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>Modo de depuração desativado.</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>Modo de depuração ativado.</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistema operativo: %1
+Arquitetura do CPU: %2
+Kernel: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Escrita automática</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (partilha assinada e não assinada)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (apenas partilha assinada)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (apenas partilha não assinada)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nada</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Extensões ativas:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>Bibliotecas de criptografia:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>Adiciona um novo grupo à base de dados.</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>Caminho do grupo a adicionar.</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>O grupo %1 já existe!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>Grupo %1 não encontrado!</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>Grupo %1 adicionado com sucesso.</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>Nome do ficheiro</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>Analisar qualidade e problemas das palavras-passe.</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>Não foi possível abrir o ficheiro HIBP %1: %2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>A avaliar as entradas da base de dados com o ficheiro HIBP, por favor aguarde...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>Fechar a base de dados aberta.</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>Mostrar esta ajuda.</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>A lista de palavras é muito pequena (&lt; 1000 itens)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>Sair do modo interativo.</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>Não foi possível exportar a base de dados para o formato XML: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>Formato não suportado: %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>Utilizar números</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>Tamanho inválido %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>Mostrar ajuda para comandos.</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>Comandos disponíveis:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>Importar conteúdo de uma base de dados no formato XML.</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>Caminho da nova base de dados.</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>Base de dados importada com sucesso.</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>Comando desconhecido - %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>A base de dados não foi modificada pela combinação.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>Move uma entrada para outro grupo.</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>Caminho da entrada a mover.</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>Caminho do grupo de destino.</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>Não foi possível encontrar o grupo no caminho %1.</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>O grupo %1 já possui esta entrada.</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>Entrada %1 movida com sucesso para o grupo %2.</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>Abrir base de dados.</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>Caminho do grupo a remover.</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>Grupo %1 enviado para a reciclagem</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>O gripo %1 foi apagado.</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>Não foi possível abrir %1: ficheiro não encontrado</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>Não foi possível abrir %1: não é um ficheiro simples</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>Não foi possível abrir %1: ficheiro não legível</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>Introduza a palavra-passe para desbloquear %1:</translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>Toque no botão da sua YubiKey para desbloquear %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>Introduza a palavra-passe para cifrar a base de dados (opcional):</translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>Ficheiro HIBP, linha %1: erro ao processar</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>Integração &apos;Secret Service&apos;</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>Nome de utilizador</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] Pergunta de segurança - Slot %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5018,6 +6428,93 @@ Comandos disponíveis:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>Opções</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>Ativar integração Freedesktop.org Secret Service no KeepassXC</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Geral</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>Mostrar notificação se as credenciais forem solicitadas</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Se ativar a Reciclagem para esta base de dados, as entradas apagadas serão movidas mas não apagadas. Se não a utilizar, as entradas serão apagadas sem qualquer confirmação.&lt;/p&gt;&lt;p&gt;Contudo, se as entradas apagadas forem referenciadas por outras, será mostrado um aviso.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>Não confirmar se as entradas forem apagadas nos clientes.</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>Grupos expostos:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>Nome do ficheiro</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupo</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>Gerir</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>Autorização</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>Estas aplicações estão conectadas:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Aplicação</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>Desconectar</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Definições da base de dados</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>Editar definições da base de dados</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Desbloquear base de dados</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>Desbloquear base de dados para mostrar mais informação</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Bloquear base de dados</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>Desbloquear para mostrar</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nada</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5140,9 +6637,100 @@ Comandos disponíveis:
<source>Signer:</source>
<translation>Signatário:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>Permitir importação KeeShare</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>Permitir exportação KeeShare</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>Mostrar apenas avisos e erros</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Chave</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>Campo Nome do signatário</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>Gerar novo certificado</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>Importar certificado</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>Exportar o meu certificado</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>Partilhas conhecidas</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>Confiar no certificado selecionado</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>Perguntar sempre pela fiabilidade do certificado selecionado</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>Deixar de confiar no certificado selecionado</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>Remover certificado selecionado</translation>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>A substituição de contentor de partilha não assinado não é suportada - exportação evitada</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Não foi possível escrever contentor de exportação (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Assinatura não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Assinatura não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Base de dados não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Base de dados não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>A substituição de contentor de partilha assinado não é suportada - exportação evitada</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Não foi possível escrever o contentor de exportação</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Ocorreu um erro inesperado ao exportar</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Importar de um contentor sem assinatura</translation>
@@ -5156,6 +6744,10 @@ Comandos disponíveis:
<translation>Importar de um contentor com certificado</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Deseja confiar em %1 com a impressão digital de %2 em %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Agora não</translation>
</message>
@@ -5172,18 +6764,6 @@ Comandos disponíveis:
<translation>Apenas agora</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Não foi possível importar %1 (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>%1 foi importada com sucesso (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importada de %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>O contentor de partilha assinado não é suportado - importação evitada</translation>
</message>
@@ -5223,25 +6803,20 @@ Comandos disponíveis:
<source>Unknown share container type</source>
<translation>Tipo de contentor de partilha desconhecido</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>A substituição de contentor de partilha não assinado não é suportada - exportação evitada</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Não foi possível escrever contentor de exportação (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>A substituição de contentor de partilha assinado não é suportada - exportação evitada</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Não foi possível importar %1 (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Não foi possível escrever o contentor de exportação</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>%1 foi importada com sucesso (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Ocorreu um erro inesperado ao exportar</translation>
+ <source>Imported from %1</source>
+ <translation>Importada de %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5256,10 +6831,6 @@ Comandos disponíveis:
<translation>Exportar para %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Deseja confiar em %1 com a impressão digital de %2 em %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Diversos caminhos de importação para %1 em %2</translation>
</message>
@@ -5267,22 +6838,6 @@ Comandos disponíveis:
<source>Conflicting export target path %1 in %2</source>
<translation>Conflito no caminho de exportação para %1 em %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Assinatura não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Assinatura não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Base de dados não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Base de dados não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5300,7 +6855,7 @@ Comandos disponíveis:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Expira em &lt;b&gt;%n&lt;/b&gt; segundo</numerusform><numerusform>Expira em &lt;b&gt;%n&lt;/b&gt; segundos</numerusform></translation>
+ <translation><numerusform>Expira em &lt;b&gt;%n&lt;/b&gt; segundo</numerusform><numerusform>Expira dentro de &lt;b&gt;%n&lt;/b&gt; segundos</numerusform></translation>
</message>
</context>
<context>
@@ -5330,10 +6885,6 @@ Comandos disponíveis:
<translation>Configurar TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Chave:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Definições padrão do token RFC 6238</translation>
</message>
@@ -5363,16 +6914,45 @@ Comandos disponíveis:
<translation>Tamanho do código:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 dígitos</translation>
+ <source>Secret Key:</source>
+ <translation>Chave secreta:</translation>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation>A chave secreta tem que estar no formato Base32</translation>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation>Campo Chave secreta</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritmo:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7 dígitos</translation>
+ <source> digits</source>
+ <translation>dígitos</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 dígitos</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation>TOTP secreta inválida</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>Introduziu uma chave secreta inválida. A chave tem que estar no formato Base32. Exemplo: JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>Confirmar remoção das definições TOTP</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>Tem a certeza de que deseja remover as definições TOTP para esta entrada?</translation>
</message>
</context>
<context>
@@ -5419,7 +6999,7 @@ Comandos disponíveis:
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation>Está atualizado!</translation>
+ <translation>A sua versão está atualizada!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
@@ -5456,6 +7036,14 @@ Comandos disponíveis:
<source>Welcome to KeePassXC %1</source>
<translation>Bem-vindo ao KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>Importar de 1Password</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>Abrir uma base de dados recente</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5479,5 +7067,13 @@ Comandos disponíveis:
<source>No YubiKey inserted.</source>
<translation>Youbikey não inserida.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Recarregar &apos;tokens&apos; de hardware</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_ro.ts b/share/translations/keepassx_ro.ts
index c6dfda993..826286377 100644
--- a/share/translations/keepassx_ro.ts
+++ b/share/translations/keepassx_ro.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC este distribuit în conformitate cu termenii GNU General Public License (GPL) versiunea 2 sau (la opțiunea dumneavoastră) versiunea 3.</translation>
</message>
<message>
<source>Contributors</source>
@@ -23,7 +23,7 @@
</message>
<message>
<source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;Vezi contibuțiile pe GitHub&lt;/a&gt;</translation>
+ <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;Vezi contribuțiile pe GitHub&lt;/a&gt;</translation>
</message>
<message>
<source>Debug Info</source>
@@ -38,80 +38,12 @@
<translation>Copiază în clipboard</translation>
</message>
<message>
- <source>Revision: %1</source>
- <translation>Revizie: %1</translation>
- </message>
- <message>
- <source>Distribution: %1</source>
- <translation>Distribuție: %1</translation>
- </message>
- <message>
- <source>Libraries:</source>
- <translation>Librării:</translation>
- </message>
- <message>
- <source>Operating system: %1
-CPU architecture: %2
-Kernel: %3 %4</source>
- <translation>Sistem de operare: %1
-Arhitectura procesor (CPU): %2
-Nucleu (Kernel): %3 %4</translation>
- </message>
- <message>
- <source>Enabled extensions:</source>
- <translation>Extensii activate:</translation>
- </message>
- <message>
<source>Project Maintainers:</source>
- <translation type="unfinished"/>
+ <translation>Mentenanții proiectului:</translation>
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Version %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Build Type: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Auto-Type</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Browser Integration</source>
- <translation>Integrare cu browserul</translation>
- </message>
- <message>
- <source>SSH Agent</source>
- <translation>Agent SSH</translation>
- </message>
- <message>
- <source>YubiKey</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>TouchID</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>None</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>KeeShare (signed and unsigned sharing)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>KeeShare (only signed sharing)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>KeeShare (only unsigned sharing)</source>
- <translation type="unfinished"/>
+ <translation>Mulțumiri speciale de la echipa KeePassXC Du-te la debfx pentru crearea KeePassX original.</translation>
</message>
</context>
<context>
@@ -122,7 +54,7 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
- <translation type="unfinished"/>
+ <translation>Folositi OpenSSH pentru Windows in loc de Pageant</translation>
</message>
</context>
<context>
@@ -141,26 +73,34 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Access error for config file %1</source>
- <translation type="unfinished"/>
+ <translation>Eroare de acces pentru fisier de configurare %1</translation>
</message>
<message>
<source>Icon only</source>
- <translation type="unfinished"/>
+ <translation>Numai iconita</translation>
</message>
<message>
<source>Text only</source>
- <translation type="unfinished"/>
+ <translation>Numai text</translation>
</message>
<message>
<source>Text beside icon</source>
- <translation type="unfinished"/>
+ <translation>Text linga iconita</translation>
</message>
<message>
<source>Text under icon</source>
- <translation type="unfinished"/>
+ <translation>text sub iconita</translation>
</message>
<message>
<source>Follow style</source>
+ <translation>Urmareste stil</translation>
+ </message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -172,43 +112,31 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Startup</source>
- <translation type="unfinished"/>
+ <translation>Pornire</translation>
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remember last databases</source>
- <translation>Memorează ultimele baze de date</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation type="unfinished"/>
+ <translation>Start numai o singură instanță de KeePassXC</translation>
</message>
<message>
<source>Minimize window at application startup</source>
- <translation type="unfinished"/>
+ <translation>Minimizare fereastră la pornirea aplicației</translation>
</message>
<message>
<source>File Management</source>
- <translation type="unfinished"/>
+ <translation>Gestionare fișiere</translation>
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
- <translation type="unfinished"/>
+ <translation>Salvați în condiții de siguranță fișierele bazei de date (pot fi incompatibile cu Dropbox, etc)</translation>
</message>
<message>
<source>Backup database file before saving</source>
- <translation type="unfinished"/>
+ <translation>Fă copie de rezervă fișierului bazei de date înainte de salvare</translation>
</message>
<message>
<source>Automatically save after every change</source>
- <translation type="unfinished"/>
+ <translation>Salvare automată după fiecare modificare</translation>
</message>
<message>
<source>Automatically save on exit</source>
@@ -216,27 +144,23 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Don&apos;t mark database as modified for non-data changes (e.g., expanding groups)</source>
- <translation type="unfinished"/>
+ <translation>Nu marcați baza de date modificată pentru modificări non-date (de exemplu, grupuri în expansiune)</translation>
</message>
<message>
<source>Automatically reload the database when modified externally</source>
- <translation type="unfinished"/>
+ <translation>Reîncărcați automat baza de date atunci când este modificată extern</translation>
</message>
<message>
<source>Entry Management</source>
- <translation type="unfinished"/>
+ <translation>Managementul inregistrarii</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Minimize when copying to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Utilizarea pictogramei grupului la crearea inregistrarii</translation>
</message>
<message>
<source>Hide the entry preview panel</source>
- <translation type="unfinished"/>
+ <translation>Ascundere panou previzualizare inregistrarii</translation>
</message>
<message>
<source>General</source>
@@ -244,51 +168,47 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Hide toolbar (icons)</source>
- <translation type="unfinished"/>
+ <translation>Ascundere bară de instrumente (pictograme)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
- <translation type="unfinished"/>
+ <translation>Minimizare în locul ieșirii aplicației</translation>
</message>
<message>
<source>Show a system tray icon</source>
- <translation type="unfinished"/>
+ <translation>Afișare pictogramă tavă de sistem</translation>
</message>
<message>
<source>Dark system tray icon</source>
- <translation type="unfinished"/>
+ <translation>Pictograma umbra barei de sistem </translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Language</source>
- <translation>Limbă</translation>
+ <translation>Ascundere fereastră în tava de sistem atunci când este minimizată</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Auto tiparire</translation>
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Utilizarea titlului inregistrarii pentru a se potrivi cu ferestrele pentru auto-tiparire globala</translation>
</message>
<message>
<source>Use entry URL to match windows for global Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Utilizați URL-ul din inregistrare pentru a se potrivi Windows pentru autotiparire globala</translation>
</message>
<message>
<source>Always ask before performing Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Întrebați întotdeauna înainte de a efectua auto-tiparire</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
- <translation type="unfinished"/>
+ <translation>Comandă rapidă pentru autotiparire globala</translation>
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation type="unfinished"/>
+ <translation>Întârzierea tastării autotiparirei</translation>
</message>
<message>
<source> ms</source>
@@ -297,22 +217,103 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Auto-Type start delay</source>
+ <translation>întârziere inceputuui auto-tiparii</translation>
+ </message>
+ <message>
+ <source>Movable toolbar</source>
+ <translation>Bara de instrumente mobila</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates at application startup</source>
+ <source>Load previously open databases on startup</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
+ <source>Remember database key files and security dongles</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sec</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
<translation type="unfinished"/>
</message>
</context>
@@ -320,7 +321,7 @@ Nucleu (Kernel): %3 %4</translation>
<name>ApplicationSettingsWidgetSecurity</name>
<message>
<source>Timeouts</source>
- <translation type="unfinished"/>
+ <translation>Timeout</translation>
</message>
<message>
<source>Clear clipboard after</source>
@@ -333,15 +334,15 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
- <translation type="unfinished"/>
+ <translation>Blocarea bazelor de date după inactivitatea</translation>
</message>
<message>
<source> min</source>
- <translation type="unfinished"/>
+ <translation>Min</translation>
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation type="unfinished"/>
+ <translation>Uita TouchID după inactivitatea de</translation>
</message>
<message>
<source>Convenience</source>
@@ -349,46 +350,67 @@ Nucleu (Kernel): %3 %4</translation>
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
- <translation type="unfinished"/>
+ <translation>Blocarea bazelor de date atunci când sesiunea este blocată sau capacul este închis</translation>
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation type="unfinished"/>
+ <translation>Uitați TouchID când sesiunea este blocată sau capacul este închis</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
- <translation type="unfinished"/>
+ <translation>Blocarea bazelor de date după Minimizarea ferestrei</translation>
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Re-Lock bazei de date blocate anterior după efectuarea auto-Type</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation type="unfinished"/>
+ <translation>Nu este necesară repetarea parolei atunci când este vizibilă</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
- <translation type="unfinished"/>
+ <translation>Nu ascundeți parolele atunci când le editați</translation>
</message>
<message>
<source>Don&apos;t use placeholder for empty password fields</source>
- <translation type="unfinished"/>
+ <translation>Nu se utilizează substituent pentru câmpurile de parolă goli</translation>
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
- <translation type="unfinished"/>
+ <translation>Ascunderea parolelor în panoul de previzualizare inregistrarii</translation>
</message>
<message>
<source>Hide entry notes by default</source>
- <translation type="unfinished"/>
+ <translation>Ascundere implicită notei inregistrarii</translation>
</message>
<message>
<source>Privacy</source>
<translation>Confidențialitate</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
<translation type="unfinished"/>
</message>
</context>
@@ -396,31 +418,31 @@ Nucleu (Kernel): %3 %4</translation>
<name>AutoType</name>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
- <translation>Nu a putut fi gasită o intrare care să coincidă cu titlul ferestrei:</translation>
+ <translation>Nu a putut fi gasită nicio intrare care să coincidă cu titlul ferestrei:</translation>
</message>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation type="unfinished"/>
+ <translation>Auto-tiparire-KeePassXC</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Auto tiparire</translation>
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation type="unfinished"/>
+ <translation>Sintaxa declaraţiei de auto-tiparire este incorectă!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
- <translation type="unfinished"/>
+ <translation>Această comandă auto-tip conține o întârziere foarte lungă. Chiar vrei să continuăm?</translation>
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation type="unfinished"/>
+ <translation>Această comandă auto-tip conține apăsări foarte lente ale tastelor. Chiar vrei să continuăm?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
- <translation type="unfinished"/>
+ <translation>Această comandă auto-tip conține argumente care se repetă foarte des. Chiar vrei să continuăm?</translation>
</message>
</context>
<context>
@@ -458,21 +480,36 @@ Nucleu (Kernel): %3 %4</translation>
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Copiază &amp;numele de utilizator</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Copiază &amp;parola</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
- <translation type="unfinished"/>
+ <translation>Auto-tiparire-KeePassXC</translation>
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation type="unfinished"/>
+ <translation>Selectare inregistrare pentru Auto-tip:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>Caută...</translation>
</message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
<message>
<source>KeePassXC-Browser Confirm Access</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC-browser confirmă accesul</translation>
</message>
<message>
<source>Remember this decision</source>
@@ -489,6 +526,15 @@ Nucleu (Kernel): %3 %4</translation>
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
+ <translation>% 1 a solicitat accesul la parole pentru următorul articol (e).
+Vă rugăm să selectați dacă doriți să permiteți accesul.</translation>
+ </message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
<translation type="unfinished"/>
</message>
</context>
@@ -496,11 +542,11 @@ Please select whether you want to allow access.</source>
<name>BrowserEntrySaveDialog</name>
<message>
<source>KeePassXC-Browser Save Entry</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC-browser-ul salvare inregistrarii</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished"/>
+ <translation>Ok</translation>
</message>
<message>
<source>Cancel</source>
@@ -509,7 +555,8 @@ Please select whether you want to allow access.</source>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
- <translation type="unfinished"/>
+ <translation>Aveți mai multe baze de date deschise.
+Selectați baza de date corectă pentru salvarea acreditărilor.</translation>
</message>
</context>
<context>
@@ -520,11 +567,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation type="unfinished"/>
+ <translation>Acest lucru este necesar pentru accesarea bazelor de date cu KeePassXC-browser</translation>
</message>
<message>
<source>General</source>
@@ -532,58 +575,58 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Enable integration for these browsers:</source>
- <translation type="unfinished"/>
+ <translation>Activați integrarea pentru aceste browsere:</translation>
</message>
<message>
<source>&amp;Google Chrome</source>
- <translation type="unfinished"/>
+ <translation>&amp;Google Chrome</translation>
</message>
<message>
<source>&amp;Firefox</source>
- <translation type="unfinished"/>
+ <translation>&amp;Firefox</translation>
</message>
<message>
<source>&amp;Chromium</source>
- <translation type="unfinished"/>
+ <translation>&amp;Chromium</translation>
</message>
<message>
<source>&amp;Vivaldi</source>
- <translation type="unfinished"/>
+ <translation>&amp;Vivaldi</translation>
</message>
<message>
<source>Show a &amp;notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation type="unfinished"/>
+ <translation>Afișare &amp; notificarii atunci când sunt solicitate acreditările</translation>
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
- <translation type="unfinished"/>
+ <translation>Re&amp;Quest pentru a debloca baza de date în cazul în care este blocata</translation>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation type="unfinished"/>
+ <translation>Sunt returnate numai intrările cu aceeași schemă (http://, https://,...) .</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
- <translation type="unfinished"/>
+ <translation>&amp;Potrivi schema URL (de exemplu, https://...)</translation>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation type="unfinished"/>
+ <translation>Returnează numai cele mai bune potriviri pentru un anumit URL în loc de toate intrările pentru întregul domeniu.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
- <translation type="unfinished"/>
+ <translation>&amp;Returnează numai cele mai bune acreditări de potrivire</translation>
</message>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation type="unfinished"/>
+ <translation>Sortare &amp; potrivire acreditări după titlu</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation type="unfinished"/>
+ <translation>Sortare acreditări de potrivire de &amp;username</translation>
</message>
<message>
<source>Advanced</source>
@@ -592,54 +635,50 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation type="unfinished"/>
+ <translation>Niciodată &amp;cere înainte de accesarea acreditărilor</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation type="unfinished"/>
+ <translation>Nu mai întreba înainte &amp;actualizarea acreditărilor</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation type="unfinished"/>
+ <translation>Caut&amp;a în toate bazele de date deschise pentru acreditări potrivite</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
- <translation type="unfinished"/>
+ <translation>Crearea sau actualizarea automată a câmpurilor șir nu este acceptată.</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation type="unfinished"/>
+ <translation>&amp;Returnează câmpuri de șir avansate care încep cu &quot;KPH:&quot;</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation type="unfinished"/>
+ <translation>Actualizează la pornire calea binară KeePassXC sau keepassxc-proxy automat la script-uri de mesagerie native.</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation type="unfinished"/>
+ <translation>Actualizează la pornire mesaje &amp;native fișiere manifest</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
- <translation type="unfinished"/>
+ <translation>Sustine o aplicatie proxy intreextensie browser KeePassXC și extensie browser</translation>
</message>
<message>
<source>Use a &amp;proxy application between KeePassXC and browser extension</source>
- <translation type="unfinished"/>
+ <translation>Utilizați o aplicație &amp; proxy între KeePassXC și extensia browserului</translation>
</message>
<message>
<source>Use a custom proxy location if you installed a proxy manually.</source>
- <translation type="unfinished"/>
+ <translation>Utilizați o locație proxy particularizată dacă ați instalat manual un proxy.</translation>
</message>
<message>
<source>Use a &amp;custom proxy location</source>
<comment>Meant is the proxy for KeePassXC-Browser</comment>
- <translation type="unfinished"/>
+ <translation>Folosește o locație proxy &amp;personalizată </translation>
</message>
<message>
<source>Browse...</source>
@@ -648,39 +687,83 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
- <translation type="unfinished"/>
+ <translation>&lt;b&gt;Avertizare:&lt;/b&gt; Următoarele opțiuni pot fi periculoase!</translation>
</message>
<message>
<source>Select custom proxy location</source>
+ <translation>Selectare locație proxy particularizată</translation>
+ </message>
+ <message>
+ <source>&amp;Tor Browser</source>
+ <translation>&amp;Navigator web Tor</translation>
+ </message>
+ <message>
+ <source>Executable Files</source>
+ <translation>Fișiere executabile</translation>
+ </message>
+ <message>
+ <source>All Files</source>
+ <translation>Toate fișierele</translation>
+ </message>
+ <message>
+ <source>Do not ask permission for HTTP &amp;Basic Auth</source>
+ <extracomment>An extra HTTP Basic Auth setting</extracomment>
+ <translation>Nu cere permisiunea pentru HTTP &amp;Basic auth</translation>
+ </message>
+ <message>
+ <source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
+ <translation>Datorită snap sandboxing, trebuie să executați un script pentru a activa integrarea browser-ului.&lt;br&gt;Puteți obține acest script de la % 1</translation>
+ </message>
+ <message>
+ <source>Please see special instructions for browser extension use below</source>
+ <translation>Vă rugăm să consultați instrucțiunile speciale pentru utilizarea extensiei browserului de mai jos</translation>
+ </message>
+ <message>
+ <source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
+ <translation>KeePassXC-browser-ul este necesar pentru integrarea browser-ului pentru a lucra.&lt;br&gt;Descărcați-l pentru %1 și % 2. % 3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We&apos;re sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2.</source>
+ <source>&amp;Allow returning expired credentials.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&amp;Tor Browser</source>
+ <source>Enable browser integration</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
+ <source>Browsers installed as snaps are currently not supported.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Executable Files</source>
+ <source>All databases connected to the extension will return matching credentials.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>All Files</source>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do not ask permission for HTTP &amp;Basic Auth</source>
- <extracomment>An extra HTTP Basic Auth setting</extracomment>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -688,14 +771,17 @@ Please select the correct database for saving credentials.</source>
<name>BrowserService</name>
<message>
<source>KeePassXC: New key association request</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: noua cerere de asociere cheie</translation>
</message>
<message>
<source>You have received an association request for the above key.
If you would like to allow it access to your KeePassXC database,
give it a unique name to identify and accept it.</source>
- <translation type="unfinished"/>
+ <translation>Ați primit o solicitare de asociere pentru cheia de mai sus.
+
+Dacă doriți să-i permiteți accesul la baza de date KeePassXC,
+dati un nume unic pentru a identifica și de a accepta.</translation>
</message>
<message>
<source>Save and allow access</source>
@@ -708,15 +794,16 @@ give it a unique name to identify and accept it.</source>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
- <translation type="unfinished"/>
+ <translation>Există deja o cheie de criptare partajată cu numele &quot;%1&quot; .
+Doriți să o suprascrieți?</translation>
</message>
<message>
<source>KeePassXC: Update Entry</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: actualizare intrare</translation>
</message>
<message>
<source>Do you want to update the information in %1 - %2?</source>
- <translation type="unfinished"/>
+ <translation>Actualizați informațiile în %1 - %2 ?</translation>
</message>
<message>
<source>Abort</source>
@@ -724,49 +811,67 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation type="unfinished"/>
+ <translation>Conversia atributelor in date particularizate...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: conversia atributelor KeePassHTTP</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>Atributele convertite cu succes din %1 intrare (i).
+S-au mutat %2 chei la date particularizate.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>S-au mutat cu succes% n chei la date particularizate.</numerusform><numerusform>S-au mutat cu succes %n chei la date particularizate.</numerusform><numerusform>S-au mutat cu succes %n chei la date particularizate.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: n-a fost găsita nici o intrare cu KeePassHTTP atribute !</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation type="unfinished"/>
+ <translation>Baza de date activă nu conține nici o intrare cu atributele KeePassHTTP.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Au fost detectate setările moștenite de integrare a browserului</translation>
</message>
<message>
- <source>Legacy browser integration settings have been detected.
-Do you want to upgrade the settings to the latest standard?
-This is necessary to maintain compatibility with the browser plugin.</source>
- <translation type="unfinished"/>
+ <source>KeePassXC: Create a new group</source>
+ <translation>KeePassXC: crearea unui grup nou</translation>
+ </message>
+ <message>
+ <source>A request for creating a new group &quot;%1&quot; has been received.
+Do you want to create this group?
+</source>
+ <translation>S-a primit o solicitare de creare a unui grup nou &quot;%1&quot;.
+Doriți să creați acest grup?</translation>
+ </message>
+ <message>
+ <source>Your KeePassXC-Browser settings need to be moved into the database settings.
+This is necessary to maintain your current browser connections.
+Would you like to migrate your existing settings now?</source>
+ <translation>Setările KeePassXC-browser trebuie mutate în setările bazei de date.
+Acest lucru este necesar pentru a menține conexiunile browser-ului curent.
+Migrați acum setările existente?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Nu mai afișa acest avertisment</translation>
</message>
</context>
<context>
<name>CloneDialog</name>
<message>
<source>Clone Options</source>
- <translation type="unfinished"/>
+ <translation>Clonare opțiuni </translation>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation type="unfinished"/>
+ <translation>Adăugare &quot; - Clonat&quot; la titlu</translation>
</message>
<message>
<source>Replace username and password with references</source>
@@ -785,7 +890,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>filename</source>
- <translation type="unfinished"/>
+ <translation>nume fișier</translation>
</message>
<message>
<source>size, rows, columns</source>
@@ -816,12 +921,8 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Prima înregistrare conține denumirile de câmpuri</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Număr de linii antet de eliminat</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
- <translation type="unfinished"/>
+ <translation>Considera &quot;\&quot; un caracter Escape</translation>
</message>
<message>
<source>Preview</source>
@@ -833,7 +934,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Not present in CSV file</source>
- <translation type="unfinished"/>
+ <translation>Nu este prezent în fișierul CSV</translation>
</message>
<message>
<source>Imported from CSV file</source>
@@ -849,23 +950,40 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Empty fieldname %1</source>
- <translation type="unfinished"/>
+ <translation>Nume câmp necompletat %1</translation>
</message>
<message>
<source>column %1</source>
- <translation type="unfinished"/>
+ <translation>coloană %1</translation>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation type="unfinished"/>
+ <translation>Eroare (i) detectată în fișierul CSV!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>[% n mai mult mesaj (e) ignorate]</numerusform><numerusform>[% n mai mult mesaj (e) ignorate]</numerusform><numerusform>[%n mai mult mesaj(e) ignorat(e)]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
+ <translation>Import CSV: scriitor are erori:
+%1</translation>
+ </message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
<translation type="unfinished"/>
</message>
</context>
@@ -873,20 +991,20 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n coloană (e)</numerusform><numerusform>% n coloană (e)</numerusform><numerusform>%n coloană (e)</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
<comment>file info: bytes, rows, columns</comment>
- <translation type="unfinished"/>
+ <translation>%1, %2, %3</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n byte (e)</numerusform><numerusform>% n byte (e)</numerusform><numerusform>%n byte (s)</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n rând (e)</numerusform><numerusform>% n rând (e)</numerusform><numerusform>%n rând (uri)</numerusform></translation>
</message>
</context>
<context>
@@ -898,72 +1016,80 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>File %1 does not exist.</source>
- <translation type="unfinished"/>
+ <translation>Fișierul %1 nu există.</translation>
</message>
<message>
<source>Unable to open file %1.</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de deschis fișierul %1.</translation>
</message>
<message>
<source>Error while reading the database: %1</source>
+ <translation>Eroare la citirea bazei de date: %1</translation>
+ </message>
+ <message>
+ <source>File cannot be written as it is opened in read-only mode.</source>
+ <translation>Fișierul nu poate fi scris deoarece este deschis în modul doar pentru citire.</translation>
+ </message>
+ <message>
+ <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <translation>Cheia nu s-a transformat. Acesta este un bug, vă rugăm să raportati la dezvoltatorii!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Could not save, database has no file name.</source>
+ <source>Could not save, database does not point to a valid file.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File cannot be written as it is opened in read-only mode.</source>
+ <source>Could not save, database file is read-only.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Coș de gunoi</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
<message>
<source>Unlock Database - KeePassXC</source>
- <translation type="unfinished"/>
+ <translation>Deblocare bază de date - KeePassXC</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Introduceți cheia principală</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Fișier cheie:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Parola:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Răsfoiește</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Actualizează</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation type="unfinished"/>
+ <translation>Format moștenit de fișier cheie </translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Utilizați un format moștenit de fișier cheie care poate deveni
+neacceptat în viitor.
+
+Vă rugăm să luați în considerare generarea unui nou fișier cheie.</translation>
</message>
<message>
<source>Don&apos;t show this warning again</source>
- <translation type="unfinished"/>
+ <translation>Nu mai afișa acest avertisment</translation>
</message>
<message>
<source>All files</source>
@@ -978,17 +1104,95 @@ Please consider generating a new key file.</source>
<translation>Selectați fișier cheie</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
+ <source>Failed to open key file: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
+ <source>Select slot...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Răsfoiește...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Golește</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1003,7 +1207,7 @@ Please consider generating a new key file.</source>
<name>DatabaseSettingsDialog</name>
<message>
<source>Advanced Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări avansate</translation>
</message>
<message>
<source>General</source>
@@ -1015,11 +1219,11 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Master Key</source>
- <translation type="unfinished"/>
+ <translation>Cheia principală</translation>
</message>
<message>
<source>Encryption Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări criptare</translation>
</message>
<message>
<source>Browser Integration</source>
@@ -1030,23 +1234,23 @@ Please consider generating a new key file.</source>
<name>DatabaseSettingsWidgetBrowser</name>
<message>
<source>KeePassXC-Browser settings</source>
- <translation type="unfinished"/>
+ <translation>Setări KeePassXC-Browser</translation>
</message>
<message>
<source>&amp;Disconnect all browsers</source>
- <translation type="unfinished"/>
+ <translation>&amp;Deconectează toate navigatoarele web</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Uit&amp;a toate setările specifice site-ului pe intrările</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation type="unfinished"/>
+ <translation>Mutați KeePassHTTP atributele in KeePassXC-browser &amp;cdate personalizate</translation>
</message>
<message>
<source>Stored keys</source>
- <translation type="unfinished"/>
+ <translation>Taste memorate</translation>
</message>
<message>
<source>Remove</source>
@@ -1054,62 +1258,65 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Delete the selected key?</source>
- <translation type="unfinished"/>
+ <translation>Șterg cheia selectată?</translation>
</message>
<message>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să ștergeți cheia selectată?
+Acest lucru poate împiedica conectarea la plugin-ul browser-ului.</translation>
</message>
<message>
<source>Key</source>
- <translation type="unfinished"/>
+ <translation>Cheie</translation>
</message>
<message>
<source>Value</source>
- <translation type="unfinished"/>
+ <translation>Valoare</translation>
</message>
<message>
<source>Enable Browser Integration to access these settings.</source>
- <translation type="unfinished"/>
+ <translation>Activați integrarea browserului pentru a accesa aceste setări.</translation>
</message>
<message>
<source>Disconnect all browsers</source>
- <translation type="unfinished"/>
+ <translation>Deconectează toate navigatoarele web</translation>
</message>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să deconectați toate browserele?
+Acest lucru poate împiedica conectarea la plugin-ul browser-ului.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: nu s-au găsit chei</translation>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>Nu sunt găsite chei de criptare partajate în setările KeePassXC.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: cheile sterse din baza de date</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>S-a eliminat cu succes% n cheie de criptare din setările KeePassXC.</numerusform><numerusform>S-a eliminat cu succes% n cheie de criptare din setările KeePassXC.</numerusform><numerusform>S-a eliminat cu succes %n chei de criptare din setările KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Uita toate setările specifice site-ului pe intrările</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation type="unfinished"/>
+ <translation>Chiar vrei sa se uite toate setările specifice site-ului pe fiecare intrare?
+Permisiunile de accesare a intrărilor vor fi revocate.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
- <translation type="unfinished"/>
+ <translation>Se elimină permisiunile stocate...</translation>
</message>
<message>
<source>Abort</source>
@@ -1117,27 +1324,36 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>KeePassXC: Removed permissions</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: permisiuni eliminate</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Permisiuni eliminate cu succes de la% n intrare (e).</numerusform><numerusform>Permisiuni eliminate cu succes de la% n intrare (e).</numerusform><numerusform>Permisiuni eliminate cu succes de la %n intrare (i).</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: nici o intrare cu permisiuni găsit!</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
- <translation type="unfinished"/>
+ <translation>Baza de date activă nu conține o intrare cu permisiuni.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation type="unfinished"/>
+ <translation>Mutarea atributelor KeePassHTTP la date particularizate</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
+ <translation>Chiar doriți să mutați toate datele de integrare a browserului moștenite la cel mai recent standard?
+Acest lucru este necesar pentru a menține compatibilitatea cu plugin-ul browser-ului.</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1165,7 +1381,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Benchmark 1-second delay</source>
- <translation type="unfinished"/>
+ <translation>Benchmark pentru întârziere de 1 secunda</translation>
</message>
<message>
<source>Memory Usage:</source>
@@ -1177,63 +1393,65 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Decryption Time:</source>
- <translation type="unfinished"/>
+ <translation>Timp de decriptare:</translation>
</message>
<message>
<source>?? s</source>
- <translation type="unfinished"/>
+ <translation>?? s</translation>
</message>
<message>
<source>Change</source>
- <translation type="unfinished"/>
+ <translation>Schimba</translation>
</message>
<message>
<source>100 ms</source>
- <translation type="unfinished"/>
+ <translation>100 ms</translation>
</message>
<message>
<source>5 s</source>
- <translation type="unfinished"/>
+ <translation>5 s</translation>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>Valorile mai mari oferă o protecție mai mare, dar deschiderea bazei de date va dura mai mult.</translation>
</message>
<message>
<source>Database format:</source>
- <translation type="unfinished"/>
+ <translation>Format bază de date:</translation>
</message>
<message>
<source>This is only important if you need to use your database with other programs.</source>
- <translation type="unfinished"/>
+ <translation>Acest lucru este important numai dacă trebuie să utilizați baza de date cu alte programe.</translation>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
- <translation type="unfinished"/>
+ <translation>KDBX 4,0 (recomandat)</translation>
</message>
<message>
<source>KDBX 3.1</source>
- <translation type="unfinished"/>
+ <translation>KDBX 3.1</translation>
</message>
<message>
<source>unchanged</source>
<comment>Database decryption time is unchanged</comment>
- <translation type="unfinished"/>
+ <translation>Neschimbat</translation>
</message>
<message>
<source>Number of rounds too high</source>
<comment>Key transformation rounds</comment>
- <translation type="unfinished"/>
+ <translation>Numărul de runde prea mare</translation>
</message>
<message>
<source>You are using a very high number of key transform rounds with Argon2.
If you keep this number, your database may take hours or days (or even longer) to open!</source>
- <translation type="unfinished"/>
+ <translation>Utilizați un număr foarte mare de runde de transformare cheie cu Argon2.
+
+Dacă păstrați acest număr, deschiderea bazei de date poate dura ore sau zile (sau chiar mai mult)!</translation>
</message>
<message>
<source>Understood, keep number</source>
- <translation type="unfinished"/>
+ <translation>Înțeles, păstrați numărul</translation>
</message>
<message>
<source>Cancel</source>
@@ -1242,41 +1460,94 @@ If you keep this number, your database may take hours or days (or even longer) t
<message>
<source>Number of rounds too low</source>
<comment>Key transformation rounds</comment>
- <translation type="unfinished"/>
+ <translation>Număr de runde prea mici</translation>
</message>
<message>
<source>You are using a very low number of key transform rounds with AES-KDF.
If you keep this number, your database may be too easy to crack!</source>
- <translation type="unfinished"/>
+ <translation>Utilizați un număr foarte mic de runde de transformare cheie cu AES-KDF.
+
+Dacă păstrați acest număr, baza de date poate fi prea ușor de spart!</translation>
</message>
<message>
<source>KDF unchanged</source>
- <translation type="unfinished"/>
+ <translation>KDF nemodificat</translation>
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation type="unfinished"/>
+ <translation>Nu s-a reușit transformarea cheii cu noi parametri KDF; KDF neschimbat.</translation>
</message>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Mib</numerusform><numerusform>Mib</numerusform><numerusform>Mib</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>filet (e)</numerusform><numerusform>filet (e)</numerusform><numerusform>filet(e)</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% 1 MS</numerusform><numerusform>% 1 MS</numerusform><numerusform>%1 ms</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% 1 s</numerusform><numerusform>% 1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1303,15 +1574,15 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Max. history items:</source>
- <translation type="unfinished"/>
+ <translation>Max. elemente de istorie:</translation>
</message>
<message>
<source>Max. history size:</source>
- <translation type="unfinished"/>
+ <translation>Max. Dimensiune istorie:</translation>
</message>
<message>
<source> MiB</source>
- <translation type="unfinished"/>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1323,6 +1594,39 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Enable &amp;compression (recommended)</source>
+ <translation>Permite &amp;comprimare (recomandat)</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1330,64 +1634,70 @@ If you keep this number, your database may be too easy to crack!</source>
<name>DatabaseSettingsWidgetKeeShare</name>
<message>
<source>Sharing</source>
- <translation type="unfinished"/>
+ <translation>Partajare</translation>
</message>
<message>
<source>Breadcrumb</source>
- <translation type="unfinished"/>
+ <translation>Breadcrumb</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished"/>
+ <translation>Tip</translation>
</message>
<message>
<source>Path</source>
- <translation type="unfinished"/>
+ <translation>Cale</translation>
</message>
<message>
<source>Last Signer</source>
- <translation type="unfinished"/>
+ <translation>Ultimul semnatar</translation>
</message>
<message>
<source>Certificates</source>
- <translation type="unfinished"/>
+ <translation>Certificate</translation>
</message>
<message>
<source> &gt; </source>
<comment>Breadcrumb separator</comment>
- <translation type="unfinished"/>
+ <translation>&gt;</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidgetMasterKey</name>
<message>
<source>Add additional protection...</source>
- <translation type="unfinished"/>
+ <translation>Adauga protectie suplimentara...</translation>
</message>
<message>
<source>No encryption key added</source>
- <translation type="unfinished"/>
+ <translation>Nu s-a adăugat cheia de criptare</translation>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation type="unfinished"/>
+ <translation>Trebuie să adăugați cel puțin o cheie de criptare pentru a securiza baza de date!</translation>
</message>
<message>
<source>No password set</source>
- <translation type="unfinished"/>
+ <translation>Nici o parolă setată</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation type="unfinished"/>
+ <translation>Avertizare! Nu ați setat o parolă. Folosind o bază de date fără o parolă este puternic descurajat!
+
+Sigur continuați fără parolă?</translation>
</message>
<message>
<source>Unknown error</source>
- <translation type="unfinished"/>
+ <translation>Eroare necunoscută</translation>
</message>
<message>
<source>Failed to change master key</source>
+ <translation>Imposibil de modificat cheia master</translation>
+ </message>
+ <message>
+ <source>Continue without password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1395,10 +1705,133 @@ Are you sure you want to continue without a password?</source>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
<message>
<source>Database Name:</source>
- <translation type="unfinished"/>
+ <translation>Nume bază de date:</translation>
</message>
<message>
<source>Description:</source>
+ <translation>Descrierea :</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nume</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valoare</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1422,7 +1855,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Merge database</source>
- <translation>Îmbină baza de date</translation>
+ <translation>Îmbina baza de date</translation>
</message>
<message>
<source>Open KeePass 1 database</source>
@@ -1442,38 +1875,59 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Database creation error</source>
- <translation type="unfinished"/>
+ <translation>Eroare la crearea bazei de date</translation>
</message>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
+ <translation>Baza de date creată nu are cheie sau KDF, refuzând să o salveze.
+Acest lucru este cu siguranta un bug, vă rugăm să raporteze la dezvoltatori.</translation>
</message>
<message>
<source>Select CSV file</source>
- <translation type="unfinished"/>
+ <translation>Selectați fișierul CSV</translation>
</message>
<message>
<source>New Database</source>
- <translation type="unfinished"/>
+ <translation>Bază de date nouă</translation>
</message>
<message>
<source>%1 [New Database]</source>
<comment>Database tab name modifier</comment>
- <translation type="unfinished"/>
+ <translation>%1 [bază de date nouă]</translation>
</message>
<message>
<source>%1 [Locked]</source>
<comment>Database tab name modifier</comment>
- <translation type="unfinished"/>
+ <translation>%1 [blocat]</translation>
</message>
<message>
<source>%1 [Read-only]</source>
<comment>Database tab name modifier</comment>
+ <translation>%1 [doar în citire]</translation>
+ </message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1485,15 +1939,15 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să ștergeți intrarea &quot;%1&quot; pentru totdeauna?</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să mutați intrarea &quot;%1&quot; în Coșul de reciclare?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Chiar doriți să mutați% n intrare (e) în Coșul de reciclare?</numerusform><numerusform>Chiar doriți să mutați% n intrare (e) în Coșul de reciclare?</numerusform><numerusform>Chiar doriți să mutați %n intrari în Coșul de reciclare?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1501,7 +1955,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to execute the following command?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</source>
- <translation type="unfinished"/>
+ <translation>Chiar vrei să execute următoarea comandă?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
</message>
<message>
<source>Remember my choice</source>
@@ -1509,15 +1963,15 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să ștergeți grupul &quot;%1&quot;?</translation>
</message>
<message>
<source>No current database.</source>
- <translation>Nu există o baza de date curentă.</translation>
+ <translation>Nu există o bază de date curentă.</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
- <translation type="unfinished"/>
+ <translation>Nicio bază de date sursă, nimic de făcut.</translation>
</message>
<message>
<source>Search Results (%1)</source>
@@ -1542,7 +1996,8 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>The database file has changed and you have unsaved changes.
Do you want to merge your changes?</source>
- <translation type="unfinished"/>
+ <translation>Fișierul bazei de date s-a modificat și aveți modificări nesalvate.
+Doriți să îmbinați modificările?</translation>
</message>
<message>
<source>Empty recycle bin?</source>
@@ -1550,31 +2005,27 @@ Do you want to merge your changes?</source>
</message>
<message>
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Sigur ștergeți definitiv totul din Coșul de reciclare?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Chiar doriți să ștergeți% n intrare (e) pentru totdeauna?</numerusform><numerusform>Chiar doriți să ștergeți% n intrare (e) pentru totdeauna?</numerusform><numerusform>Chiar doriți să ștergeți %n intrari pentru totdeauna?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Ștergeți intrările?</numerusform><numerusform>Ștergeți intrările?</numerusform><numerusform>Ștergeți intrările?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Fișier deschis doar pentru citire.</translation>
+ <translation><numerusform>Mutați intrările în Coșul de reciclare?</numerusform><numerusform>Mutați intrările în Coșul de reciclare?</numerusform><numerusform>Mutați intrările în Coșul de reciclare?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
- <translation type="unfinished"/>
+ <translation>Blocarea bazei de date?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>Editați o intrare. Renunțați la modificări și blocați oricum?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1585,7 +2036,8 @@ Salvați modificările?</translation>
<message>
<source>Database was modified.
Save changes?</source>
- <translation type="unfinished"/>
+ <translation>Baza de date a fost modificată.
+Salvați modificările?</translation>
</message>
<message>
<source>Save changes?</source>
@@ -1594,21 +2046,18 @@ Save changes?</source>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de deschis noul fișier bază de date în timp ce încercați să autoreload.
+Eroare: %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
- <translation type="unfinished"/>
+ <translation>Dezactivați salvarea sigură?</translation>
</message>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC nu a reușit să salveze baza de date de mai multe ori. Acest lucru este probabil cauzat de serviciile de sincronizare a fișierelor care dețin o blocare pe fișierul de salvare.
+Dezactivați salvarea sigură și încercați din nou?</translation>
</message>
<message>
<source>Passwords</source>
@@ -1624,30 +2073,42 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>Înlocuiți referințele la intrare?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Intrarea &quot;% 1&quot; are% 2 referințe (e). Suprascrieți referințele cu valori, ignorați această intrare sau ștergeți-o oricum?</numerusform><numerusform>Intrarea &quot;% 1&quot; are% 2 referințe (e). Suprascrieți referințele cu valori, ignorați această intrare sau ștergeți-o oricum?</numerusform><numerusform>Intrarea &quot;%1&quot; are %2 referințe. Suprascrieți referințele cu valori, ignorați această intrare sau ștergeți-o oricum?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
- <translation type="unfinished"/>
+ <translation>Ștergere grup</translation>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Mutați grupul în Coșul de reciclare?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să mutați grupul &quot;%1&quot; în Coșul de reciclare?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation type="unfinished"/>
+ <translation>A fuzionat cu succes fișierele bazei de date.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
+ <translation>Baza de date nu a fost modificată de operațiunea de îmbinare.</translation>
+ </message>
+ <message>
+ <source>Shared group...</source>
+ <translation>Grup partajat...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Scrierea bazei de date nu a reușit: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1667,7 +2128,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Auto tiparire</translation>
</message>
<message>
<source>Properties</source>
@@ -1723,7 +2184,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>Sunteți sigur că doriți să eliminați acest atribut?</translation>
+ <translation>Sigur doriți să eliminați acest atribut?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1731,42 +2192,54 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n săptămână (i)</numerusform><numerusform>% n săptămână (i)</numerusform><numerusform>%n săptămână(i)</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n lună (i)</numerusform><numerusform>% n lună (i)</numerusform><numerusform>%n lună(i)</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
- <translation type="unfinished"/>
+ <translation>Aplicați parola generată?</translation>
</message>
<message>
<source>Do you want to apply the generated password to this entry?</source>
- <translation type="unfinished"/>
+ <translation>Aplicați parola generată la această intrare?</translation>
</message>
<message>
<source>Entry updated successfully.</source>
- <translation type="unfinished"/>
+ <translation>Intrare actualizată cu succes.</translation>
</message>
<message>
<source>Entry has unsaved changes</source>
- <translation type="unfinished"/>
+ <translation>Intrarea are modificări nesalvate</translation>
</message>
<message>
<source>New attribute %1</source>
- <translation type="unfinished"/>
+ <translation>Atribut nou %1</translation>
</message>
<message>
<source>[PROTECTED] Press reveal to view or edit</source>
- <translation type="unfinished"/>
+ <translation>[PROTEJAT] Apăsați pe dezvăluire pentru a vizualiza sau edita</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n an (i)</numerusform><numerusform>% n an (i)</numerusform><numerusform>%n an(i)</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
+ <translation>Confirmare eliminare</translation>
+ </message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integrare cu browserul</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1802,10 +2275,46 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Foreground Color:</source>
- <translation type="unfinished"/>
+ <translation>Culoare prim plan:</translation>
</message>
<message>
<source>Background Color:</source>
+ <translation>Culoare de fundal:</translation>
+ </message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1813,19 +2322,19 @@ Disable safe saves and try again?</source>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
- <translation type="unfinished"/>
+ <translation>Activare tiparire automat pentru această intrare</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation type="unfinished"/>
+ <translation>Moștenirea secvenței implicite de tiparire auto din &amp;grupul</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
- <translation type="unfinished"/>
+ <translation>&amp;Utilizați secvența de auto-tiparire personalizată:</translation>
</message>
<message>
<source>Window Associations</source>
- <translation type="unfinished"/>
+ <translation>Asocieri de Ferestre</translation>
</message>
<message>
<source>+</source>
@@ -1841,6 +2350,77 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Use a specific sequence for this association:</source>
+ <translation>Utilizați o secvență specifică pentru această asociere:</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Adaugă</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation> Înlătură</translation>
+ </message>
+ <message>
+ <source>Edit</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1862,6 +2442,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>Șterge toate</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1891,7 +2491,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation type="unfinished"/>
+ <translation>Comutați caseta de selectare pentru a dezvălui secțiunea de note.</translation>
</message>
<message>
<source>Username:</source>
@@ -1901,16 +2501,72 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>Expiră</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
<message>
<source>Form</source>
- <translation>De la</translation>
+ <translation>Formular</translation>
</message>
<message>
<source>Remove key from agent after</source>
- <translation type="unfinished"/>
+ <translation>Eliminați cheia de la agent după</translation>
</message>
<message>
<source> seconds</source>
@@ -1918,11 +2574,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Fingerprint</source>
- <translation type="unfinished"/>
+ <translation>Amprentă</translation>
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
- <translation type="unfinished"/>
+ <translation>Eliminați cheia de la agent atunci când baza de date este închisă/blocată</translation>
</message>
<message>
<source>Public key</source>
@@ -1930,7 +2586,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation type="unfinished"/>
+ <translation>Adăugare cheie la agent când baza de date este deschisă/descuiată</translation>
</message>
<message>
<source>Comment</source>
@@ -1975,6 +2631,22 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Require user confirmation when this key is used</source>
+ <translation>Solicitați confirmarea utilizatorului când se utilizează această tastă</translation>
+ </message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2010,7 +2682,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Inherit from parent group (%1)</source>
- <translation type="unfinished"/>
+ <translation>Moștenire din grupul părinte (%1)</translation>
+ </message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Intrarea are modificări nesalvate</translation>
</message>
</context>
<context>
@@ -2021,15 +2697,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Type:</source>
- <translation type="unfinished"/>
+ <translation>Tip:</translation>
</message>
<message>
<source>Path:</source>
- <translation type="unfinished"/>
+ <translation>Calea:</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"/>
+ <translation>...</translation>
</message>
<message>
<source>Password:</source>
@@ -2037,54 +2713,100 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Inactive</source>
+ <translation>Inactiv</translation>
+ </message>
+ <message>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare container nesemnat</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare container semnat</translation>
+ </message>
+ <message>
+ <source>Select import source</source>
+ <translation>Selectați sursă de import</translation>
+ </message>
+ <message>
+ <source>Select export target</source>
+ <translation>Selectați țintă de export</translation>
+ </message>
+ <message>
+ <source>Select import/export file</source>
+ <translation>Selectați fișier pentru import/export</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Golește</translation>
+ </message>
+ <message>
+ <source>Import</source>
+ <translation>Import</translation>
+ </message>
+ <message>
+ <source>Export</source>
+ <translation>Export</translation>
+ </message>
+ <message>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from path</source>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to path</source>
+ <source>%1 is already being exported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with path</source>
+ <source>%1 is already being imported by this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
<translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
+ <source>Database export is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database import is disabled</source>
+ <source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>Sharing mode field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>Path to share file field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
+ <source>Browser for share file</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
+ <source>Password field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2108,14 +2830,42 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Auto tiparire</translation>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Utilizați secvența implicită de auto-tiparire a grupului părinte</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
+ <translation>Setarea implicită auto-tiparire se&amp;quence</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2123,11 +2873,11 @@ Disable safe saves and try again?</source>
<name>EditWidgetIcons</name>
<message>
<source>&amp;Use default icon</source>
- <translation type="unfinished"/>
+ <translation>&amp;Folosește icoana implicită</translation>
</message>
<message>
<source>Use custo&amp;m icon</source>
- <translation type="unfinished"/>
+ <translation>Folosește icoa&amp;nă personalizată</translation>
</message>
<message>
<source>Add custom icon</source>
@@ -2154,44 +2904,68 @@ Disable safe saves and try again?</source>
<translation>Toate fișierele</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Icon personalizat deja există</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Confirmați ștergerea</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
- <translation type="unfinished"/>
+ <translation>Selectare imagine(i)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Încărcat cu succes% 1 din% n pictogramă (e)</numerusform><numerusform>Încărcat cu succes% 1 din% n pictogramă (e)</numerusform><numerusform>Încărcat cu succes %1 din %n pictogramă(e)</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation type="unfinished"/>
+ <translation>Nu s-au încărcat pictograme</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>% n pictograma (ele) există deja în baza de date</numerusform><numerusform>% n pictograma (ele) există deja în baza de date</numerusform><numerusform>%n pictograma(ele) există deja în baza de date</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Pictograma (ele) următoare nu a reușit:</numerusform><numerusform>Pictograma (ele) următoare nu a reușit:</numerusform><numerusform>Pictograma(ele) următoare nu au reușit:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Această pictogramă este utilizată de% n intrare (e) și va fi înlocuită de pictograma implicită. Sigur ștergeți-l?</numerusform><numerusform>Această pictogramă este utilizată de% n intrare (e) și va fi înlocuită de pictograma implicită. Sigur ștergeți-l?</numerusform><numerusform>Această pictogramă este utilizată de %n intrare(i) și va fi înlocuită de pictograma implicită. Sigur ștergeți-l?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2214,7 +2988,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Plugin Data</source>
- <translation type="unfinished"/>
+ <translation>Plugin de date</translation>
</message>
<message>
<source>Remove</source>
@@ -2222,19 +2996,44 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Delete plugin data?</source>
- <translation type="unfinished"/>
+ <translation>Ștergeți datele modulului?</translation>
</message>
<message>
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
- <translation type="unfinished"/>
+ <translation>Chiar doriți să ștergeți datele selectate modulului?
+Acest lucru poate provoca moduluri afectate la defecțiune.</translation>
</message>
<message>
<source>Key</source>
- <translation type="unfinished"/>
+ <translation>Cheie</translation>
</message>
<message>
<source>Value</source>
+ <translation>Valoare</translation>
+ </message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2242,7 +3041,7 @@ This may cause the affected plugins to malfunction.</source>
<name>Entry</name>
<message>
<source>%1 - Clone</source>
- <translation type="unfinished"/>
+ <translation>%1 - Clona</translation>
</message>
</context>
<context>
@@ -2253,14 +3052,14 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiunea</translation>
</message>
</context>
<context>
<name>EntryAttachmentsWidget</name>
<message>
<source>Form</source>
- <translation>De la</translation>
+ <translation>Formular</translation>
</message>
<message>
<source>Add</source>
@@ -2284,7 +3083,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Sigur eliminați% n atașamente?</numerusform><numerusform>Sigur eliminați% n atașamente?</numerusform><numerusform>Sigur eliminați %n atașamente?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2293,11 +3092,12 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to create directory:
%1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de creat dosar:
+%1</translation>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation type="unfinished"/>
+ <translation>Sigur suprascrieți fișierul existent &quot;%1&quot; cu atașamentul?</translation>
</message>
<message>
<source>Confirm overwrite</source>
@@ -2306,26 +3106,52 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to save attachments:
%1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de salvat atașamentele:
+%1</translation>
</message>
<message>
<source>Unable to open attachment:
%1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de deschis atașament:
+%1</translation>
</message>
<message>
<source>Unable to open attachments:
%1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de deschis atașări:
+%1</translation>
</message>
<message>
<source>Confirm remove</source>
- <translation type="unfinished"/>
+ <translation>Confirmare eliminare</translation>
</message>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Imposibil de deschis fișierul (e):
+% 1</numerusform><numerusform>Imposibil de deschis fișierul (e):
+% 1</numerusform><numerusform>Imposibil de deschis fișierul(e):
+%1</numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>Atașamente</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2383,7 +3209,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Password</source>
- <translation>Parolă</translation>
+ <translation>Parola</translation>
</message>
<message>
<source>Notes</source>
@@ -2395,15 +3221,15 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Created</source>
- <translation type="unfinished"/>
+ <translation>Creat</translation>
</message>
<message>
<source>Modified</source>
- <translation type="unfinished"/>
+ <translation>Modificat</translation>
</message>
<message>
<source>Accessed</source>
- <translation type="unfinished"/>
+ <translation>Accesate</translation>
</message>
<message>
<source>Attachments</source>
@@ -2411,20 +3237,16 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Yes</source>
- <translation type="unfinished"/>
+ <translation>da</translation>
</message>
<message>
<source>TOTP</source>
- <translation type="unfinished"/>
+ <translation>TOTP</translation>
</message>
</context>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generează token TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Închide</translation>
</message>
@@ -2462,7 +3284,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Autotype</source>
- <translation type="unfinished"/>
+ <translation>autotipie</translation>
</message>
<message>
<source>Window</source>
@@ -2495,7 +3317,7 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
- <translation type="unfinished"/>
+ <translation>&lt;b&gt;%1&lt;/b&gt;:%2</translation>
</message>
<message>
<source>Enabled</source>
@@ -2507,34 +3329,42 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Share</source>
+ <translation>Împărtăşi</translation>
+ </message>
+ <message>
+ <source>Display current TOTP value</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avansat</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
<message>
<source>Customize View</source>
- <translation type="unfinished"/>
+ <translation>Particularizare vizualizare</translation>
</message>
<message>
<source>Hide Usernames</source>
- <translation type="unfinished"/>
+ <translation>Ascundere nume de utilizator</translation>
</message>
<message>
<source>Hide Passwords</source>
- <translation type="unfinished"/>
+ <translation>Ascundere parole</translation>
</message>
<message>
<source>Fit to window</source>
- <translation type="unfinished"/>
+ <translation>Potrivire la fereastră</translation>
</message>
<message>
<source>Fit to contents</source>
- <translation type="unfinished"/>
+ <translation>Potrivire la conținut</translation>
</message>
<message>
<source>Reset to defaults</source>
- <translation type="unfinished"/>
+ <translation>Resetare la valorile implicite</translation>
</message>
<message>
<source>Attachments (icon)</source>
@@ -2542,33 +3372,99 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Coș de gunoi</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
<message>
- <source>[empty]</source>
- <comment>group has no children</comment>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
<translation type="unfinished"/>
</message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
</context>
<context>
- <name>GroupModel</name>
+ <name>FdoSecretsPlugin</name>
<message>
- <source>%1</source>
- <comment>Template for name without annotation</comment>
+ <source>Fdo Secret Service: %1</source>
<translation type="unfinished"/>
</message>
</context>
<context>
+ <name>Group</name>
+ <message>
+ <source>[empty]</source>
+ <comment>group has no children</comment>
+ <translation>gol</translation>
+ </message>
+</context>
+<context>
<name>HostInstaller</name>
<message>
<source>KeePassXC: Cannot save file!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Imposibil de salvat fișierul!</translation>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
+ <translation>Imposibil de salvat fișierul script de mesagerie nativ.</translation>
+ </message>
+</context>
+<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anulare</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Închide</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Stare</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2576,7 +3472,7 @@ This may cause the affected plugins to malfunction.</source>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
- <translation type="unfinished"/>
+ <translation>&amp;Închide</translation>
</message>
<message>
<source>Close message</source>
@@ -2591,30 +3487,31 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to issue challenge-response.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Cheie greșită sau fișier bază de date corupt.</translation>
+ <translation>Imposibilitatea de a emite provocare-răspuns.</translation>
</message>
<message>
<source>missing database headers</source>
- <translation type="unfinished"/>
+ <translation>Lipsă de anteturi de baze de date </translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation type="unfinished"/>
+ <translation>Antetul nu se potrivește cu hash</translation>
</message>
<message>
<source>Invalid header id size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune ID antet nevalidă</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation type="unfinished"/>
+ <translation>Lungime câmp antet nevalid</translation>
</message>
<message>
<source>Invalid header data length</source>
+ <translation>Lungime de date antet nevalidă</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2622,7 +3519,7 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx3Writer</name>
<message>
<source>Unable to issue challenge-response.</source>
- <translation type="unfinished"/>
+ <translation>Imposibilitatea de a emite provocare-răspuns.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2633,7 +3530,7 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx4Reader</name>
<message>
<source>missing database headers</source>
- <translation type="unfinished"/>
+ <translation>Lipsă de anteturi de baze de date </translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2641,114 +3538,119 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid header checksum size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune de control antet nevalidă</translation>
</message>
<message>
<source>Header SHA256 mismatch</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation type="unfinished"/>
+ <translation>Antet SHA256 nepotrivire</translation>
</message>
<message>
<source>Unknown cipher</source>
- <translation type="unfinished"/>
+ <translation>Cifru necunoscut</translation>
</message>
<message>
<source>Invalid header id size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune ID antet nevalidă</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation type="unfinished"/>
+ <translation>Lungime câmp antet nevalid</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation type="unfinished"/>
+ <translation>Lungime de date antet nevalidă</translation>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
- <translation type="unfinished"/>
+ <translation>Nu s-a reușit deschiderea tampon pentru parametrii KDF în antet</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
- <translation type="unfinished"/>
+ <translation>Funcția de derivare a cheii neacceptate (KDF) sau parametrii nevaliți</translation>
</message>
<message>
<source>Legacy header fields found in KDBX4 file.</source>
- <translation type="unfinished"/>
+ <translation>Câmpuri antet moștenite găsite în fișierul KDBX4.</translation>
</message>
<message>
<source>Invalid inner header id size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune ID antet interior nevalidă</translation>
</message>
<message>
<source>Invalid inner header field length</source>
- <translation type="unfinished"/>
+ <translation>Lungime câmp antet interior nevalid</translation>
</message>
<message>
<source>Invalid inner header binary size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune binar antet interior nevalid</translation>
</message>
<message>
<source>Unsupported KeePass variant map version.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Versiune de hartă variantă neacceptată.</translation>
</message>
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Lungime nevalidă a numelui intrării hărții de variantă</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Nume de intrare date hartă variantă nevalidă</translation>
</message>
<message>
<source>Invalid variant map entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Lungime nevalidă a valorii intrării hărții de variantă</translation>
</message>
<message>
<source>Invalid variant map entry value data</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Date de valoare de intrare hartă variantă nevalidă</translation>
</message>
<message>
<source>Invalid variant map Bool entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Hartă variantă nevalidă lungimea valorii intrării bool</translation>
</message>
<message>
<source>Invalid variant map Int32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Hartă variantă nevalidă Int32 lungime valoare intrare</translation>
</message>
<message>
<source>Invalid variant map UInt32 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Hartă variantă nevalidă UInt32 lungime valoare intrare</translation>
</message>
<message>
<source>Invalid variant map Int64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Hartă variantă nevalidă Int64 lungime valoare intrare</translation>
</message>
<message>
<source>Invalid variant map UInt64 entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Hartă variantă nevalidă UInt64 lungime valoare intrare</translation>
</message>
<message>
<source>Invalid variant map entry type</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Tip de intrare hartă variantă nevalidă</translation>
</message>
<message>
<source>Invalid variant map field type size</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
+ <translation>Dimensiune tip câmp hartă variantă nevalidă</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2756,12 +3658,12 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx4Writer</name>
<message>
<source>Invalid symmetric cipher algorithm.</source>
- <translation type="unfinished"/>
+ <translation>Algoritm de cifrare simetrică nevalid.</translation>
</message>
<message>
<source>Invalid symmetric cipher IV size.</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation type="unfinished"/>
+ <translation>Cifrul simetric nevalid dimensiune IV.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2770,46 +3672,46 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Nu s-a reușit serializarea hărții variantei parametrilor KDF</translation>
</message>
</context>
<context>
<name>KdbxReader</name>
<message>
<source>Unsupported cipher</source>
- <translation type="unfinished"/>
+ <translation>Cifru neacceptat</translation>
</message>
<message>
<source>Invalid compression flags length</source>
- <translation type="unfinished"/>
+ <translation>Lungime steaguri de compresie nevalidă</translation>
</message>
<message>
<source>Unsupported compression algorithm</source>
- <translation type="unfinished"/>
+ <translation>Algoritm de compresie neacceptat</translation>
</message>
<message>
<source>Invalid master seed size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune de semințe coordonatoare nevalidă</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune de semințe de transformare nevalidă</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorectă a rundelor de transformare </translation>
</message>
<message>
<source>Invalid start bytes size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă a octeților de pornire </translation>
</message>
<message>
<source>Invalid random stream id size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorectă a fluxului de flux aleator</translation>
</message>
<message>
<source>Invalid inner random stream cipher</source>
- <translation type="unfinished"/>
+ <translation>Cifrul intern nevalid al fluxului aleator</translation>
</message>
<message>
<source>Not a KeePass database.</source>
@@ -2820,160 +3722,165 @@ This may cause the affected plugins to malfunction.</source>
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"/>
+ <translation>Fișierul selectat este o bază de date vechi KeePass 1 (.KDB).
+
+Tu poți importa prin click pe bază de date &gt; &apos;importarea bază de date KeePass 1... &apos;.
+Aceasta este o migrare într-un singur sens. Nu veți putea deschide baza de date importată cu vechea versiune KeePassX 0,4.</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
- <translation type="unfinished"/>
+ <translation>Versiunea bazei de date KeePass 2 neacceptată.</translation>
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
- <translation type="unfinished"/>
+ <translation>lungime nevalidă a UUID criptat: %1 (lungime = %2)</translation>
</message>
<message>
<source>Unable to parse UUID: %1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de analizat UUID: %1</translation>
</message>
<message>
<source>Failed to read database file.</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de citit fișierul bazei de date.</translation>
</message>
</context>
<context>
<name>KdbxXmlReader</name>
<message>
<source>XML parsing failure: %1</source>
- <translation type="unfinished"/>
+ <translation>Eroare de analizare XML: %1</translation>
</message>
<message>
<source>No root group</source>
- <translation type="unfinished"/>
+ <translation>Nici un grup rădăcină</translation>
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation type="unfinished"/>
+ <translation>Lipsește pictograma UUID sau date</translation>
</message>
<message>
<source>Missing custom data key or value</source>
- <translation type="unfinished"/>
+ <translation>Lipsă de cheie sau valoare de date particularizate </translation>
</message>
<message>
<source>Multiple group elements</source>
- <translation type="unfinished"/>
+ <translation>Mai multe elemente de grup</translation>
</message>
<message>
<source>Null group uuid</source>
- <translation type="unfinished"/>
+ <translation>Grup nul UUID</translation>
</message>
<message>
<source>Invalid group icon number</source>
- <translation type="unfinished"/>
+ <translation>Numărul pictogramei de grup nevalid</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
- <translation type="unfinished"/>
+ <translation>Valoare nevalidă pentru permite AutoTiparire </translation>
</message>
<message>
<source>Invalid EnableSearching value</source>
- <translation type="unfinished"/>
+ <translation>Valoare nevalidă pentru Permite cautare </translation>
</message>
<message>
<source>No group uuid found</source>
- <translation type="unfinished"/>
+ <translation>Nici un grup UUID găsit</translation>
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation type="unfinished"/>
+ <translation>UUID Null pentru Sterge Obiect </translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
- <translation type="unfinished"/>
+ <translation>Lipsă UUID sau timp pentru Obiect Sters</translation>
</message>
<message>
<source>Null entry uuid</source>
- <translation type="unfinished"/>
+ <translation>Intrare nulă UUID</translation>
</message>
<message>
<source>Invalid entry icon number</source>
- <translation type="unfinished"/>
+ <translation>Număr pictogramă de intrare nevalidă</translation>
</message>
<message>
<source>History element in history entry</source>
- <translation type="unfinished"/>
+ <translation>Element istoric în intrarea în istorie</translation>
</message>
<message>
<source>No entry uuid found</source>
- <translation type="unfinished"/>
+ <translation>Nici o intrare UUID găsit</translation>
</message>
<message>
<source>History element with different uuid</source>
- <translation type="unfinished"/>
+ <translation>Element istoric cu diferite UUID</translation>
</message>
<message>
<source>Duplicate custom attribute found</source>
- <translation type="unfinished"/>
+ <translation>Atribut personalizat duplicat găsit</translation>
</message>
<message>
<source>Entry string key or value missing</source>
- <translation type="unfinished"/>
+ <translation>Cheie șir de intrare sau valoare lipsă</translation>
</message>
<message>
<source>Duplicate attachment found</source>
- <translation type="unfinished"/>
+ <translation>Atașare dublată găsită</translation>
</message>
<message>
<source>Entry binary key or value missing</source>
- <translation type="unfinished"/>
+ <translation>Intrare cheie binare sau valoare lipsă</translation>
</message>
<message>
<source>Auto-type association window or sequence missing</source>
- <translation type="unfinished"/>
+ <translation>Lipsă de fereastra de asociere de tiparire auto sau secvența </translation>
</message>
<message>
<source>Invalid bool value</source>
- <translation type="unfinished"/>
+ <translation>Valoare bool nevalidă</translation>
</message>
<message>
<source>Invalid date time value</source>
- <translation type="unfinished"/>
+ <translation>Valoare dată nevalidă </translation>
</message>
<message>
<source>Invalid color value</source>
- <translation type="unfinished"/>
+ <translation>Valoare de culoare nevalidă</translation>
</message>
<message>
<source>Invalid color rgb part</source>
- <translation type="unfinished"/>
+ <translation>Parte RGB de culoare nevalidă</translation>
</message>
<message>
<source>Invalid number value</source>
- <translation type="unfinished"/>
+ <translation>Valoare numerică nevalidă</translation>
</message>
<message>
<source>Invalid uuid value</source>
- <translation type="unfinished"/>
+ <translation>Valoare UUID nevalidă</translation>
</message>
<message>
<source>Unable to decompress binary</source>
<extracomment>Translator meant is a binary data inside an entry</extracomment>
- <translation type="unfinished"/>
+ <translation>Imposibilde a decomprima binar</translation>
</message>
<message>
<source>XML error:
%1
Line %2, column %3</source>
- <translation type="unfinished"/>
+ <translation>Eroare XML:
+%1
+Linia %2, coloana %3</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation type="unfinished"/>
+ <source>Unable to open the database.</source>
+ <translation>Baza de date nu poate fi deschisă.</translation>
</message>
<message>
- <source>Unable to open the database.</source>
- <translation>Nu pot deschide baza de date.</translation>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2997,31 +3904,31 @@ Line %2, column %3</source>
<message>
<source>Unable to read encryption IV</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation type="unfinished"/>
+ <translation>Imposibil de citit criptarea IV</translation>
</message>
<message>
<source>Invalid number of groups</source>
- <translation type="unfinished"/>
+ <translation>Număr nevalid de grupuri</translation>
</message>
<message>
<source>Invalid number of entries</source>
- <translation type="unfinished"/>
+ <translation>Număr nevalid de intrări</translation>
</message>
<message>
<source>Invalid content hash size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune hash conținut nevalidă</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune de semințe de transformare nevalidă</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation type="unfinished"/>
+ <translation>Număr nevalid de runde de transformare</translation>
</message>
<message>
<source>Unable to construct group tree</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de construit arborele de grup</translation>
</message>
<message>
<source>Root</source>
@@ -3032,122 +3939,151 @@ Line %2, column %3</source>
<translation>Nu a putut fi calculată cheia principală</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Cheie greșită sau fișier bază de date corupt.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
- <translation type="unfinished"/>
+ <translation>Transformarea cheii nu a reușit</translation>
</message>
<message>
<source>Invalid group field type number</source>
- <translation type="unfinished"/>
+ <translation>Număr de câmp de grupă nevalid</translation>
</message>
<message>
<source>Invalid group field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune câmp de grup nevalid</translation>
</message>
<message>
<source>Read group field data doesn&apos;t match size</source>
- <translation type="unfinished"/>
+ <translation>Citirea datelor câmpului de grup nu corespunde dimensiunii</translation>
</message>
<message>
<source>Incorrect group id field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorecta a câmpului ID grup</translation>
</message>
<message>
<source>Incorrect group creation time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorect a câmpului de timp creare grup</translation>
</message>
<message>
<source>Incorrect group modification time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiunea incorectă a câmpului pentru modificarea grupelor</translation>
</message>
<message>
<source>Incorrect group access time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorecta câmpului timp de acces a grupului</translation>
</message>
<message>
<source>Incorrect group expiry time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiunea incorecta a câmpului timp de expirare grup </translation>
</message>
<message>
<source>Incorrect group icon field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorecta a câmpului pictogramă grupei</translation>
</message>
<message>
<source>Incorrect group level field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune incorecta a câmpului nivelul grupei</translation>
</message>
<message>
<source>Invalid group field type</source>
- <translation type="unfinished"/>
+ <translation>Tip nevalid a câmpului grup </translation>
</message>
<message>
<source>Missing group id or level</source>
- <translation type="unfinished"/>
+ <translation>Lipsă ID-ul grupului sau nivelul</translation>
</message>
<message>
<source>Missing entry field type number</source>
- <translation type="unfinished"/>
+ <translation>Lipsă numărului tipului câmpului de intrare</translation>
</message>
<message>
<source>Invalid entry field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă câmp intrare </translation>
</message>
<message>
<source>Read entry field data doesn&apos;t match size</source>
- <translation type="unfinished"/>
+ <translation>Citirea datelor câmpului de intrare nu corespunde dimensiunii</translation>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă a câmpului UUID intrare </translation>
</message>
<message>
<source>Invalid entry group id field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalida a câmpului ID grup de intrare </translation>
</message>
<message>
<source>Invalid entry icon field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă a câmpului pictogramă intrare </translation>
</message>
<message>
<source>Invalid entry creation time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă a câmpului marcă de timp de creare intrare </translation>
</message>
<message>
<source>Invalid entry modification time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă a câmpului marcă de timp modificarii intrare</translation>
</message>
<message>
<source>Invalid entry expiry time field size</source>
- <translation type="unfinished"/>
+ <translation>Dimensiune nevalidă a câmpului timp expirare intrare </translation>
</message>
<message>
<source>Invalid entry field type</source>
- <translation type="unfinished"/>
+ <translation>Tipul câmpului de intrare nevalid</translation>
</message>
<message>
<source>unable to seek to content position</source>
+ <translation>imposibilitatea de a căuta la poziția de conținut</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importat din %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
+ <source>Imported from</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
+ <source>Exported to</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3155,11 +4091,11 @@ Line %2, column %3</source>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation type="unfinished"/>
+ <translation>Componenta cheie</translation>
</message>
<message>
<source>Key Component Description</source>
- <translation type="unfinished"/>
+ <translation>Descriere componentă cheie</translation>
</message>
<message>
<source>Cancel</source>
@@ -3167,62 +4103,62 @@ Line %2, column %3</source>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation type="unfinished"/>
+ <translation>Set de componente cheie, faceți clic pentru a modifica sau elimina</translation>
</message>
<message>
<source>Add %1</source>
<comment>Add a key component</comment>
- <translation type="unfinished"/>
+ <translation>Adăugare %1</translation>
</message>
<message>
<source>Change %1</source>
<comment>Change a key component</comment>
- <translation type="unfinished"/>
+ <translation>Modificare %1</translation>
</message>
<message>
<source>Remove %1</source>
<comment>Remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>Eliminare %1</translation>
</message>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>%1 set, faceți clic pentru a modifica sau elimina</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Răsfoiește</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generează</translation>
</message>
<message>
<source>Key File</source>
- <translation type="unfinished"/>
+ <translation>Fișier cheie</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Aveți posibilitatea să adăugați un fișier cheie care conține octeți aleatoare pentru securitate suplimentară.&lt;/p&gt;&lt;p&gt;Trebuie să-l păstrați secret și niciodată nu-l pierde sau vei fi blocat!&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
- <translation type="unfinished"/>
+ <translation>Format moștenit de fișier cheie </translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Utilizați un format de fișier cheie moștenit care poate deveni
+neacceptat în viitor.
+
+Vă rugăm să mergeți la setările principale cheie și generati un nou fișier cheie.</translation>
</message>
<message>
<source>Error loading the key file '%1'
Message: %2</source>
- <translation type="unfinished"/>
+ <translation>Eroare la încărcarea fișierului cheie &apos;%1&apos;
+Mesaj: %2</translation>
</message>
<message>
<source>Key files</source>
@@ -3238,78 +4174,115 @@ Message: %2</source>
</message>
<message>
<source>Error creating key file</source>
- <translation type="unfinished"/>
+ <translation>Eroare la crearea fișierului cheie</translation>
</message>
<message>
<source>Unable to create key file: %1</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de creat fișierul cheie: %1</translation>
</message>
<message>
<source>Select a key file</source>
<translation>Selectați un fișier cheie</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Răsfoiește...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>&amp;Database</source>
- <translation type="unfinished"/>
+ <translation>&amp;Bază de date</translation>
</message>
<message>
<source>&amp;Recent databases</source>
- <translation type="unfinished"/>
+ <translation>&amp;Baze de date recente</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ajutor</translation>
</message>
<message>
<source>E&amp;ntries</source>
- <translation type="unfinished"/>
+ <translation>I&amp;ntrări</translation>
</message>
<message>
<source>&amp;Groups</source>
- <translation type="unfinished"/>
+ <translation>&amp;Grupuri</translation>
</message>
<message>
<source>&amp;Tools</source>
- <translation type="unfinished"/>
+ <translation>&amp;Unelte</translation>
</message>
<message>
<source>&amp;Quit</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ieșire</translation>
</message>
<message>
<source>&amp;About</source>
- <translation type="unfinished"/>
+ <translation>&amp;Despre</translation>
</message>
<message>
<source>&amp;Open database...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Deschide baza de date...</translation>
</message>
<message>
<source>&amp;Save database</source>
- <translation type="unfinished"/>
+ <translation>&amp;Salvează bază de date</translation>
</message>
<message>
<source>&amp;Close database</source>
- <translation type="unfinished"/>
+ <translation>&amp;Închide baza de date</translation>
</message>
<message>
<source>&amp;Delete entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Șterge intrarea</translation>
</message>
<message>
<source>&amp;Edit group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Editează grupul</translation>
</message>
<message>
<source>&amp;Delete group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Șterge grupul</translation>
</message>
<message>
<source>Sa&amp;ve database as...</source>
- <translation type="unfinished"/>
+ <translation>Sa&amp;lvează bază de date ca...</translation>
</message>
<message>
<source>Database settings</source>
@@ -3317,47 +4290,43 @@ Message: %2</source>
</message>
<message>
<source>&amp;Clone entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Clonează intrarea</translation>
</message>
<message>
<source>Copy &amp;username</source>
- <translation type="unfinished"/>
+ <translation>Copiază &amp;numele de utilizator</translation>
</message>
<message>
<source>Copy username to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copiere nume utilizator în Clipboard</translation>
</message>
<message>
<source>Copy password to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copiere parolă în Clipboard</translation>
</message>
<message>
<source>&amp;Settings</source>
<translation>&amp;Setări</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Generator de parole</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation type="unfinished"/>
+ <translation>&amp;Blocare baze de date</translation>
</message>
<message>
<source>&amp;Title</source>
- <translation type="unfinished"/>
+ <translation>&amp;Titlu</translation>
</message>
<message>
<source>Copy title to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copiere titlu în Clipboard</translation>
</message>
<message>
<source>&amp;URL</source>
- <translation type="unfinished"/>
+ <translation>&amp;URL</translation>
</message>
<message>
<source>Copy URL to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copiere URL în Clipboard</translation>
</message>
<message>
<source>&amp;Notes</source>
@@ -3365,23 +4334,23 @@ Message: %2</source>
</message>
<message>
<source>Copy notes to clipboard</source>
- <translation type="unfinished"/>
+ <translation>Copierea notelor în Clipboard</translation>
</message>
<message>
<source>&amp;Export to CSV file...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Exportă în fișier CSV...</translation>
</message>
<message>
<source>Set up TOTP...</source>
- <translation type="unfinished"/>
+ <translation>Configurarea TOTP...</translation>
</message>
<message>
<source>Copy &amp;TOTP</source>
- <translation type="unfinished"/>
+ <translation>Copiază &amp;TOTP</translation>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
- <translation type="unfinished"/>
+ <translation>coș de r&amp;eciclare gol</translation>
</message>
<message>
<source>Clear history</source>
@@ -3389,7 +4358,7 @@ Message: %2</source>
</message>
<message>
<source>Access error for config file %1</source>
- <translation type="unfinished"/>
+ <translation>Eroare de acces pentru fisier de configurare %1</translation>
</message>
<message>
<source>Settings</source>
@@ -3397,154 +4366,218 @@ Message: %2</source>
</message>
<message>
<source>Toggle window</source>
- <translation type="unfinished"/>
+ <translation>Comutare fereastră</translation>
</message>
<message>
<source>Quit KeePassXC</source>
- <translation type="unfinished"/>
+ <translation>Părăsiți KeePassXC</translation>
</message>
<message>
<source>Please touch the button on your YubiKey!</source>
- <translation type="unfinished"/>
+ <translation>Vă rugăm să atingeți butonul de pe YubiKey dvs.!</translation>
</message>
<message>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation type="unfinished"/>
+ <translation>Avertisment: utilizați un build instabil de KeePassXC!
+Există un risc ridicat de corupție, menține o copie de rezervă a bazelor de date.
+Această versiune nu este destinată utilizării producției.</translation>
</message>
<message>
<source>&amp;Donate</source>
- <translation type="unfinished"/>
+ <translation>&amp;Donează</translation>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation type="unfinished"/>
+ <translation>Reportează un &amp;defect</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
- <translation type="unfinished"/>
+ <translation>Avertisment: versiunea dumneavoastră QT poate provoca KeePassXC să se blocheze cu o tastatură vizuală!
+Vă recomandăm să utilizați AppImage disponibile pe pagina noastră de descărcări.</translation>
</message>
<message>
<source>&amp;Import</source>
- <translation type="unfinished"/>
+ <translation>&amp;Import</translation>
</message>
<message>
<source>Copy att&amp;ribute...</source>
- <translation type="unfinished"/>
+ <translation>Copiază at&amp;ributul...</translation>
</message>
<message>
<source>TOTP...</source>
- <translation type="unfinished"/>
+ <translation>TOTP...</translation>
</message>
<message>
<source>&amp;New database...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Bază de date nouă</translation>
</message>
<message>
<source>Create a new database</source>
- <translation type="unfinished"/>
+ <translation>Crearea unei baze de date noi</translation>
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Merge din baza de date...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
- <translation type="unfinished"/>
+ <translation>Îmbinare dintr-o altă bază de date KDBX</translation>
</message>
<message>
<source>&amp;New entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Intrare nouă</translation>
</message>
<message>
<source>Add a new entry</source>
- <translation type="unfinished"/>
+ <translation>Adăugarea unei noi intrări</translation>
</message>
<message>
<source>&amp;Edit entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Editează intrarea</translation>
</message>
<message>
<source>View or edit entry</source>
- <translation type="unfinished"/>
+ <translation>Vizualizarea sau editarea intrării</translation>
</message>
<message>
<source>&amp;New group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Grup nou</translation>
</message>
<message>
<source>Add a new group</source>
- <translation type="unfinished"/>
+ <translation>Adăugarea unui grup nou</translation>
</message>
<message>
<source>Change master &amp;key...</source>
- <translation type="unfinished"/>
+ <translation>Modifică &amp;cheia principală</translation>
</message>
<message>
<source>&amp;Database settings...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Setări bază de date...</translation>
</message>
<message>
<source>Copy &amp;password</source>
- <translation type="unfinished"/>
+ <translation>Copiază &amp;parola</translation>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>Efectuați și &amp;Auto-Tiparire</translation>
</message>
<message>
<source>Open &amp;URL</source>
- <translation type="unfinished"/>
+ <translation>Deschide &amp;URL-ul</translation>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation type="unfinished"/>
+ <translation>KeePass 1 bază de date...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
- <translation type="unfinished"/>
+ <translation>Importul unei baze de date KeePass 1</translation>
</message>
<message>
<source>CSV file...</source>
- <translation type="unfinished"/>
+ <translation>Fișier CSV...</translation>
</message>
<message>
<source>Import a CSV file</source>
- <translation type="unfinished"/>
+ <translation>Importul unui fișier CSV</translation>
</message>
<message>
<source>Show TOTP...</source>
- <translation type="unfinished"/>
+ <translation>Afișare TOTP...</translation>
</message>
<message>
<source>Show TOTP QR Code...</source>
+ <translation>Afișare cod QR TOTP...</translation>
+ </message>
+ <message>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <translation>Notă: utilizați o versiune pre-release de KeePassXC!
+Asteptati-va unele bug-uri și probleme minore, această versiune nu este destinat pentru utilizarea producției.</translation>
+ </message>
+ <message>
+ <source>Check for updates on startup?</source>
+ <translation>Căutați actualizări la pornire?</translation>
+ </message>
+ <message>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
+ <translation>Doriți ca KeePassXC să caute actualizări la pornire?</translation>
+ </message>
+ <message>
+ <source>You can always check for updates manually from the application menu.</source>
+ <translation>Puteți căuta întotdeauna actualizări manual din meniul aplicației.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for Updates...</source>
+ <source>&amp;Check for Updates...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Share entry</source>
+ <source>Downlo&amp;ad all favicons</source>
<translation type="unfinished"/>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Sort &amp;A-Z</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>Sort &amp;Z-A</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>&amp;Password Generator</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>Download favicon</source>
+ <translation>Descarcă favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3552,58 +4585,66 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Creare lipsă %1 [%2]</translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Relocalizarea %1 [%2]</translation>
</message>
<message>
<source>Overwriting %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Suprascrierea %1 [%2]</translation>
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation type="unfinished"/>
+ <translation>intrare mai veche îmbinată din baza de date &quot;%1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Adăugarea copiei de rezervă pentru ținta mai veche %1 [%2]</translation>
</message>
<message>
<source>Adding backup for older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Adăugarea copiei de rezervă pentru sursa mai veche %1 [%2]</translation>
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Reaplicarea intrării țintă mai vechi în partea de sus a sursei mai noi %1 [%2]</translation>
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Reaplicarea intrării sursei mai vechi în partea de sus a țintei mai noi %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sincronizarea din sursa mai nouă %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Sincronizarea din sursa mai veche %1 [%2]</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Ștergerea copilului %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Ștergerea intrarii orfane %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
- <translation type="unfinished"/>
+ <translation>Obiecte șterse modificate</translation>
</message>
<message>
<source>Adding missing icon %1</source>
+ <translation>Adăugarea pictogramei lipsă %1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3611,7 +4652,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation type="unfinished"/>
+ <translation>Creați o nouă bază de date KeePassXC...</translation>
</message>
<message>
<source>Root</source>
@@ -3623,55 +4664,121 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizardPage</name>
<message>
<source>WizardPage</source>
- <translation type="unfinished"/>
+ <translation>Pagină de start</translation>
</message>
<message>
<source>En&amp;cryption Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări cri&amp;ptare</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Aici aveți posibilitatea să ajustați setările de criptare a bazei de date. Nu vă faceți griji, le puteți modifica mai târziu în setările bazei de date.</translation>
</message>
<message>
<source>Advanced Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări avansate</translation>
</message>
<message>
<source>Simple Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări simple</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageEncryption</name>
<message>
<source>Encryption Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări criptare</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Aici aveți posibilitatea să ajustați setările de criptare a bazei de date. Nu vă faceți griji, le puteți modifica mai târziu în setările bazei de date.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMasterKey</name>
<message>
<source>Database Master Key</source>
- <translation type="unfinished"/>
+ <translation>Cheie bază de date Master</translation>
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation type="unfinished"/>
+ <translation>O cheie principală cunoscută numai pentru tine protejează baza de date.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMetaData</name>
<message>
<source>General Database Information</source>
- <translation type="unfinished"/>
+ <translation>Informații generale despre baza de date</translation>
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
+ <translation>Vă rugăm să completați numele afișat și o descriere opțională pentru noua bază de date:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3679,27 +4786,27 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
- <translation type="unfinished"/>
+ <translation>Fișier cheie nevalid, așteptând o cheie OpenSSH</translation>
</message>
<message>
<source>PEM boundary mismatch</source>
- <translation type="unfinished"/>
+ <translation>Nepotrivire de graniță PEM</translation>
</message>
<message>
<source>Base64 decoding failed</source>
- <translation type="unfinished"/>
+ <translation>Decodificare base64 nu a reușit</translation>
</message>
<message>
<source>Key file way too small.</source>
- <translation type="unfinished"/>
+ <translation>Cheie dosar mult prea mic.</translation>
</message>
<message>
<source>Key file magic header id invalid</source>
- <translation type="unfinished"/>
+ <translation>Cheie dosar Magic antet ID nevalid</translation>
</message>
<message>
<source>Found zero keys</source>
- <translation type="unfinished"/>
+ <translation>Găsit zero chei</translation>
</message>
<message>
<source>Failed to read public key.</source>
@@ -3707,70 +4814,81 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation type="unfinished"/>
+ <translation>Fișier cheie deteriorat, citirea cheii private nu a reușit</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation type="unfinished"/>
+ <translation>Nici o sarcină cheie privată pentru a decripta</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
- <translation type="unfinished"/>
+ <translation>Încercarea de a rula KDF fără cifrul</translation>
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
- <translation type="unfinished"/>
+ <translation>Passphrase este necesar pentru a decripta această tastă</translation>
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation type="unfinished"/>
+ <translation>Derivare cheie nu a reușit, fișierul cheie corupt?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation type="unfinished"/>
+ <translation>Decriptarea nu a reușit, fraza de acces greșită?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation type="unfinished"/>
+ <translation>EOF neașteptate în timpul citirii cheii publice</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation type="unfinished"/>
+ <translation>EOF neașteptate în timp ce citiți cheia privată</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
- <translation type="unfinished"/>
+ <translation>Nu se poate scrie cheie publică, deoarece este goală</translation>
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation type="unfinished"/>
+ <translation>EOF neașteptate atunci când scrierea cheie publică</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
- <translation type="unfinished"/>
+ <translation>Nu se poate scrie cheie privată, deoarece este goală</translation>
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation type="unfinished"/>
+ <translation>EOF neașteptate atunci când scrierea cheie privată</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
- <translation type="unfinished"/>
+ <translation>Tip de cheie neacceptat: %1</translation>
</message>
<message>
<source>Unknown cipher: %1</source>
- <translation type="unfinished"/>
+ <translation>Cifru necunoscut: %1</translation>
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
- <translation type="unfinished"/>
+ <translation>Cifrul IV este prea scurt pentru MD5 KDF</translation>
</message>
<message>
<source>Unknown KDF: %1</source>
- <translation type="unfinished"/>
+ <translation>KDF necunoscut: %1</translation>
</message>
<message>
<source>Unknown key type: %1</source>
+ <translation>Tip de cheie necunoscut: %1</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3782,7 +4900,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Confirm password:</source>
- <translation type="unfinished"/>
+ <translation>Confirmați parola:</translation>
</message>
<message>
<source>Password</source>
@@ -3790,18 +4908,30 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;O parolă este metoda primară pentru securizarea bazei de date.&lt;/p&gt;&lt;p&gt;Parolele bune sunt lungi și unice. KeePassXC poate genera unul pentru tine.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Passwords do not match.</source>
+ <translation>Parolele nu se potrivesc.</translation>
+ </message>
+ <message>
+ <source>Generate master password</source>
+ <translation>Generare parolă principală</translation>
+ </message>
+ <message>
+ <source>Password field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Password cannot be empty.</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Passwords do not match.</source>
+ <source>Repeat password field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Generate master password</source>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3826,31 +4956,19 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Password</source>
- <translation>Parolă</translation>
+ <translation>Parola</translation>
</message>
<message>
<source>Character Types</source>
<translation>Tipuri de caractere</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Litere mari</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Litere mici</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Numere</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Caractere speciale</translation>
- </message>
- <message>
<source>Extended ASCII</source>
- <translation type="unfinished"/>
+ <translation>Extins ASCII</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
@@ -3866,11 +4984,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passphrase</source>
- <translation type="unfinished"/>
+ <translation>Frază parola</translation>
</message>
<message>
<source>Wordlist:</source>
- <translation type="unfinished"/>
+ <translation>lista cuvintelor</translation>
</message>
<message>
<source>Word Separator:</source>
@@ -3918,29 +5036,21 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>ExtendedASCII</source>
- <translation type="unfinished"/>
+ <translation>ASCII Extins</translation>
</message>
<message>
<source>Switch to advanced mode</source>
- <translation type="unfinished"/>
+ <translation>Comutarea la modul avansat</translation>
</message>
<message>
<source>Advanced</source>
<translation>Avansat</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3950,86 +5060,146 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Braces</source>
- <translation type="unfinished"/>
+ <translation>Bretele</translation>
</message>
<message>
<source>{[(</source>
- <translation type="unfinished"/>
+ <translation>{[(</translation>
</message>
<message>
<source>Punctuation</source>
- <translation type="unfinished"/>
+ <translation>Punctuaţie</translation>
</message>
<message>
<source>.,:;</source>
- <translation type="unfinished"/>
+ <translation>.,:;</translation>
</message>
<message>
<source>Quotes</source>
- <translation type="unfinished"/>
+ <translation>Citate</translation>
</message>
<message>
<source>&quot; &apos;</source>
+ <translation>&quot; &apos;</translation>
+ </message>
+ <message>
+ <source>&lt;*+!?=</source>
+ <translation>&lt;*+!?=&gt;&lt;/*+!?=&gt;</translation>
+ </message>
+ <message>
+ <source>\_|-/</source>
+ <translation>\_|-/</translation>
+ </message>
+ <message>
+ <source>Logograms</source>
+ <translation>Logograme</translation>
+ </message>
+ <message>
+ <source>#$%&amp;&amp;@^`~</source>
+ <translation>#$%&amp;&amp;@^`~</translation>
+ </message>
+ <message>
+ <source>Switch to simple mode</source>
+ <translation>Comutarea la modul simplu</translation>
+ </message>
+ <message>
+ <source>Simple</source>
+ <translation>Simplu</translation>
+ </message>
+ <message>
+ <source>Character set to exclude from generated password</source>
+ <translation>Set de caractere pentru a exclude din parola generată</translation>
+ </message>
+ <message>
+ <source>Do not include:</source>
+ <translation>Nu includeți:</translation>
+ </message>
+ <message>
+ <source>Add non-hex letters to &quot;do not include&quot; list</source>
+ <translation>Adăugați litere non-hex la &quot;nu includ&quot; lista</translation>
+ </message>
+ <message>
+ <source>Hex</source>
+ <translation>Hex</translation>
+ </message>
+ <message>
+ <source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
+ <translation>Caractere excluse: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;.&quot;</translation>
+ </message>
+ <message>
+ <source>Word Co&amp;unt:</source>
+ <translation>Număr c&amp;uvinte:</translation>
+ </message>
+ <message>
+ <source>Regenerate</source>
+ <translation>Regenera</translation>
+ </message>
+ <message>
+ <source>Generated password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Math</source>
+ <source>Upper-case letters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&lt;*+!?=</source>
+ <source>Lower-case letters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Dashes</source>
+ <source>Special characters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>\_|-/</source>
+ <source>Math Symbols</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Logograms</source>
+ <source>Dashes and Slashes</source>
<translation type="unfinished"/>
</message>
<message>
- <source>#$%&amp;&amp;@^`~</source>
+ <source>Excluded characters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Switch to simple mode</source>
+ <source>Hex Passwords</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Simple</source>
+ <source>Password length</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Character set to exclude from generated password</source>
+ <source>Word Case:</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do not include:</source>
+ <source>Regenerate password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Add non-hex letters to &quot;do not include&quot; list</source>
+ <source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Hex</source>
+ <source>Accept password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
+ <source>lower case</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Word Co&amp;unt:</source>
+ <source>UPPER CASE</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Regenerate</source>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4037,13 +5207,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QApplication</name>
<message>
<source>KeeShare</source>
- <translation type="unfinished"/>
+ <translation>De la KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4051,7 +5218,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QMessageBox</name>
<message>
<source>Overwrite</source>
- <translation type="unfinished"/>
+ <translation>Suprascrie</translation>
</message>
<message>
<source>Delete</source>
@@ -4059,11 +5226,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation type="unfinished"/>
+ <translation>Muta</translation>
</message>
<message>
<source>Empty</source>
- <translation type="unfinished"/>
+ <translation>Gol</translation>
</message>
<message>
<source>Remove</source>
@@ -4071,7 +5238,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Skip</source>
- <translation type="unfinished"/>
+ <translation>Sări peste</translation>
</message>
<message>
<source>Disable</source>
@@ -4079,6 +5246,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Merge</source>
+ <translation>Îmbinare</translation>
+ </message>
+ <message>
+ <source>Continue</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4086,51 +5257,51 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QObject</name>
<message>
<source>Database not opened</source>
- <translation type="unfinished"/>
+ <translation>Bază de date nedeschisă</translation>
</message>
<message>
<source>Database hash not available</source>
- <translation type="unfinished"/>
+ <translation>Hash bază de date nu este disponibilă</translation>
</message>
<message>
<source>Client public key not received</source>
- <translation type="unfinished"/>
+ <translation>Cheie publică client neprimită</translation>
</message>
<message>
<source>Cannot decrypt message</source>
- <translation type="unfinished"/>
+ <translation>Nu se poate decripta mesajul</translation>
</message>
<message>
<source>Action cancelled or denied</source>
- <translation type="unfinished"/>
+ <translation>Acțiune anulată sau refuzată</translation>
</message>
<message>
<source>KeePassXC association failed, try again</source>
- <translation type="unfinished"/>
+ <translation>Asociația KeePassXC nu a reușit, încercați din nou</translation>
</message>
<message>
<source>Encryption key is not recognized</source>
- <translation type="unfinished"/>
+ <translation>Cheia de criptare nu este recunoscută</translation>
</message>
<message>
<source>Incorrect action</source>
- <translation type="unfinished"/>
+ <translation>Acțiune incorectă</translation>
</message>
<message>
<source>Empty message received</source>
- <translation type="unfinished"/>
+ <translation>Mesaj gol primit</translation>
</message>
<message>
<source>No URL provided</source>
- <translation type="unfinished"/>
+ <translation>Niciun URL furnizat</translation>
</message>
<message>
<source>No logins found</source>
- <translation type="unfinished"/>
+ <translation>Nu s-au găsit conectări</translation>
</message>
<message>
<source>Unknown error</source>
- <translation type="unfinished"/>
+ <translation>Eroare necunoscută</translation>
</message>
<message>
<source>Add a new entry to a database.</source>
@@ -4138,7 +5309,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Path of the database.</source>
- <translation>Calea către baza de date</translation>
+ <translation>Calea către baza de date.</translation>
</message>
<message>
<source>Key file of the database.</source>
@@ -4150,7 +5321,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Username for the entry.</source>
- <translation type="unfinished"/>
+ <translation>Nume de utilizator pentru intrare.</translation>
</message>
<message>
<source>username</source>
@@ -4158,7 +5329,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>URL for the entry.</source>
- <translation type="unfinished"/>
+ <translation>URL pentru intrare.</translation>
</message>
<message>
<source>URL</source>
@@ -4166,15 +5337,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Prompt for the entry&apos;s password.</source>
- <translation type="unfinished"/>
+ <translation>Se solicită parola intrării.</translation>
</message>
<message>
<source>Generate a password for the entry.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Length for the generated password.</source>
- <translation>Lungimea parolei generate.</translation>
+ <translation>Generează o parolă pentru intrare.</translation>
</message>
<message>
<source>length</source>
@@ -4182,20 +5349,20 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Path of the entry to add.</source>
- <translation type="unfinished"/>
+ <translation>Calea intrării de adăugat.</translation>
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Copiați parola unei intrări în Clipboard.</translation>
</message>
<message>
<source>Path of the entry to clip.</source>
<comment>clip = copy to clipboard</comment>
- <translation type="unfinished"/>
+ <translation>Calea intrării în clip.</translation>
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Expirare în câteva secunde înainte de Golirea Clipboard.</translation>
</message>
<message>
<source>Edit an entry.</source>
@@ -4211,38 +5378,29 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Path of the entry to edit.</source>
- <translation type="unfinished"/>
+ <translation>Calea intrării de editat.</translation>
</message>
<message>
<source>Estimate the entropy of a password.</source>
- <translation type="unfinished"/>
+ <translation>Estimați entropia a unei parole.</translation>
</message>
<message>
<source>Password for which to estimate the entropy.</source>
- <translation type="unfinished"/>
+ <translation>Parola pentru care să estimezi entropia.</translation>
</message>
<message>
<source>Perform advanced analysis on the password.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Extract and print the content of a database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Calea bazei de date pentru extragere.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation type="unfinished"/>
+ <translation>Efectuați o analiză avansată a parolei.</translation>
</message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Avertisment: utilizați un format de fișier cheie moștenit care poate deveni
+neacceptat în viitor.
+
+Vă rugăm să luați în considerare generarea unui nou fișier cheie.</translation>
</message>
<message>
<source>
@@ -4260,15 +5418,15 @@ Comenzi disponibile:
</message>
<message>
<source>List database entries.</source>
- <translation type="unfinished"/>
+ <translation>Listare intrări din bază de date.</translation>
</message>
<message>
<source>Path of the group to list. Default is /</source>
- <translation type="unfinished"/>
+ <translation>Calea grupului la listă. Implicit este/</translation>
</message>
<message>
<source>Find entries quickly.</source>
- <translation type="unfinished"/>
+ <translation>Găsiți rapid intrările.</translation>
</message>
<message>
<source>Search term.</source>
@@ -4279,28 +5437,24 @@ Comenzi disponibile:
<translation>Îmbina doua baze de date</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Path of the database to merge from.</source>
- <translation type="unfinished"/>
+ <translation>Calea bazei de date din care să fuzioneze.</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation type="unfinished"/>
+ <translation>Utilizați aceleași acreditări pentru ambele fișiere de baze de date.</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
- <translation type="unfinished"/>
+ <translation>Fișier cheie al bazei de date pentru a fuziona din.</translation>
</message>
<message>
<source>Show an entry&apos;s information.</source>
- <translation type="unfinished"/>
+ <translation>Afișați informațiile unei intrări.</translation>
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
- <translation type="unfinished"/>
+ <translation>Numele atributelor de arătat. Această opțiune poate fi specificată de mai multe ori, fiecare atribut fiind afișat într-o singură linie în ordinea dată. Dacă nu sunt specificate atribute, se acordă un rezumat al atributelor implicite.</translation>
</message>
<message>
<source>attribute</source>
@@ -4308,23 +5462,23 @@ Comenzi disponibile:
</message>
<message>
<source>Name of the entry to show.</source>
- <translation type="unfinished"/>
+ <translation>Numele intrării de arătat.</translation>
</message>
<message>
<source>NULL device</source>
- <translation type="unfinished"/>
+ <translation>Dispozitiv NULL</translation>
</message>
<message>
<source>error reading from device</source>
- <translation type="unfinished"/>
+ <translation>citirea erorilor de pe dispozitiv</translation>
</message>
<message>
<source>malformed string</source>
- <translation type="unfinished"/>
+ <translation>șir incorect</translation>
</message>
<message>
<source>missing closing quote</source>
- <translation type="unfinished"/>
+ <translation>lipsă citat de închidere</translation>
</message>
<message>
<source>Group</source>
@@ -4340,7 +5494,7 @@ Comenzi disponibile:
</message>
<message>
<source>Password</source>
- <translation>Parolă</translation>
+ <translation>Parola</translation>
</message>
<message>
<source>Notes</source>
@@ -4348,21 +5502,17 @@ Comenzi disponibile:
</message>
<message>
<source>Last Modified</source>
- <translation type="unfinished"/>
+ <translation>Ultima modificare</translation>
</message>
<message>
<source>Created</source>
- <translation type="unfinished"/>
+ <translation>Creat</translation>
</message>
<message>
<source>Browser Integration</source>
<translation>Integrare cu browserul</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Press</source>
<translation>Apasă</translation>
</message>
@@ -4376,453 +5526,745 @@ Comenzi disponibile:
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
- <translation type="unfinished"/>
+ <translation>Generează o nouă frază de acces diceware aleatoare.</translation>
</message>
<message>
<source>Word count for the diceware passphrase.</source>
- <translation type="unfinished"/>
+ <translation>Word conta pentru fraza de acces diceware.</translation>
</message>
<message>
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
- <translation type="unfinished"/>
+ <translation>Lista de cuvinte pentru generatorul de diceware.
+[Default: EFF engleză]</translation>
</message>
<message>
<source>Generate a new random password.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
+ <translation>Generează o nouă parolă aleatorie.</translation>
</message>
<message>
<source>Could not create entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de creat intrarea cu calea %1.</translation>
</message>
<message>
<source>Enter password for new entry: </source>
- <translation type="unfinished"/>
+ <translation>Introduceți parola pentru intrare nouă:</translation>
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation type="unfinished"/>
+ <translation>Scrierea bazei de date nu a reușit %1.</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Intrare adăugată cu succes %1.</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Copiați TOTP curent în Clipboard.</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation type="unfinished"/>
+ <translation>Valoare de expirare nevalidă %1.</translation>
</message>
<message>
<source>Entry %1 not found.</source>
- <translation type="unfinished"/>
+ <translation>Intrarea %1 nu a fost găsită.</translation>
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
- <translation type="unfinished"/>
+ <translation>Intrarea cu calea %1 nu are TOTP configurat.</translation>
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>TOTP curent de intrare copiate în Clipboard!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>Parola de intrare copiate în Clipboard!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Golirea Clipboard-ului în% 1 second (s)...</numerusform><numerusform>Golirea Clipboard-ului în% 1 second (s)...</numerusform><numerusform>Golirea Clipboard-ului în %1 secunda (e)...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
- <translation type="unfinished"/>
+ <translation>Clipboard sters!</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation type="unfinished"/>
+ <translation>Tăcere parola prompt și alte ieșiri secundare.</translation>
</message>
<message>
<source>count</source>
<comment>CLI parameter</comment>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
+ <translation>număr</translation>
</message>
<message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Imposibil de găsit intrarea cu calea %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Nu se modifică niciun câmp pentru intrarea %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
- <translation type="unfinished"/>
+ <translation>Introduceți parola nouă pentru intrare:</translation>
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Scrierea bazei de date nu a reușit: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Intrare editată cu succes %1.</translation>
</message>
<message>
<source>Length %1</source>
- <translation type="unfinished"/>
+ <translation>Lungime %1</translation>
</message>
<message>
<source>Entropy %1</source>
- <translation type="unfinished"/>
+ <translation>Entropie %1</translation>
</message>
<message>
<source>Log10 %1</source>
- <translation type="unfinished"/>
+ <translation>Log10 %1</translation>
</message>
<message>
<source>Multi-word extra bits %1</source>
- <translation type="unfinished"/>
+ <translation>Multi-cuvânt extra Bits %1</translation>
</message>
<message>
<source>Type: Bruteforce</source>
- <translation type="unfinished"/>
+ <translation>Tipul: Bruteforce</translation>
</message>
<message>
<source>Type: Dictionary</source>
- <translation type="unfinished"/>
+ <translation>Tip: dicționar</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation type="unfinished"/>
+ <translation>Tip: dict + Leet</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation type="unfinished"/>
+ <translation>Tip: cuvinte utilizator</translation>
</message>
<message>
<source>Type: User+Leet</source>
- <translation type="unfinished"/>
+ <translation>Tip: utilizator + Leet</translation>
</message>
<message>
<source>Type: Repeated</source>
- <translation type="unfinished"/>
+ <translation>Tip: repetat</translation>
</message>
<message>
<source>Type: Sequence</source>
- <translation type="unfinished"/>
+ <translation>Tip: secvență</translation>
</message>
<message>
<source>Type: Spatial</source>
- <translation type="unfinished"/>
+ <translation>Tip: spatial</translation>
</message>
<message>
<source>Type: Date</source>
- <translation type="unfinished"/>
+ <translation>Tip: data</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tipul: Bruteforce (Rep)</translation>
</message>
<message>
<source>Type: Dictionary(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: Dicționar (Rep)</translation>
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: dict + Leet (Rep)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: cuvinte utilizator (Rep)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: utilizator + Leet (Rep)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: repetat (Rep)</translation>
</message>
<message>
<source>Type: Sequence(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: secvență (Rep)</translation>
</message>
<message>
<source>Type: Spatial(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: spatial (Rep)</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Tip: data (Rep)</translation>
</message>
<message>
<source>Type: Unknown%1</source>
- <translation type="unfinished"/>
+ <translation>Tip: necunoscut %1</translation>
</message>
<message>
<source>Entropy %1 (%2)</source>
- <translation type="unfinished"/>
+ <translation>Entropie %1 (%2)</translation>
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation type="unfinished"/>
+ <translation>*** Lungime parolă (%1) != suma de lungime a pieselor (%2) * * *</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
+ <translation>Încărcarea fișierului cheie %1: %2 nu a reușit</translation>
+ </message>
+ <message>
+ <source>Length of the generated password</source>
+ <translation>Lungimea parolei generate</translation>
+ </message>
+ <message>
+ <source>Use lowercase characters</source>
+ <translation>Folosește minuscule</translation>
+ </message>
+ <message>
+ <source>Use uppercase characters</source>
+ <translation>Folosește majuscule</translation>
+ </message>
+ <message>
+ <source>Use special characters</source>
+ <translation>Folosește caractere speciale</translation>
+ </message>
+ <message>
+ <source>Use extended ASCII</source>
+ <translation>Utilizarea ASCII extinsă</translation>
+ </message>
+ <message>
+ <source>Exclude character set</source>
+ <translation>Excludere set de caractere</translation>
+ </message>
+ <message>
+ <source>chars</source>
+ <translation>caractere</translation>
+ </message>
+ <message>
+ <source>Exclude similar looking characters</source>
+ <translation>Exclude caractere similare în căutarea</translation>
+ </message>
+ <message>
+ <source>Include characters from every selected group</source>
+ <translation>Includere caractere din fiecare grup selectat</translation>
+ </message>
+ <message>
+ <source>Recursively list the elements of the group.</source>
+ <translation>Recursiv lista elementele grupului.</translation>
+ </message>
+ <message>
+ <source>Cannot find group %1.</source>
+ <translation>Imposibil de găsit grupul %1.</translation>
+ </message>
+ <message>
+ <source>Error reading merge file:
+%1</source>
+ <translation>Eroare la citirea fișierului de îmbinare:
+%1</translation>
+ </message>
+ <message>
+ <source>Unable to save database to file : %1</source>
+ <translation>Imposibil de salvat baza de date în fișier: %1</translation>
+ </message>
+ <message>
+ <source>Unable to save database to file: %1</source>
+ <translation>Imposibil de salvat baza de date în fișier: %1</translation>
+ </message>
+ <message>
+ <source>Successfully recycled entry %1.</source>
+ <translation>Intrare reciclată cu succes %1.</translation>
+ </message>
+ <message>
+ <source>Successfully deleted entry %1.</source>
+ <translation>Intrare ștearsă cu succes %1.</translation>
+ </message>
+ <message>
+ <source>Show the entry&apos;s current TOTP.</source>
+ <translation>Afișați TOTP-ul curent al intrării.</translation>
+ </message>
+ <message>
+ <source>ERROR: unknown attribute %1.</source>
+ <translation>EROARE: atribut necunoscut %1.</translation>
+ </message>
+ <message>
+ <source>No program defined for clipboard manipulation</source>
+ <translation>Nici un program definit pentru manipularea Clipboard</translation>
+ </message>
+ <message>
+ <source>Unable to start program %1</source>
+ <translation>Imposibil de pornit programul %1</translation>
+ </message>
+ <message>
+ <source>file empty</source>
+ <translation>fișier gol</translation>
+ </message>
+ <message>
+ <source>%1: (row, col) %2,%3</source>
+ <translation>% 1: (rând, col) %2,%3</translation>
+ </message>
+ <message>
+ <source>AES: 256-bit</source>
+ <translation>AES: 256-biți</translation>
+ </message>
+ <message>
+ <source>Twofish: 256-bit</source>
+ <translation>Twofish: 256-biți</translation>
+ </message>
+ <message>
+ <source>ChaCha20: 256-bit</source>
+ <translation>ChaCha20: 256-biți</translation>
+ </message>
+ <message>
+ <source>Argon2 (KDBX 4 – recommended)</source>
+ <translation>Argon2 (KDBX 4 – recomandat)</translation>
+ </message>
+ <message>
+ <source>AES-KDF (KDBX 4)</source>
+ <translation>AES-KDF (KDBX 4)</translation>
+ </message>
+ <message>
+ <source>AES-KDF (KDBX 3.1)</source>
+ <translation>AES-KDF (KDBX 3.1)</translation>
+ </message>
+ <message>
+ <source>Invalid Settings</source>
+ <comment>TOTP</comment>
+ <translation>Setări invalide</translation>
+ </message>
+ <message>
+ <source>Invalid Key</source>
+ <comment>TOTP</comment>
+ <translation>Cheie invalidă</translation>
+ </message>
+ <message>
+ <source>Message encryption failed.</source>
+ <translation>Criptarea mesajelor nu a reușit.</translation>
+ </message>
+ <message>
+ <source>No groups found</source>
+ <translation>Nu s-au găsit grupuri</translation>
+ </message>
+ <message>
+ <source>Create a new database.</source>
+ <translation>Creează o bază de date nouă.</translation>
+ </message>
+ <message>
+ <source>File %1 already exists.</source>
+ <translation>Fișierul %1 există deja.</translation>
+ </message>
+ <message>
+ <source>Loading the key file failed</source>
+ <translation>Încărcarea fișierului cheie nu a reușit</translation>
+ </message>
+ <message>
+ <source>No key is set. Aborting database creation.</source>
+ <translation>Nu este setată nicio cheie. Abandonarea creării bazei de date.</translation>
+ </message>
+ <message>
+ <source>Failed to save the database: %1.</source>
+ <translation>Salvarea bazei de date nu a reușit: %1.</translation>
+ </message>
+ <message>
+ <source>Successfully created new database.</source>
+ <translation>Noua bază de date a fost creată cu succes.</translation>
+ </message>
+ <message>
+ <source>Creating KeyFile %1 failed: %2</source>
+ <translation>Crearea KeyFile %1 nu a reușit: %2</translation>
+ </message>
+ <message>
+ <source>Loading KeyFile %1 failed: %2</source>
+ <translation>Încărcarea KeyFile %1 nu a reușit: %2</translation>
+ </message>
+ <message>
+ <source>Path of the entry to remove.</source>
+ <translation>Calea intrării de eliminat.</translation>
+ </message>
+ <message>
+ <source>Existing single-instance lock file is invalid. Launching new instance.</source>
+ <translation>Fișierul de blocare cu o singură instanță existentă nu este valid. Lansează o nouă instanță.</translation>
+ </message>
+ <message>
+ <source>The lock file could not be created. Single-instance mode disabled.</source>
+ <translation>Imposibil de creat fișierul de blocare. Modul single-instanță dezactivat.</translation>
+ </message>
+ <message>
+ <source>KeePassXC - cross-platform password manager</source>
+ <translation>KeePassXC - manager de parole multi-platformă</translation>
+ </message>
+ <message>
+ <source>filenames of the password databases to open (*.kdbx)</source>
+ <translation>nume de fișiere de baze de date parola pentru a deschide (*.kdbx)</translation>
+ </message>
+ <message>
+ <source>path to a custom config file</source>
+ <translation>calea către un fișier de configurare particularizat</translation>
+ </message>
+ <message>
+ <source>key file of the database</source>
+ <translation>fișier cheie al bazei de date</translation>
+ </message>
+ <message>
+ <source>read password of the database from stdin</source>
+ <translation>citi parola bazei de date de la stdin</translation>
+ </message>
+ <message>
+ <source>Parent window handle</source>
+ <translation>Handle fereastră părinte</translation>
+ </message>
+ <message>
+ <source>Another instance of KeePassXC is already running.</source>
+ <translation>O altă instanță a KeePassXC este deja în execuție.</translation>
+ </message>
+ <message>
+ <source>Fatal error while testing the cryptographic functions.</source>
+ <translation>Eroare fatală în timpul testării funcțiilor criptografice.</translation>
+ </message>
+ <message>
+ <source>KeePassXC - Error</source>
+ <translation>KeePassXC - Eroare</translation>
+ </message>
+ <message>
+ <source>Database password: </source>
+ <translation>Parolă bază de date:</translation>
+ </message>
+ <message>
+ <source>Cannot create new group</source>
+ <translation>Imposibil de creat un grup nou</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File %1 does not exist.</source>
+ <source>Displays debugging information.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to open file %1.</source>
+ <source>Deactivate password key for the database to merge from.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Error while reading the database:
-%1</source>
+ <source>Version %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Error while parsing the database:
-%1</source>
+ <source>Build Type: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Length of the generated password</source>
+ <source>Revision: %1</source>
+ <translation>Revizie: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribuție: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Use lowercase characters</source>
+ <source>Debugging mode is enabled.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Use uppercase characters</source>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Sistem de operare: %1
+Arhitectura procesor (CPU): %2
+Nucleu (Kernel): %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Auto tiparire</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Use numbers.</source>
+ <source>KeeShare (only signed sharing)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Use special characters</source>
+ <source>KeeShare (only unsigned sharing)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Use extended ASCII</source>
+ <source>YubiKey</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Exclude character set</source>
+ <source>TouchID</source>
<translation type="unfinished"/>
</message>
<message>
- <source>chars</source>
+ <source>None</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Exclude similar looking characters</source>
+ <source>Enabled extensions:</source>
+ <translation>Extensii activate:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Include characters from every selected group</source>
+ <source>Cannot generate a password and prompt at the same time!</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Recursively list the elements of the group.</source>
+ <source>Adds a new group to a database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Cannot find group %1.</source>
+ <source>Path of the group to add.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Error reading merge file:
-%1</source>
+ <source>Group %1 already exists!</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to save database to file : %1</source>
+ <source>Group %1 not found.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to save database to file: %1</source>
+ <source>Successfully added group %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successfully recycled entry %1.</source>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successfully deleted entry %1.</source>
+ <source>FILENAME</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Show the entry&apos;s current TOTP.</source>
+ <source>Analyze passwords for weaknesses and problems.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>ERROR: unknown attribute %1.</source>
+ <source>Failed to open HIBP file %1: %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>No program defined for clipboard manipulation</source>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unable to start program %1</source>
+ <source>Close the currently opened database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>file empty</source>
+ <source>Display this help.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>%1: (row, col) %2,%3</source>
+ <source>Yubikey slot used to encrypt the database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>AES: 256-bit</source>
+ <source>slot</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Twofish: 256-bit</source>
+ <source>Invalid word count %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>ChaCha20: 256-bit</source>
+ <source>The word list is too small (&lt; 1000 items)</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Argon2 (KDBX 4 – recommended)</source>
+ <source>Exit interactive mode.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>AES-KDF (KDBX 4)</source>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>AES-KDF (KDBX 3.1)</source>
+ <source>Exports the content of a database to standard output in the specified format.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid Settings</source>
- <comment>TOTP</comment>
+ <source>Unable to export database to XML: %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid Key</source>
- <comment>TOTP</comment>
+ <source>Unsupported format %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Message encryption failed.</source>
+ <source>Use numbers</source>
<translation type="unfinished"/>
</message>
<message>
- <source>No groups found</source>
+ <source>Invalid password length %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Create a new database.</source>
+ <source>Display command help.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File %1 already exists.</source>
+ <source>Available commands:</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Loading the key file failed</source>
+ <source>Import the contents of an XML database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>No key is set. Aborting database creation.</source>
+ <source>Path of the XML database export.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Failed to save the database: %1.</source>
+ <source>Path of the new database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successfully created new database.</source>
+ <source>Unable to import XML database export %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
+ <source>Successfully imported database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Creating KeyFile %1 failed: %2</source>
+ <source>Unknown command %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Loading KeyFile %1 failed: %2</source>
+ <source>Flattens the output to single lines.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Eliminați o intrare din baza de date.</translation>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Path of the entry to remove.</source>
+ <source>Yubikey slot for the second database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Existing single-instance lock file is invalid. Launching new instance.</source>
+ <source>Successfully merged %1 into %2.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The lock file could not be created. Single-instance mode disabled.</source>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Baza de date nu a fost modificată de operațiunea de îmbinare.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeePassXC - cross-platform password manager</source>
+ <source>Path of the entry to move.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>filenames of the password databases to open (*.kdbx)</source>
+ <source>Path of the destination group.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>path to a custom config file</source>
+ <source>Could not find group with path %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>key file of the database</source>
+ <source>Entry is already in group %1.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>read password of the database from stdin</source>
+ <source>Successfully moved entry %1 to group %2.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Parent window handle</source>
+ <source>Open a database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Another instance of KeePassXC is already running.</source>
+ <source>Path of the group to remove.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Fatal error while testing the cryptographic functions.</source>
+ <source>Cannot remove root group from database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeePassXC - Error</source>
- <translation>KeePassXC - Eroare</translation>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Database password: </source>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4830,30 +6272,30 @@ Comenzi disponibile:
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
- <translation type="unfinished"/>
+ <translation>Eroare internă zlib la comprimarea:</translation>
</message>
<message>
<source>Error writing to underlying device: </source>
- <translation type="unfinished"/>
+ <translation>Eroare la scrierea dispozitivului subiacent:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
- <translation type="unfinished"/>
+ <translation>Eroare la deschiderea dispozitivului subiacent:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
- <translation type="unfinished"/>
+ <translation>Eroare la citirea datelor de pe dispozitivul subiacent:</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
- <translation type="unfinished"/>
+ <translation>Eroare internă zlib la decomprimare:</translation>
</message>
</context>
<context>
<name>QtIOCompressor::open</name>
<message>
<source>The gzip format not supported in this version of zlib.</source>
- <translation type="unfinished"/>
+ <translation>Formatul gzip nu este acceptat în această versiune de zlib.</translation>
</message>
<message>
<source>Internal zlib error: </source>
@@ -4864,90 +6306,90 @@ Comenzi disponibile:
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation type="unfinished"/>
+ <translation>Conexiunea agentului nu a reușit.</translation>
</message>
<message>
<source>Agent protocol error.</source>
- <translation type="unfinished"/>
+ <translation>Eroare de protocol agent.</translation>
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation type="unfinished"/>
+ <translation>Nu se execută niciun agent, nu se poate adăuga identitate.</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation type="unfinished"/>
+ <translation>Nu se execută niciun agent, nu se poate elimina identitatea.</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
- <translation type="unfinished"/>
+ <translation>Agentul a refuzat această identitate. Motive posibile includ:</translation>
</message>
<message>
<source>The key has already been added.</source>
- <translation type="unfinished"/>
+ <translation>Cheia a fost deja adăugată.</translation>
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>Durata de viață restricționată nu este acceptată de agent (opțiuni de verificare).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>O solicitare de confirmare nu este acceptată de agent (opțiuni de selectare).</translation>
</message>
</context>
<context>
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Căutare ajutor</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>Termenii de căutare sunt după urmează: [modifiers][field:][&quot;]term[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>Fiecare termen de căutare trebuie să corespundă (de exemplu, logică și)</translation>
</message>
<message>
<source>Modifiers</source>
- <translation type="unfinished"/>
+ <translation>Modificatori</translation>
</message>
<message>
<source>exclude term from results</source>
- <translation type="unfinished"/>
+ <translation>exclude termenul de la rezultate</translation>
</message>
<message>
<source>match term exactly</source>
- <translation type="unfinished"/>
+ <translation>termenul de potrivire exact</translation>
</message>
<message>
<source>use regex in term</source>
- <translation type="unfinished"/>
+ <translation>utilizarea regex în termen</translation>
</message>
<message>
<source>Fields</source>
- <translation type="unfinished"/>
+ <translation>Câmpuri</translation>
</message>
<message>
<source>Term Wildcards</source>
- <translation type="unfinished"/>
+ <translation>Wildcards pe termen</translation>
</message>
<message>
<source>match anything</source>
- <translation type="unfinished"/>
+ <translation>se potrivesc cu orice</translation>
</message>
<message>
<source>match one</source>
- <translation type="unfinished"/>
+ <translation>meci unul</translation>
</message>
<message>
<source>logical OR</source>
- <translation type="unfinished"/>
+ <translation>logică sau</translation>
</message>
<message>
<source>Examples</source>
- <translation type="unfinished"/>
+ <translation>Exemple</translation>
</message>
</context>
<context>
@@ -4966,15 +6408,102 @@ Comenzi disponibile:
</message>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Căutare ajutor</translation>
</message>
<message>
<source>Search (%1)...</source>
<comment>Search placeholder text, %1 is the keyboard shortcut</comment>
- <translation type="unfinished"/>
+ <translation>Căutare (%1)...</translation>
</message>
<message>
<source>Case sensitive</source>
+ <translation>Caz sensibil</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grup</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Setări bază de date</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Deblocare bază de date</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Blocare bază de date</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4982,31 +6511,31 @@ Comenzi disponibile:
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
- <translation type="unfinished"/>
+ <translation>Activ</translation>
</message>
<message>
<source>Allow export</source>
- <translation type="unfinished"/>
+ <translation>Se permite exportul</translation>
</message>
<message>
<source>Allow import</source>
- <translation type="unfinished"/>
+ <translation>Se permite importul</translation>
</message>
<message>
<source>Own certificate</source>
- <translation type="unfinished"/>
+ <translation>Certificat propriu</translation>
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>Amprentă:</translation>
</message>
<message>
<source>Certificate:</source>
- <translation type="unfinished"/>
+ <translation>Certificat:</translation>
</message>
<message>
<source>Signer</source>
- <translation type="unfinished"/>
+ <translation>Semnatar</translation>
</message>
<message>
<source>Key:</source>
@@ -5018,27 +6547,27 @@ Comenzi disponibile:
</message>
<message>
<source>Import</source>
- <translation type="unfinished"/>
+ <translation>Import</translation>
</message>
<message>
<source>Export</source>
- <translation type="unfinished"/>
+ <translation>Export</translation>
</message>
<message>
<source>Imported certificates</source>
- <translation type="unfinished"/>
+ <translation>Certificate importate</translation>
</message>
<message>
<source>Trust</source>
- <translation type="unfinished"/>
+ <translation>Încredere</translation>
</message>
<message>
<source>Ask</source>
- <translation type="unfinished"/>
+ <translation>Întreabă</translation>
</message>
<message>
<source>Untrust</source>
- <translation type="unfinished"/>
+ <translation>Fără încredere</translation>
</message>
<message>
<source>Remove</source>
@@ -5046,40 +6575,40 @@ Comenzi disponibile:
</message>
<message>
<source>Path</source>
- <translation type="unfinished"/>
+ <translation>Cale</translation>
</message>
<message>
<source>Status</source>
- <translation type="unfinished"/>
+ <translation>Stare</translation>
</message>
<message>
<source>Fingerprint</source>
- <translation type="unfinished"/>
+ <translation>Amprentă</translation>
</message>
<message>
<source>Certificate</source>
- <translation type="unfinished"/>
+ <translation>Certificat</translation>
</message>
<message>
<source>Trusted</source>
- <translation type="unfinished"/>
+ <translation>Încredere</translation>
</message>
<message>
<source>Untrusted</source>
- <translation type="unfinished"/>
+ <translation>Încredere</translation>
</message>
<message>
<source>Unknown</source>
- <translation type="unfinished"/>
+ <translation>Necunoscut</translation>
</message>
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation type="unfinished"/>
+ <translation>cheie.Share</translation>
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>KeeShare fisier-cheie </translation>
</message>
<message>
<source>All files</source>
@@ -5087,147 +6616,220 @@ Comenzi disponibile:
</message>
<message>
<source>Select path</source>
- <translation type="unfinished"/>
+ <translation>Selectare traseu</translation>
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>Exportul certificatului modificat</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation type="unfinished"/>
+ <translation>Certificatul exportat nu este identic cu cel utilizat. Exportați certificatul curent?</translation>
+ </message>
+ <message>
+ <source>Signer:</source>
+ <translation>Semnatar:</translation>
</message>
<message>
- <source>%1.%2</source>
- <comment>Template for KeeShare key file</comment>
+ <source>Allow KeeShare imports</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ShareObserver</name>
<message>
- <source>Import from container without signature</source>
+ <source>Allow KeeShare exports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Only show warnings and errors</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Key</source>
+ <translation>Cheie</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3</source>
+ <source>Generate new certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
+ <source>Import existing certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Never</source>
- <translation>Niciodată</translation>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Always</source>
+ <source>Known shares</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Just this time</source>
+ <source>Trust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Ask whether to trust the selected certificate every time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Untrust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Imported from %1</source>
+ <source>Remove selected certificate</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Suprascrierea container de partajare semnate nu este acceptată-exportul împiedicat</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Imposibil de scris containerul de export (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Imposibil de încorporat semnătura: Imposibil de deschis fișierul de scris (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Imposibil de încorporat semnătura: Imposibil de scris fișierul (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Imposibil de încorporat baza de date: Imposibil de deschis fișierul pentru scris (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Imposibil de încorporat baza de date: Imposibil de scris fișierul (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Suprascrierea containerului de partajare nesemnate nu este acceptată-exportul împiedicat</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Imposibil de scris container de export</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Eroare de export neașteptată</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
+ <message>
+ <source>Import from container without signature</source>
+ <translation>Importul din container fără semnătură</translation>
+ </message>
+ <message>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <translation>Nu putem verifica sursa containerului partajat, deoarece nu este semnat. Chiar doriți să importați de la %1?</translation>
+ </message>
+ <message>
+ <source>Import from container with certificate</source>
+ <translation>Importul din container cu certificat</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Doriți să aveți încredere în %1 cu amprenta de %2 de la %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
+ <source>Not this time</source>
+ <translation>Nu și de data asta.</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation>Niciodată</translation>
+ </message>
+ <message>
+ <source>Always</source>
+ <translation>Întotdeauna</translation>
+ </message>
+ <message>
+ <source>Just this time</source>
+ <translation>Doar de data asta.</translation>
+ </message>
<message>
<source>Signed share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>Container de partajare semnat nu sunt acceptate-import prevenit</translation>
</message>
<message>
<source>File is not readable</source>
- <translation type="unfinished"/>
+ <translation>Fișierul nu este lizibil</translation>
</message>
<message>
<source>Invalid sharing container</source>
- <translation type="unfinished"/>
+ <translation>Container de partajare nevalid</translation>
</message>
<message>
<source>Untrusted import prevented</source>
- <translation type="unfinished"/>
+ <translation>Import de neîncredere împiedicat</translation>
</message>
<message>
<source>Successful signed import</source>
- <translation type="unfinished"/>
+ <translation>Import semnat cu succes</translation>
</message>
<message>
<source>Unexpected error</source>
- <translation type="unfinished"/>
+ <translation>Eroare neașteptată</translation>
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>Container de partajare nesemnate nu sunt acceptate-import prevenit</translation>
</message>
<message>
<source>Successful unsigned import</source>
- <translation type="unfinished"/>
+ <translation>Import nesemnate cu succes</translation>
</message>
<message>
<source>File does not exist</source>
- <translation type="unfinished"/>
+ <translation>Fișierul nu există</translation>
</message>
<message>
<source>Unknown share container type</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
+ <translation>Tip de container de partajare necunoscut</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Could not embed signature (%1)</source>
- <translation type="unfinished"/>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Importul din %1 nu a reușit (%2)</translation>
</message>
<message>
- <source>Could not embed database (%1)</source>
- <translation type="unfinished"/>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Importul de la %1 cu succes (%2)</translation>
</message>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Imported from %1</source>
+ <translation>Importat din %1</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation type="unfinished"/>
+ <source>Export to %1 failed (%2)</source>
+ <translation>Exportul în %1 nu a reușit (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation type="unfinished"/>
+ <source>Export to %1 successful (%2)</source>
+ <translation>Exportul către %1 cu succes (%2)</translation>
</message>
<message>
- <source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <source>Export to %1</source>
+ <translation>Export în %1</translation>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <source>Multiple import source path to %1 in %2</source>
+ <translation>Mai multe căi de import sursă la %1 în %2</translation>
</message>
<message>
- <source>Export to %1</source>
- <translation type="unfinished"/>
+ <source>Conflicting export target path %1 in %2</source>
+ <translation>Calea țintă de export în conflict %1 în %2</translation>
</message>
</context>
<context>
@@ -5246,7 +6848,7 @@ Comenzi disponibile:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Expiră în &lt;b&gt;% n&lt;/b&gt; second (s)</numerusform><numerusform>Expiră în &lt;b&gt;% n&lt;/b&gt; second (s)</numerusform><numerusform>Expiră în &lt;b&gt;%n&lt;/b&gt; secunde</numerusform></translation>
</message>
</context>
<context>
@@ -5258,15 +6860,15 @@ Comenzi disponibile:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>Notă: aceste setări TOTP sunt particularizate și pot să nu funcționeze cu alți autentificatori.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation type="unfinished"/>
+ <translation>Eroare la crearea codului QR.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation type="unfinished"/>
+ <translation>Se închide în %1 secunde.</translation>
</message>
</context>
<context>
@@ -5276,10 +6878,6 @@ Comenzi disponibile:
<translation>Configurați TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Cheie:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Setări implicite token RFC 6238</translation>
</message>
@@ -5293,11 +6891,11 @@ Comenzi disponibile:
</message>
<message>
<source>Custom Settings</source>
- <translation type="unfinished"/>
+ <translation>Setări particularizate</translation>
</message>
<message>
<source>Time step:</source>
- <translation type="unfinished"/>
+ <translation>Pasul de timp:</translation>
</message>
<message>
<source> sec</source>
@@ -5309,27 +6907,56 @@ Comenzi disponibile:
<translation>Dimensiune cod:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 cifre</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritm:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 cifre</translation>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation type="unfinished"/>
+ <translation>Se caută actualizări</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation type="unfinished"/>
+ <translation>Se caută actualizări...</translation>
</message>
<message>
<source>Close</source>
@@ -5337,46 +6964,46 @@ Comenzi disponibile:
</message>
<message>
<source>Update Error!</source>
- <translation type="unfinished"/>
+ <translation>Eroare de actualizare!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation type="unfinished"/>
+ <translation>S-a produs o eroare la recuperarea informațiilor de actualizare.</translation>
</message>
<message>
<source>Please try again later.</source>
- <translation type="unfinished"/>
+ <translation>Vă rugăm să încercați din nou mai târziu.</translation>
</message>
<message>
<source>Software Update</source>
- <translation type="unfinished"/>
+ <translation>Actualizări software</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation type="unfinished"/>
+ <translation>O nouă versiune a KeePassXC este disponibila!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 este acum disponibil — aveți %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation type="unfinished"/>
+ <translation>Descărcați-l la keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation type="unfinished"/>
+ <translation>Ești la zi!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 este în prezent cea mai nouă versiune disponibilă</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
- <translation type="unfinished"/>
+ <translation>Începeți să stocați parolele în siguranță într-o bază de date KeePassXC</translation>
</message>
<message>
<source>Create new database</source>
@@ -5400,6 +7027,14 @@ Comenzi disponibile:
</message>
<message>
<source>Welcome to KeePassXC %1</source>
+ <translation>Bun venit la KeePassXC %1</translation>
+ </message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5411,18 +7046,26 @@ Comenzi disponibile:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation type="unfinished"/>
+ <translation>YubiKey Challenge-răspuns</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Dacă dețineți un &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, îl puteți folosi pentru securitate suplimentară.&lt;/p&gt;&lt;p&gt;YubiKey necesită unul dintre sloturile sale să fie programat ca &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-răspuns&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation type="unfinished"/>
+ <translation>Nu este detectat YubiKey, asigurați-vă că este conectat.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
+ <translation>Nu s-a inserat YubiKey.</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
<translation type="unfinished"/>
</message>
</context>
diff --git a/share/translations/keepassx_ru.ts b/share/translations/keepassx_ru.ts
index b3fab3d24..07799f568 100644
--- a/share/translations/keepassx_ru.ts
+++ b/share/translations/keepassx_ru.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
- <translation>KeePassXC распространяется на условиях универсальной общедоступной лицензии GNU (GPL) версии 2 или 3 (на ваше усмотрение).</translation>
+ <translation>KeePassXC распространяется на условиях универсальной общественной лицензии GNU (GPL) версии 2 или 3 (на ваше усмотрение).</translation>
</message>
<message>
<source>Contributors</source>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Следовать стилю</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Сбросить настройки?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,20 +119,8 @@
<translation>Запускать только один экземпляр KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Запоминать последнюю базу данных</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Запоминать последние использованные ключевые файлы и устройства</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Загружать предыдущие базы данных при запуске</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
- <translation>Запускать приложение в свёрнутом виде</translation>
+ <translation>Сворачивать окно при запуске приложения</translation>
</message>
<message>
<source>File Management</source>
@@ -148,7 +144,7 @@
</message>
<message>
<source>Don&apos;t mark database as modified for non-data changes (e.g., expanding groups)</source>
- <translation>Не помечать базу данных изменённой при действиях, не изменяющих данные (например при раскрытии групп)</translation>
+ <translation>Не помечать базу данных изменённой при действиях, не связанных с изменением данных (например при раскрытии групп)</translation>
</message>
<message>
<source>Automatically reload the database when modified externally</source>
@@ -163,10 +159,6 @@
<translation>Использовать значок группы для новых записей</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Сворачивать при копировании в буфер обмена</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Скрыть панель предварительного просмотра записи</translation>
</message>
@@ -192,11 +184,7 @@
</message>
<message>
<source>Hide window to system tray when minimized</source>
- <translation>Сворачивать окно в область уведомлений</translation>
- </message>
- <message>
- <source>Language</source>
- <translation>Язык</translation>
+ <translation>При сворачивании скрывать окно в область уведомлений</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -216,7 +204,7 @@
</message>
<message>
<source>Global Auto-Type shortcut</source>
- <translation>Клавиши для глобального автоввода</translation>
+ <translation>Комбинация клавиш для глобального автоввода</translation>
</message>
<message>
<source>Auto-Type typing delay</source>
@@ -232,20 +220,101 @@
<translation>Задержка начала автоввода</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Проверять обновления при запуске приложения</translation>
+ <source>Movable toolbar</source>
+ <translation>Перемещаемая панель инструментов</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Включать бета-версии при проверке обновлений</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Перемещаемая панель инструментов</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>сек</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Стиль кнопок</translation>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -265,7 +334,7 @@
</message>
<message>
<source>Lock databases after inactivity of</source>
- <translation>Блокировать базу данных при неактивности в течение</translation>
+ <translation>Блокировать базу данных при отсутствии активности в течение</translation>
</message>
<message>
<source> min</source>
@@ -273,7 +342,7 @@
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation>Забывать TouchID после неактивности</translation>
+ <translation>Забыть TouchID после неактивности</translation>
</message>
<message>
<source>Convenience</source>
@@ -285,19 +354,19 @@
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>Забывать TouchID при блокировке сеанса или закрытии крышки ноутбука</translation>
+ <translation>Забыть TouchID, когда сеанс заблокирован или крышка закрыта</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
- <translation>Блокировать базы данных при сворачивании окна</translation>
+ <translation>Блокировать базу данных при сворачивании окна</translation>
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>Блокировать ранее заблокированную БД после автоввода</translation>
+ <translation>Заблокировать базу данных после автоввода</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>Не требовать повторный ввод пароля, когда он отображается</translation>
+ <translation>Не требовать повторный ввод пароля, когда он показывается</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
@@ -313,15 +382,36 @@
</message>
<message>
<source>Hide entry notes by default</source>
- <translation>По умолчанию скрывать примечания записи</translation>
+ <translation>Скрыть примечания записи по умолчанию</translation>
</message>
<message>
<source>Privacy</source>
<translation>Конфиденциальность</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Использовать DuckDuckGo как резервный источник для загрузки значков сайта</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> мин</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -340,7 +430,7 @@
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation>Неверная инструкция автоввода!</translation>
+ <translation>Неверный синтаксис инструкции автоввода!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
@@ -367,7 +457,7 @@
</message>
<message>
<source>Default sequence</source>
- <translation>Стандартная последовательность</translation>
+ <translation>Последовательность по умолчанию</translation>
</message>
</context>
<context>
@@ -378,11 +468,11 @@
</message>
<message>
<source>Title</source>
- <translation>Имя записи</translation>
+ <translation>Заголовок</translation>
</message>
<message>
<source>Username</source>
- <translation>Имя пользователя</translation>
+ <translation>Логин</translation>
</message>
<message>
<source>Sequence</source>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Скопировать лог&amp;ин</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Скопировать п&amp;ароль</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Выберите запись для автоввода:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Поиск...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,12 +529,20 @@ Please select whether you want to allow access.</source>
<translation>%1 запросил доступ к паролям для следующих элементов.
Разрешить доступ?</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
<message>
<source>KeePassXC-Browser Save Entry</source>
- <translation>KeePassXC-Browser - сохранить запись</translation>
+ <translation>KeePassXC-Browser: Сохранение записи</translation>
</message>
<message>
<source>Ok</source>
@@ -454,11 +567,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>Это требуется для доступа к вашим базам данных при использовании KeePassXC-Browser</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Включить интеграцию с браузером</translation>
+ <translation>Это требуется для доступа к базам данных с помощью KeePassXC-Browser</translation>
</message>
<message>
<source>General</source>
@@ -495,7 +604,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>Возвращать записи только при соответствии протокола (http://, https://,...).</translation>
+ <translation>Возвращаются только записи с таким же протоколом (http://, https://, ...).</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
@@ -503,7 +612,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>При поиске по URL возвращать только лучшие совпадения, а не все записи для домена.</translation>
+ <translation>Возвращает только лучшие совпадения для определённого URL-адреса, а не все записи для целого домена.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
@@ -526,16 +635,12 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Не &amp;запрашивать доступ к записям</translation>
+ <translation>Никогда не &amp;спрашивать перед доступом к учётным данным</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Не спрашивать перед &amp;обновлением учётных данных</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>К клиенту должна быть подключена только выбранная база данных.</translation>
+ <translation>Никогда не спрашивать перед &amp;обновлением учётных данных</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
@@ -544,7 +649,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
- <translation>Автоматическое создание или обновление полей, содержащих строки, не поддерживается.</translation>
+ <translation>Автоматическое создание или обновление строковых полей не поддерживается.</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
@@ -556,7 +661,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>Обновлять при запуске файлы манифеста механизма &amp;native messaging</translation>
+ <translation>Обновлять файлы манифеста механизма &amp;native messaging при запуске</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Внимание!&lt;/b&gt; Не найдено приложение keepassxc-proxy! &lt;br /&gt; Проверьте папку установки KeePassXC или задайте свой путь в расширенных настройках. &lt;br /&gt;Интеграция в браузеры не будет работать без прокси-приложения. &lt;br /&gt;Ожидаемый путь: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Исполняемые файлы</translation>
</message>
@@ -607,19 +708,63 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation>Не спрашивать разрешения для HTTP и Basic авторизации</translation>
+ <translation>Не спрашивать разрешения для &amp;базовой HTTP-аутентификации</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation>Так как Snap - песочница, нужно запустить скрипт, чтобы разрешить интеграцию в браузеры.&lt;br /&gt;Этот скрипт можно получить тут: %1</translation>
+ <translation>Так как Snap это песочница, для включения браузерной интеграции нужно выполнить сценарий.&lt;br /&gt;Этот сценарий можно получить с %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation>Ознакомьтесь ниже с особыми инструкциями по использованию расширения браузера</translation>
+ <translation>Ознакомьтесь с инструкциями по использованию расширения браузера ниже</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
- <translation>KeePassXC-Browser необходим для интеграции в браузер. &lt;br /&gt;Скачайте его для %1 и %2. %3</translation>
+ <translation>Для интеграции с браузерами требуется KeePassXC-Browser. &lt;br /&gt;Скачайте его для %1 и %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -666,7 +811,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation>Преобразование атрибутов в пользовательских данных...</translation>
+ <translation>Преобразование атрибутов в пользовательские данные...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
@@ -675,12 +820,12 @@ Do you want to overwrite it?</source>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation>Успешно преобразованы атрибуты из %1 записи(ей).
+ <translation>Записей, из которых успешно преобразованы атрибуты: %1.
Перемещено ключей в пользовательские данные: %2.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>Успешно переехал %n ключи пользовательских данных.</numerusform><numerusform>Успешно переехал %n ключи пользовательских данных.</numerusform><numerusform>Успешно переехал %n ключи пользовательских данных.</numerusform><numerusform>Успешно перемещено ключей в пользовательские данные: %n.</numerusform></translation>
+ <translation><numerusform>%n ключ успешно перемещён в пользовательские данные.</numerusform><numerusform>%n ключа успешно перемещены в пользовательские данные.</numerusform><numerusform>%n ключей успешно перемещены в пользовательские данные.</numerusform><numerusform>Перемещено ключей в пользовательские данные: %n.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -692,7 +837,7 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation>KeePassXC: Обнаружена устаревшая интеграция с браузером</translation>
+ <translation>KeePassXC: Обнаружена устаревшая интеграция с браузерами</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
@@ -702,7 +847,7 @@ Moved %2 keys to custom data.</source>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation>Получен запрос на создание новой группы &quot;%1&quot;.
+ <translation>Получен запрос для создания новой группы &quot;%1&quot;.
Создать эту группу?
</translation>
</message>
@@ -710,9 +855,13 @@ Do you want to create this group?
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation>Ваши настройки KeePassXC-Browser требуется переместить в настройки базы данных.
-Это необходимо, чтобы поддерживать текущие подключения браузера.
-Хотите перенести настройки сейчас?</translation>
+ <translation>Необходимо переместить настройки KeePassXC-Browser в настройки базы данных.
+Это нужно для управления текущими подключениями к браузерам.
+Переместить имеющиеся настройки?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Не показывать это предупреждение</translation>
</message>
</context>
<context>
@@ -727,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Replace username and password with references</source>
- <translation>Использовать ссылки для имени пользователя и пароля</translation>
+ <translation>Заменить логин и пароль ссылками</translation>
</message>
<message>
<source>Copy history</source>
@@ -754,7 +903,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Codec</source>
- <translation>Кодек</translation>
+ <translation>Кодировка</translation>
</message>
<message>
<source>Text is qualified by</source>
@@ -773,12 +922,8 @@ Would you like to migrate your existing settings now?</source>
<translation>Первая запись содержит имена полей</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Пропустить строк в начале</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
- <translation>Символ «\» является экранирующим</translation>
+ <translation>Считать символ «\» экранирующим</translation>
</message>
<message>
<source>Preview</source>
@@ -786,7 +931,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Column layout</source>
- <translation>Назначение столбцов</translation>
+ <translation>Расположение столбцов</translation>
</message>
<message>
<source>Not present in CSV file</source>
@@ -818,19 +963,35 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n больше сообщений пропущен]</numerusform><numerusform>[%n больше сообщений пропущен]</numerusform><numerusform>[%n больше сообщений пропущен]</numerusform><numerusform>[пропущено сообщений: %n]</numerusform></translation>
+ <translation><numerusform>[ещё %n сообщение пропущено]</numerusform><numerusform>[ещё %n сообщения пропущено]</numerusform><numerusform>[ещё %n сообщений пропущено]</numerusform><numerusform>[пропущено сообщений: %n]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
- <translation>Импорт CSV: запись с ошибками - %1</translation>
+ <translation>Импорт CSV: запись с ошибками (%1)</translation>
+ </message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform></translation>
+ <translation><numerusform>%n столбец</numerusform><numerusform>%n столбца</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -839,11 +1000,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n байт(ов)</numerusform><numerusform>%n байт(ов)</numerusform><numerusform>%n байт(ов)</numerusform><numerusform>%n байт</numerusform></translation>
+ <translation><numerusform>%n байт</numerusform><numerusform>%n байта</numerusform><numerusform>%n байт</numerusform><numerusform>%n байт</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n строка</numerusform><numerusform>%n строк</numerusform><numerusform>%n строк</numerusform><numerusform>%n строк</numerusform></translation>
+ <translation><numerusform>%n строка</numerusform><numerusform>%n строки</numerusform><numerusform>%n строк</numerusform><numerusform>%n строк</numerusform></translation>
</message>
</context>
<context>
@@ -866,52 +1027,53 @@ Would you like to migrate your existing settings now?</source>
<translation>Ошибка при чтении базы данных: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Не удалось сохранить, отсутствует имя у файла базы данных.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
- <translation>Файл не может быть перезаписан - он открыт в режиме &quot;только для чтения&quot;.</translation>
+ <translation>Невозможно перезаписать файл - он открыт в режиме только для чтения.</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
- <translation>Ключ не преобразован. Это ошибка, сообщите о ней разработчикам!</translation>
+ <translation>Ключ не преобразован. Это ошибка, сообщите о ней разработчикам.</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Корзина</translation>
</message>
</context>
<context>
<name>DatabaseOpenDialog</name>
<message>
<source>Unlock Database - KeePassXC</source>
- <translation>Разблокировать базу данных - KeePassXC</translation>
+ <translation>Разблокировка базы данных - KeePassXC</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Введите мастер-пароль</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Ключевой файл:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Пароль:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Обзор</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Обновить</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Вызов-ответ:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Устаревший формат ключевого файла</translation>
</message>
@@ -941,20 +1103,96 @@ Please consider generating a new key file.</source>
<translation>Выберите ключевой файл</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID для быстрой разблокировки</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Невозможно открыть базу данных:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Невозможно открыть ключевой файл:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Обзор...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Очистить</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1003,11 +1241,11 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation>Забыть все настройки записей для конкретных сайтов</translation>
+ <translation>Забыть все специфические для сайтов настройки записей</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation>Переместить аттрибуты KeePassHTTP в пользовательские данные KeePassXC-Browser</translation>
+ <translation>Переместить атрибуты KeePassHTTP в пользовательские данные KeePassXC-Browser</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1025,7 +1263,7 @@ Please consider generating a new key file.</source>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
<translation>Вы действительно хотите удалить выбранный ключ?
-Это может помешать подключению к плагину браузера.</translation>
+Это может воспрепятствовать соединению с плагином браузера.</translation>
</message>
<message>
<source>Key</source>
@@ -1046,8 +1284,8 @@ This may prevent connection to the browser plugin.</source>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation>Вы действительно хотите отключить все браузеры?
-Это может помешать подключению к плагину браузера.</translation>
+ <translation>Вы действительно хотите отсоединить все браузеры?
+Это может воспрепятствовать соединению с плагином браузера.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
@@ -1055,7 +1293,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation>В настройках KeePassXC нет общих ключей шифрования.</translation>
+ <translation>Нет общих ключей шифрования в настройках KeePassXC.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
@@ -1063,17 +1301,17 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Успешно удалён %n ключ шифрования из настроек KeePassXC.</numerusform><numerusform>Успешно удалёны %n ключа шифрования из настроек KeePassXC.</numerusform><numerusform>Успешно удалёны %n ключей шифрования из настроек KeePassXC.</numerusform><numerusform>Успешно удалено ключей шифрования из настроек KeePassXC: %n.</numerusform></translation>
+ <translation><numerusform>Успешно удалён %n ключ шифрования из настроек KeePassXC.</numerusform><numerusform>Успешно удалёны %n ключа шифрования из настроек KeePassXC.</numerusform><numerusform>Успешно удалёны %n ключей шифрования из настроек KeePassXC.</numerusform><numerusform>Ключи шифрования (%n шт.) успешно удалены из настроек KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation>Забыть все настройки записей для конкретных сайтов</translation>
+ <translation>Забыть все специфические для сайтов настройки записей</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation>Вы действительно хотите забыть все настройки сайта для каждой записи?
-Разрешения на доступ к записям будут отменены.</translation>
+ <translation>Вы действительно хотите забыть все специфические для сайтов настройки у каждой записи?
+Разрешения на доступ к записям будут отозваны.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
@@ -1089,7 +1327,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Успешно удалено разрешение от %n записи.</numerusform><numerusform>Успешно удалены разрешения от %n записей.</numerusform><numerusform>Успешно удалены разрешения от %n записей.</numerusform><numerusform>Успешно удалены разрешения из %n шт. записей.</numerusform></translation>
+ <translation><numerusform>Успешно удалены доступы из %n записи.</numerusform><numerusform>Успешно удалены доступы из %n записей.</numerusform><numerusform>Успешно удалены доступы из %n записей.</numerusform><numerusform>Записей, у которых удалены разрешения: %n.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1097,18 +1335,26 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
- <translation>В активной базе данных нет записей с разрешениями.</translation>
+ <translation>Активная база данных не содержит записей с разрешениями.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation>Переместить атрибуты KeePassHTTP в пользовательские данные</translation>
+ <translation>Переместить аттрибуты KeePassHTTP в пользовательские данные</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
- <translation>Вы действительно хотите перевести все устаревшие данные интеграции браузера в новый стандарт?
+ <translation>Вы действительно хотите привести все устаревшие данные интеграции браузера к новейшему стандарту?
Это необходимо для поддержания совместимости с плагином браузера.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1130,7 +1376,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Transform rounds:</source>
- <translation>Циклов преобразования:</translation>
+ <translation>Раундов преобразования:</translation>
</message>
<message>
<source>Benchmark 1-second delay</source>
@@ -1166,7 +1412,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation>Чем больше значение, тем сильнее защита, но дольше открывается база данных.</translation>
+ <translation>Чем выше значение, тем надёжнее защита, но база данных будет открываться дольше.</translation>
</message>
<message>
<source>Database format:</source>
@@ -1192,15 +1438,15 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<message>
<source>Number of rounds too high</source>
<comment>Key transformation rounds</comment>
- <translation>Слишком много циклов</translation>
+ <translation>Слишком много раундов</translation>
</message>
<message>
<source>You are using a very high number of key transform rounds with Argon2.
If you keep this number, your database may take hours or days (or even longer) to open!</source>
- <translation>Слишком много циклов преобразования ключа Argon2.
+ <translation>Слишком большое число раундов преобразования ключа Argon2.
-Если оставить это значение, то база данных может открываться часы, дни или даже дольше!</translation>
+Если оставить это значение, открытие базы данных может занять часы, дни или даже больше!</translation>
</message>
<message>
<source>Understood, keep number</source>
@@ -1213,13 +1459,13 @@ If you keep this number, your database may take hours or days (or even longer) t
<message>
<source>Number of rounds too low</source>
<comment>Key transformation rounds</comment>
- <translation>Слишком мало циклов</translation>
+ <translation>Слишком мало раундов</translation>
</message>
<message>
<source>You are using a very low number of key transform rounds with AES-KDF.
If you keep this number, your database may be too easy to crack!</source>
- <translation>Слишком мало циклов преобразования ключа AES-KDF.
+ <translation>Слишком мало раундов преобразования ключа AES-KDF.
Если оставить это значение, базу данных можно будет слишком легко взломать!</translation>
</message>
@@ -1234,12 +1480,12 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> МиБ</numerusform><numerusform> МиБ</numerusform><numerusform> МиБ</numerusform><numerusform> МиБ</numerusform></translation>
+ <translation><numerusform> МиБ</numerusform><numerusform> МиБ</numerusform><numerusform> МиБ</numerusform><numerusform> МиБ</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform> потоков</numerusform><numerusform> потоков</numerusform><numerusform> потоков</numerusform><numerusform> потоков</numerusform></translation>
+ <translation><numerusform> поток</numerusform><numerusform> потока</numerusform><numerusform> потоков</numerusform><numerusform> потоков</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1249,7 +1495,58 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 cек</numerusform></translation>
+ <translation><numerusform>%1 с</numerusform><numerusform>%1 с</numerusform><numerusform>%1 с</numerusform><numerusform>%1 сек</numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1268,7 +1565,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Default username:</source>
- <translation>Имя пользователя по умолчанию:</translation>
+ <translation>Логин по умолчанию:</translation>
</message>
<message>
<source>History Settings</source>
@@ -1298,6 +1595,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>Включить &amp;сжатие (рекомендуется)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1335,7 +1665,7 @@ If you keep this number, your database may be too easy to crack!</source>
<name>DatabaseSettingsWidgetMasterKey</name>
<message>
<source>Add additional protection...</source>
- <translation>Добавить дополнительную защиту...</translation>
+ <translation>Дополнительная защита...</translation>
</message>
<message>
<source>No encryption key added</source>
@@ -1343,17 +1673,17 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation>Нужно добавить хотя бы один ключ шифрования, чтобы обезопасить базу данных!</translation>
+ <translation>Нужно добавить хотя бы один ключ шифрования для защиты базы данных!</translation>
</message>
<message>
<source>No password set</source>
- <translation>Пароль не установлен</translation>
+ <translation>Не задан пароль</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation>ВНИМАНИЕ! Вы не установили пароль. Категорически НЕ рекомендуется использовать базу данных без пароля!
+ <translation>ВНИМАНИЕ! Вы не установили пароль. Настоятельно НЕ рекомендуется использовать базу данных без пароля!
Вы действительно хотите продолжить без пароля?</translation>
</message>
@@ -1365,6 +1695,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>Не удалось изменить мастер-ключ</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1376,6 +1710,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Описание:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1422,16 +1879,12 @@ Are you sure you want to continue without a password?</source>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation>У созданной базы данных нет ключа или ФФК, сохранение невозможно.
-Это определённо ошибка, сообщите о ней разработчикам.</translation>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Файл базы данных не существует или недоступен.</translation>
+ <translation>Созданная база данных не имеет ключа или ФФК, сохранение невозможно.
+Это ошибка, сообщите о ней разработчикам.</translation>
</message>
<message>
<source>Select CSV file</source>
- <translation>Выберите CSV-файл</translation>
+ <translation>Выберать CSV-файл</translation>
</message>
<message>
<source>New Database</source>
@@ -1440,17 +1893,41 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>%1 [New Database]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [новая база данных]</translation>
+ <translation>%1 [Новая база данных]</translation>
</message>
<message>
<source>%1 [Locked]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [заблокировано]</translation>
+ <translation>%1 [Заблокировано]</translation>
</message>
<message>
<source>%1 [Read-only]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [только для чтения]</translation>
+ <translation>%1 [Только для чтения]</translation>
+ </message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1469,7 +1946,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить записи (%n) в корзину?</numerusform></translation>
+ <translation><numerusform>Вы действительно хотите поместить %n запись в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записи в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записей в корзину?</numerusform><numerusform>Вы действительно хотите переместить записи (%n шт.) в корзину?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1531,7 +2008,7 @@ Do you want to merge your changes?</source>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Вы действительно хотите удалить %n запись насовсем?</numerusform><numerusform>Вы действительно хотите удалить %n записи насовсем?</numerusform><numerusform>Вы действительно хотите удалить %n записей насовсем?</numerusform><numerusform>Вы действительно хотите окончательно удалить записи (%n шт.)?</numerusform></translation>
+ <translation><numerusform>Вы действительно хотите удалить %n запись насовсем?</numerusform><numerusform>Вы действительно хотите удалить %n записи насовсем?</numerusform><numerusform>Вы действительно хотите удалить %n записей насовсем?</numerusform><numerusform>Удалить записи (%n шт.) окончательно?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
@@ -1542,16 +2019,12 @@ Do you want to merge your changes?</source>
<translation><numerusform>Переместить запись в корзину?</numerusform><numerusform>Переместить записи в корзину?</numerusform><numerusform>Переместить записи в корзину?</numerusform><numerusform>Переместить записи в корзину?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Файл открыт в режиме только для чтения.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Заблокировать базу данных?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation>Вы сейчас редактируете запись. Отменить изменения и всё равно заблокировать?</translation>
+ <translation>Вы редактируете запись. Отказаться от изменений и всё равно заблокировать?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1572,7 +2045,7 @@ Save changes?</source>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation>Не удалось открыть новый файл базы данных при попытке автоматически загрузить повторно.
+ <translation>Не удалось открыть новый файл базы данных при попытке автоматической перезагрузки.
Ошибка: %1</translation>
</message>
<message>
@@ -1586,12 +2059,6 @@ Disable safe saves and try again?</source>
Отключить безопасное сохранение и повторить попытку?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Не удалось записать базу данных.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Пароли</translation>
</message>
@@ -1609,7 +2076,7 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>Запись &quot;%1&quot; имеет %2 ссылку. Вы хотите переписать ссылки значениями, пропустить эту запись или удалить в любом случае?</numerusform><numerusform>Запись &quot;%1&quot; имеет %2 ссылки. Вы хотите переписать ссылки значениями, пропустить эту запись или удалить в любом случае?</numerusform><numerusform>Запись &quot;%1&quot; имеет %2 ссылок. Вы хотите переписать ссылки значениями, пропустить эту запись или удалить в любом случае?</numerusform><numerusform>У записи &quot;%1&quot; есть ссылки (%2 шт.). Хотите перезаписать ссылки значениями, пропустить эту запись или всё равно её удалить?</numerusform></translation>
+ <translation><numerusform>Запись &quot;%1&quot; имеет %2 ссылку. Вы хотите переписать ссылки значениями, пропустить эту запись или удалить в любом случае?</numerusform><numerusform>Запись &quot;%1&quot; имеет %2 ссылки. Вы хотите переписать ссылки значениями, пропустить эту запись или удалить в любом случае?</numerusform><numerusform>Запись &quot;%1&quot; имеет %2 ссылок. Вы хотите переписать ссылки значениями, пропустить эту запись или удалить в любом случае?</numerusform><numerusform>Ссылок у записи &quot;%1&quot;: %2. Что нужно сделать: перезаписать ссылки значениями, пропустить эту запись или всё равно удалить?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1629,11 +2096,19 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation>База данных не была изменена операцией объединения.</translation>
+ <translation>База данных не была изменена операцией слияния.</translation>
</message>
<message>
<source>Shared group...</source>
- <translation>Общая группа...</translation>
+ <translation>Совместная группа...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Ошибка при записи базы данных: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1656,7 +2131,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Properties</source>
- <translation>Параметры</translation>
+ <translation>Свойства</translation>
</message>
<message>
<source>History</source>
@@ -1676,15 +2151,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Select private key</source>
- <translation>Выберите закрытый (личный) ключ</translation>
+ <translation>Выберите частный ключ</translation>
</message>
<message>
<source>File too large to be a private key</source>
- <translation>Слишком большой файл для закрытого ключа</translation>
+ <translation>Слишком большой файл для частного ключа</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>Не удалось открыть личный ключ</translation>
+ <translation>Не удалось открыть частный ключ</translation>
</message>
<message>
<source>Entry history</source>
@@ -1696,7 +2171,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit entry</source>
- <translation>Изменить запись</translation>
+ <translation>Редактировать запись</translation>
</message>
<message>
<source>Different passwords supplied.</source>
@@ -1716,11 +2191,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n нед</numerusform><numerusform>%n нед</numerusform><numerusform>%n нед</numerusform><numerusform>%n нед.</numerusform></translation>
+ <translation><numerusform>%n неделя</numerusform><numerusform>%n недели</numerusform><numerusform>%n недель</numerusform><numerusform>%n нед.</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n мес.</numerusform></translation>
+ <translation><numerusform>%n месяц</numerusform><numerusform>%n месяца</numerusform><numerusform>%n месяцев</numerusform><numerusform>%n мес.</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1744,16 +2219,28 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>[PROTECTED] Press reveal to view or edit</source>
- <translation>[Защищено] Нажмите &apos;Показать&apos; для просмотра или правки</translation>
+ <translation>[ЗАЩИЩЕНО] Нажмите для просмотра или правки</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n год</numerusform><numerusform>%n лет</numerusform><numerusform>%n лет</numerusform><numerusform>%n лет</numerusform></translation>
+ <translation><numerusform>%n год</numerusform><numerusform>%n года</numerusform><numerusform>%n лет</numerusform><numerusform>%n г.</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Подтвердите удаление</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Интеграция с браузерами</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1779,7 +2266,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Reveal</source>
- <translation>Показать</translation>
+ <translation>Открытие</translation>
</message>
<message>
<source>Attachments</source>
@@ -1793,6 +2280,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>Цвет фона:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1826,7 +2349,78 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Use a specific sequence for this association:</source>
- <translation>Использовать специальную последовательность для этой ассоциации:</translation>
+ <translation>Особая последовательность для этой ассоциации:</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Общие</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Создать</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Изменить</translation>
</message>
</context>
<context>
@@ -1847,6 +2441,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>Удалить всё</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1886,6 +2500,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>Истекает</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1935,7 +2605,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Private key</source>
- <translation>Закрытый (личный) ключ</translation>
+ <translation>Частный ключ</translation>
</message>
<message>
<source>External file</source>
@@ -1944,7 +2614,7 @@ Disable safe saves and try again?</source>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Просмотр...</translation>
+ <translation>Обзор...</translation>
</message>
<message>
<source>Attachment</source>
@@ -1962,6 +2632,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>Требовать подтверждение при использовании этого ключа</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1975,7 +2661,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Properties</source>
- <translation>Параметры</translation>
+ <translation>Свойства</translation>
</message>
<message>
<source>Add group</source>
@@ -1983,7 +2669,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit group</source>
- <translation>Править группу</translation>
+ <translation>Изменить группу</translation>
</message>
<message>
<source>Enable</source>
@@ -1997,6 +2683,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>Наследовать от родительской группы (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>В записи есть несохранённые изменения</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2025,68 +2715,98 @@ Disable safe saves and try again?</source>
<translation>Неактивные</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Импортировать из пути</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Неподписанный контейнер KeeShare</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Экспортировать в путь</translation>
+ <source>KeeShare signed container</source>
+ <translation>Подписанный контейнер KeeShare</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Синхронизировать с путём</translation>
+ <source>Select import source</source>
+ <translation>Выбрать источник для импорта</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Эта версия KeePassXC не поддерживает совместное использование контейнера такого типа. Используйте %1.</translation>
+ <source>Select export target</source>
+ <translation>Выбрать цель для экспорта</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Совместное использование базы данных отключено</translation>
+ <source>Select import/export file</source>
+ <translation>Выберите файл для импорта/экспорта</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Экспорт базы данных отключён</translation>
+ <source>Clear</source>
+ <translation>Очистить</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Импорт базы данных отключён</translation>
+ <source>Import</source>
+ <translation>Импортировать</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Неподписанный контейнер KeeShare</translation>
+ <source>Export</source>
+ <translation>Экспортировать</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Подписанный контейнер KeeShare</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Выберите источник импорта</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Выберите место экспорта</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Выберите файл для импорта/экспорта</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Очистить</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>На контейнер экспорта %1 уже есть ссылка.</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Контейнер импорта %1 уже импортирован.</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Контейнер %1 импортируется и экспортируется разными группами.</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2117,7 +2837,35 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
- <translation>Установить последовательность автоввода по умолчанию</translation>
+ <translation>Задать последовательность автоввода по умолчанию</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2155,36 +2903,24 @@ Disable safe saves and try again?</source>
<translation>Все файлы</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Свой значок уже существует</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Подтверждение удаления</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Свой значок успешно загружен</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>* Вы можете включить DuckDuckGo как резерв в &quot;Сервис&gt;Настройки&gt;Безопасность&quot;</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Выбор изображения</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Успешно загружен %1 из %n значка</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform><numerusform>Успешно загружено значков: %1 из %n</numerusform></translation>
+ <translation><numerusform>Успешно загружена %1 из %n значка</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform><numerusform>Успешно загружено значков: %1 из %n</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation>Не загружено ни одного значка</translation>
+ <translation>Значки не были загружены</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n значок уже существует в базе данных</numerusform><numerusform>%n значка уже существуют в базе данных</numerusform><numerusform>%n значков уже существуют в базе данных</numerusform><numerusform>Значков, уже имеющихся в базе данных: %n</numerusform></translation>
+ <translation><numerusform>%n значок уже существует в базе данных</numerusform><numerusform>%n значка уже существуют в базе данных</numerusform><numerusform>%n значков уже существуют в базе данных</numerusform><numerusform>Уже существующих в базе данных значков: %n</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
@@ -2192,18 +2928,54 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Этот значок используется %n записью и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется записями (%n), он будет замещён стандартным значком. Вы действительно хотите его удалить?</numerusform></translation>
+ <translation><numerusform>Этот значок используется %n записью и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется записями (%n шт.) и будет замещён значком по умолчанию. Вы действительно хотите его удалить?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetProperties</name>
<message>
<source>Created:</source>
- <translation>Создание:</translation>
+ <translation>Создано:</translation>
</message>
<message>
<source>Modified:</source>
- <translation>Изменение:</translation>
+ <translation>Изменено:</translation>
</message>
<message>
<source>Accessed:</source>
@@ -2239,12 +3011,36 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>Значение</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
<message>
<source>%1 - Clone</source>
- <translation>%1 - клон</translation>
+ <translation>%1 - Клон</translation>
</message>
</context>
<context>
@@ -2286,7 +3082,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы действительно хотите удалить вложения (%n шт.)?</numerusform></translation>
+ <translation><numerusform>Вы уверены, что вы хотите удалить %n вложение?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложений?</numerusform><numerusform>Вы действительно хотите удалить вложения (%n шт.)?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2295,12 +3091,11 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to create directory:
%1</source>
- <translation>Невозможно создать папку:
-%1</translation>
+ <translation>Не удаётся создать папку: %1</translation>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation>Вы действительно хотите перезаписать имеющийся файл &quot;%1&quot; с вложением?</translation>
+ <translation>Перезаписать имеющийся файл &quot;%1&quot; с вложением?</translation>
</message>
<message>
<source>Confirm overwrite</source>
@@ -2309,7 +3104,7 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to save attachments:
%1</source>
- <translation>Невозможно сохранить вложения:
+ <translation>Невозможно сохранить вложение:
%1</translation>
</message>
<message>
@@ -2331,12 +3126,32 @@ This may cause the affected plugins to malfunction.</source>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Не удалось открыть файл:
-%1</numerusform><numerusform>Не удалось открыть файлы:
-%1</numerusform><numerusform>Не удалось открыть файлы:
-%1</numerusform><numerusform>Невозможно открыть файл(ы):
+ <translation><numerusform>Не удаётся открыть файл:
+%1</numerusform><numerusform>Не удаётся открыть файлы:
+%1</numerusform><numerusform>Не удаётся открыть файлы:
+%1</numerusform><numerusform>Невозможно открыть файлы:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Вложения</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2353,11 +3168,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Title</source>
- <translation>Имя записи</translation>
+ <translation>Название</translation>
</message>
<message>
<source>Username</source>
- <translation>Имя пользователя</translation>
+ <translation>Логин</translation>
</message>
<message>
<source>URL</source>
@@ -2377,11 +3192,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Title</source>
- <translation>Имя записи</translation>
+ <translation>Название</translation>
</message>
<message>
<source>Username</source>
- <translation>Имя пользователя</translation>
+ <translation>Логин</translation>
</message>
<message>
<source>URL</source>
@@ -2405,11 +3220,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Created</source>
- <translation>Создан</translation>
+ <translation>Создано</translation>
</message>
<message>
<source>Modified</source>
- <translation>Изменение</translation>
+ <translation>Изменено</translation>
</message>
<message>
<source>Accessed</source>
@@ -2431,10 +3246,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Генерировать токен TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>Закрыть</translation>
</message>
@@ -2519,6 +3330,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>Предоставить общий доступ</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Дополнительно</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2544,7 +3363,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Reset to defaults</source>
- <translation>Сброс в стандартные значения</translation>
+ <translation>Восстановить значения по умолчанию</translation>
</message>
<message>
<source>Attachments (icon)</source>
@@ -2552,11 +3371,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Корзина</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2575,6 +3416,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL-адрес</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Статус</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2593,11 +3486,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>Невозможно выполнить вызов-ответ.</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Неверный ключ, либо повреждён файл базы данных.</translation>
+ <translation>Невозможно выполнить ответ на вызов.</translation>
</message>
<message>
<source>missing database headers</source>
@@ -2619,12 +3508,17 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>Недопустимая длина данных заголовка</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>Невозможно выполнить вызов-ответ.</translation>
+ <translation>Невозможно выполнить ответ на вызов.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2650,10 +3544,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>Несоответствие SHA256 заголовка</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Неверный ключ, либо повреждён файл базы данных (несоответствие HMAC).</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Неизвестный шифр</translation>
</message>
@@ -2753,6 +3643,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Недопустимый размер поля поля в структуре метаданных</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2791,15 +3690,15 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid master seed size</source>
- <translation>Недопустимый размер основного seed</translation>
+ <translation>Недопустимый размер мастер-seed</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Недопустимый размер seed для преобразования</translation>
+ <translation>Недопустимый размер seed для трансформирования</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
- <translation>Недопустимый размер цикла преобразования</translation>
+ <translation>Недопустимый размер раунда преобразования</translation>
</message>
<message>
<source>Invalid start bytes size</source>
@@ -2837,11 +3736,11 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Unable to parse UUID: %1</source>
- <translation>Не удается выполнить разбор UUID: %1</translation>
+ <translation>Невозможно выполнить разбор UUID: %1</translation>
</message>
<message>
<source>Failed to read database file.</source>
- <translation>Не удалось прочитать файл базы данных.</translation>
+ <translation>Невозможно прочитать файл базы данных.</translation>
</message>
</context>
<context>
@@ -2856,11 +3755,11 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>Нет UUID значка или данных</translation>
+ <translation>Нет значка UUID или данных</translation>
</message>
<message>
<source>Missing custom data key or value</source>
- <translation>Нет ключа пользовательских данных или значения</translation>
+ <translation>Отсутствует ключ пользовательских данных или значение</translation>
</message>
<message>
<source>Multiple group elements</source>
@@ -2868,7 +3767,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Null group uuid</source>
- <translation>UUID для группы NULL</translation>
+ <translation>Значение UUID для NULL-группы</translation>
</message>
<message>
<source>Invalid group icon number</source>
@@ -2884,11 +3783,11 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>No group uuid found</source>
- <translation>Нет UUID группы</translation>
+ <translation>Отсутствует групповой UUID</translation>
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>UUID DeleteObject Null</translation>
+ <translation>Null DeleteObject UUID</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
@@ -2896,7 +3795,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Null entry uuid</source>
- <translation>UUID для записи Null</translation>
+ <translation>UUID для Null-записи</translation>
</message>
<message>
<source>Invalid entry icon number</source>
@@ -2920,7 +3819,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Entry string key or value missing</source>
- <translation>Нет ключа или значения записи</translation>
+ <translation>Отсутствует ключ или значение записи</translation>
</message>
<message>
<source>Duplicate attachment found</source>
@@ -2928,11 +3827,11 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Entry binary key or value missing</source>
- <translation>Нет двоичного ключа или значения записи</translation>
+ <translation>Отсутствует двоичный ключ или значение записи</translation>
</message>
<message>
<source>Auto-type association window or sequence missing</source>
- <translation>Нет окна или последовательности для автоввода</translation>
+ <translation>Отсутствует окно или последовательность для автоввода</translation>
</message>
<message>
<source>Invalid bool value</source>
@@ -2940,7 +3839,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Invalid date time value</source>
- <translation>Недопустимое значение даты/времени </translation>
+ <translation>Недопустимое значение даты времени </translation>
</message>
<message>
<source>Invalid color value</source>
@@ -2975,13 +3874,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Импортировать базу данных KeePass 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Невозможно открыть базу данных.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3020,15 +3919,15 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Недопустимый размер seed для преобразования</translation>
+ <translation>Недопустимый размер seed для трансформирования</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation>Недопустимое число циклов преобразования</translation>
+ <translation>Недопустимое количество раундов преобразования</translation>
</message>
<message>
<source>Unable to construct group tree</source>
- <translation>Не удалось создать дерево групп</translation>
+ <translation>Невозможно создать дерево групп</translation>
</message>
<message>
<source>Root</source>
@@ -3039,16 +3938,12 @@ Line %2, column %3</source>
<translation>Невозможно вычислить мастер-пароль</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Неверный ключ, либо повреждён файл базы данных.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
- <translation>Не удалось выполнить преобразование ключа </translation>
+ <translation>Невозможно преобразовать ключ</translation>
</message>
<message>
<source>Invalid group field type number</source>
- <translation>Недопустимый тип поля группы</translation>
+ <translation>Недопустимый номер типа поля группы</translation>
</message>
<message>
<source>Invalid group field size</source>
@@ -3076,7 +3971,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Incorrect group expiry time field size</source>
- <translation>Неверный размер поля времени истечения срока действия группы</translation>
+ <translation>Неверное значение поля времени истечения срока действия группы</translation>
</message>
<message>
<source>Incorrect group icon field size</source>
@@ -3092,15 +3987,15 @@ Line %2, column %3</source>
</message>
<message>
<source>Missing group id or level</source>
- <translation>Нет группового идентификатора или уровня</translation>
+ <translation>Отсутствует групповой идентификатор или уровень</translation>
</message>
<message>
<source>Missing entry field type number</source>
- <translation>Нет номера типа поля записи</translation>
+ <translation>Отсутствует номер типа поля записи</translation>
</message>
<message>
<source>Invalid entry field size</source>
- <translation>Неверный размер поля записи</translation>
+ <translation>Недопустимый размер поля записи</translation>
</message>
<message>
<source>Read entry field data doesn&apos;t match size</source>
@@ -3108,7 +4003,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation>Неверный размер поля UUID записи</translation>
+ <translation>Недопустимый размер поля UUID записи</translation>
</message>
<message>
<source>Invalid entry group id field size</source>
@@ -3128,7 +4023,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid entry expiry time field size</source>
- <translation>Недопустимый размер поля времени срока действия</translation>
+ <translation>Недопустимый размер поля времени для срока действия</translation>
</message>
<message>
<source>Invalid entry field type</source>
@@ -3138,40 +4033,57 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>не удалось переместиться к позиции содержимого</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Отключить общий доступ</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Импортировано из %1</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Импорт из</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Экспорт в</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Синхронизировать с</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Отключённый общий ресурс %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Импорт из общего ресурса %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Экспорт в общий ресурс %1</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Синхронизировать с общим ресурсом %1</translation>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3190,7 +4102,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation>Ключевой компонент установлен, нажмите, чтобы изменить или удалить</translation>
+ <translation>Ключевой компонент установлен, щёлкните, чтобы изменить или удалить</translation>
</message>
<message>
<source>Add %1</source>
@@ -3216,10 +4128,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Обзор</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Генерировать</translation>
</message>
@@ -3229,7 +4137,7 @@ Line %2, column %3</source>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation>&lt;p&gt;Для большей безопасности вы можете добавить ключевой файл со случайными байтами.&lt;/p&gt;&lt;p&gt;Храните его в надёжном месте и не теряйте, иначе будете заблокированы!&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Для большей надёжности можно добавить ключевой файл, содержащий случайные байты.&lt;/p&gt;&lt;p&gt;Этот файл нужно хранить в секрете и не терять, иначе не удастся получить доступ к данным.&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
@@ -3240,9 +4148,9 @@ Line %2, column %3</source>
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation>Вы используете ключевой файл устаревшего формата, поддержка которого впоследствии может прекратиться.
+ <translation>Вы используете ключевой файл устаревшего формата, поддержка которого в дальнейшем может быть прекращена.
-Сгенерируйте новый ключевой файл в настройках мастер-ключа.</translation>
+Перейдите в настройки мастер-ключа и создайте новый ключевой файл.</translation>
</message>
<message>
<source>Error loading the key file '%1'
@@ -3274,6 +4182,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>Выберите ключевой файл</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Обзор...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3287,7 +4232,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Help</source>
- <translation>&amp;Справка</translation>
+ <translation>Справка</translation>
</message>
<message>
<source>E&amp;ntries</source>
@@ -3347,11 +4292,11 @@ Message: %2</source>
</message>
<message>
<source>Copy &amp;username</source>
- <translation>Скопировать лог&amp;ин</translation>
+ <translation>Скопировать &amp;имя пользователя</translation>
</message>
<message>
<source>Copy username to clipboard</source>
- <translation>Скопировать логин в буфер обмена</translation>
+ <translation>Скопировать имя пользователя в буфер обмена</translation>
</message>
<message>
<source>Copy password to clipboard</source>
@@ -3362,10 +4307,6 @@ Message: %2</source>
<translation>&amp;Параметры</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Генератор паролей</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>&amp;Заблокировать базу данных</translation>
</message>
@@ -3453,7 +4394,7 @@ This version is not meant for production use.</source>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
<translation>ВНИМАНИЕ: Ваша версия Qt может привести к сбоям KeePassXC при работе с экранной клавиатурой!
-Рекомендуем использовать AppImage (см. нашу страницу загрузок).</translation>
+Рекомендуем использовать AppImage с нашей страницы загрузки.</translation>
</message>
<message>
<source>&amp;Import</source>
@@ -3493,11 +4434,11 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;Edit entry</source>
- <translation>Изменить запись</translation>
+ <translation>&amp;Изменить запись</translation>
</message>
<message>
<source>View or edit entry</source>
- <translation>Показать/изменить запись</translation>
+ <translation>Просмотреть или отредактировать запись</translation>
</message>
<message>
<source>&amp;New group</source>
@@ -3552,18 +4493,10 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation>Показать QR-код TOTP...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Проверить обновления...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Поделиться записью</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>ВНИМАНИЕ: Вы используете бета-версию KeePassXC!
-В ней возможны ошибки и небольшие проблемы, она не предназначена для основного применения.</translation>
+Она может содержать ошибки и не предназначена для повседневного использования.</translation>
</message>
<message>
<source>Check for updates on startup?</source>
@@ -3571,11 +4504,79 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation>Хотите проверять обновления KeePassXC при запуске?</translation>
+ <translation>Хотите, чтобы программа KeePassXC проверяла наличие обновлений при запуске?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
- <translation>Проверять наличие обновлений можно вручную из меню приложения.</translation>
+ <translation>Наличие обновлений можно проверять и вручную из меню программы.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Скачать значок сайта</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3594,7 +4595,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation>более старая запись из базы данных &quot;%1&quot;</translation>
+ <translation>более старая запись объединена из базы данных &quot;%1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
@@ -3610,7 +4611,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation>Повторное применение более старой исходной записи поверх более новой мишени %1 [%2]</translation>
+ <translation>Повторное применение более старой исходной записи поверх более новой цели %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
@@ -3626,7 +4627,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation>Удаление &quot;осиротевшей&quot; %1 [%2]</translation>
+ <translation>Удаление &apos;сироты&apos; %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
@@ -3636,6 +4637,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>Добавление отсутствующего значка %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3661,7 +4670,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>Здесь можно настроить параметры шифрования базы данных. Их можно будет изменить позже в настройках базы данных.</translation>
+ <translation>Здесь можно настроить шифрование базы данных. Вы сможете изменить параметры позже в настройках базы данных.</translation>
</message>
<message>
<source>Advanced Settings</source>
@@ -3680,7 +4689,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>Здесь можно настроить параметры шифрования базы данных. Их можно будет изменить позже в настройках базы данных.</translation>
+ <translation>Здесь можно настроить шифрование базы данных. Вы сможете изменить параметры позже в настройках базы данных.</translation>
</message>
</context>
<context>
@@ -3691,7 +4700,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation>Известный только вам мастер-ключ служит для защиты базы данных.</translation>
+ <translation>Известный только вам мастер-ключ для защиты базы данных.</translation>
</message>
</context>
<context>
@@ -3702,7 +4711,73 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
- <translation>Заполните отображаемое имя и, при желании, описание новой базы данных:</translation>
+ <translation>Заполните отображаемое имя и описание (необязательное) новой базы данных:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3733,15 +4808,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Failed to read public key.</source>
- <translation>Ошибка чтения открытого (публичного) ключа.</translation>
+ <translation>Не удалось прочитать публичный ключ.</translation>
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation>Ключевой файл повреждён, ошибка чтения закрытого (личного) ключа</translation>
+ <translation>Повреждённый ключевой файл, ошибка чтения частного ключа</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation>Нет данных для расшифровки в закрытом (личном) ключе</translation>
+ <translation>Нет сведений для дешифрования в частном ключе</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
@@ -3761,27 +4836,27 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation>Неожиданный конец файла при чтении открытого (публичного) ключа</translation>
+ <translation>Неожиданный конец файла при чтении публичного ключа</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation>Неожиданный конец файла при чтении закрытого (личного) ключа</translation>
+ <translation>Неожиданный конец файла при чтении частного ключа</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
- <translation>Невозможно записать открытый (публичный) ключ, так как он пуст</translation>
+ <translation>Невозможно записать публичный ключ, так как он пуст</translation>
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation>Неожиданный конец файла при записи открытого (публичного) ключа</translation>
+ <translation>Неожиданный конец файла при записи публичного ключа</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
- <translation>Невозможно записать закрытый (личный) ключ, так как он пуст</translation>
+ <translation>Невозможно записать частный ключ, так как он пуст</translation>
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation>Неожиданный конец файла при записи закрытого (личного) ключа</translation>
+ <translation>Неожиданный конец файла при записи частного ключа</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
@@ -3793,7 +4868,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
- <translation>Слишком короткий вектор инициализации (IV) для MD5 ФФК</translation>
+ <translation>Слишком короткий шифр IV для ФФК MD5</translation>
</message>
<message>
<source>Unknown KDF: %1</source>
@@ -3805,6 +4880,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3820,7 +4906,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Пароль - это основной метод защиты базы данных.&lt;/p&gt;&lt;p&gt;Хороший пароль должен быть длинным и уникальным. KeePassXC может сгенерировать его сам.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Пароль - основной метод защиты базы данных.&lt;/p&gt;&lt;p&gt;Хороший пароль должен быть длинным и уникальным. Программа KeePassXC может его сгенерировать сама.&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
@@ -3830,6 +4916,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Сгенерировать мастер-пароль</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3856,25 +4958,13 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Character Types</source>
- <translation>Виды символов</translation>
- </message>
- <message>
- <source>Upper Case Letters</source>
- <translation>Заглавные буквы</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Строчные буквы</translation>
+ <translation>Типы символов</translation>
</message>
<message>
<source>Numbers</source>
<translation>Цифры</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Специальные символы</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Расширенный ASCII</translation>
</message>
@@ -3952,21 +5042,13 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Advanced</source>
- <translation>Дополнительно</translation>
- </message>
- <message>
- <source>Upper Case Letters A to F</source>
- <translation>Заглавные буквы от A до F</translation>
+ <translation>Дополнительные</translation>
</message>
<message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Строчные буквы от A до F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3999,18 +5081,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Математические</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Тире</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4032,7 +5106,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Character set to exclude from generated password</source>
- <translation>Набор символов для исключения из сгенерированного пароля</translation>
+ <translation>Набор символов, исключаемых из пароля</translation>
</message>
<message>
<source>Do not include:</source>
@@ -4044,7 +5118,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Hex</source>
- <translation>Hex</translation>
+ <translation>16</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
@@ -4056,7 +5130,75 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Regenerate</source>
- <translation>Создать снова</translation>
+ <translation>Создать заново</translation>
+ </message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Скопировать пароль</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4065,12 +5207,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Выберите</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4085,7 +5224,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation>Переместить</translation>
+ <translation>Перемещение</translation>
</message>
<message>
<source>Empty</source>
@@ -4107,6 +5246,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>Слияние</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4120,7 +5263,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Client public key not received</source>
- <translation>Не получен открытый (публичный) ключ клиента</translation>
+ <translation>Не получен публичный ключ клиента</translation>
</message>
<message>
<source>Cannot decrypt message</source>
@@ -4148,7 +5291,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>No URL provided</source>
- <translation>Нет URL-адреса</translation>
+ <translation>Отсутствует URL-адрес</translation>
</message>
<message>
<source>No logins found</source>
@@ -4192,17 +5335,13 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Prompt for the entry&apos;s password.</source>
- <translation>Введите пароль записи.</translation>
+ <translation>Запрос пароля записи.</translation>
</message>
<message>
<source>Generate a password for the entry.</source>
<translation>Сгенерировать пароль для записи.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Длина сгенерированного пароля.</translation>
- </message>
- <message>
<source>length</source>
<translation>длина</translation>
</message>
@@ -4252,18 +5391,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Выполнить расширенный анализ пароля.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Извлечь и распечатать содержимое базы данных.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Путь к базе данных для извлечения.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Введите пароль для разблокировки %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4308,10 +5435,6 @@ Available commands:
<translation>Объединить две базы данных.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Путь к базе-приёмнику для объединения.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Путь к базе-источнику для объединения.</translation>
</message>
@@ -4388,10 +5511,6 @@ Available commands:
<translation>Интеграция с браузером</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Вызов-ответ - слот %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Нажать</translation>
</message>
@@ -4422,10 +5541,6 @@ Available commands:
<translation>Сгенерировать новый случайный пароль.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Неверная величина для длины пароля %1</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Не удалось создать запись с путём %1.</translation>
</message>
@@ -4435,7 +5550,7 @@ Available commands:
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation>Запись базы данных не удалась %1.</translation>
+ <translation>Ошибка при записи базы данных %1.</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
@@ -4467,7 +5582,7 @@ Available commands:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>Очищение буфера обмена через %1 секунду...</numerusform><numerusform>Очищение буфера обмена через %1 секунды..</numerusform><numerusform>Очищение буфера обмена через %1 секунд...</numerusform><numerusform>Очистка буфера обмена через %1 сек...</numerusform></translation>
+ <translation><numerusform>Очищение буфера обмена через %1 секунду...</numerusform><numerusform>Очищение буфера обмена через %1 секунды...</numerusform><numerusform>Очищение буфера обмена через %1 секунд...</numerusform><numerusform>Буфер обмена будет очищен через %1 сек...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4475,7 +5590,7 @@ Available commands:
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation>Заглушить запрос пароля и другие второстепенные выводы.</translation>
+ <translation>Не показывать запрос пароля и другие второстепенные выводы.</translation>
</message>
<message>
<source>count</source>
@@ -4483,16 +5598,12 @@ Available commands:
<translation>количество</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Неверное значение для длины пароля: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Не удалось найти запись с путём %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation>Не меняются никакие поля для записи %1.</translation>
+ <translation>Не меняются какие-либо поля для записи %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
@@ -4500,7 +5611,7 @@ Available commands:
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation>Ошибка записи базы данных: %1</translation>
+ <translation>Ошибка при записи базы данных: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
@@ -4532,15 +5643,15 @@ Available commands:
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation>Тип: Словать+замена букв цифрами/знаками</translation>
+ <translation>Тип: Словать+Leet</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation>Тип: Пользовательские слова</translation>
+ <translation>Тип: Польз. слова</translation>
</message>
<message>
<source>Type: User+Leet</source>
- <translation>Тип: Пользователь+замена букв цифрами/знаками</translation>
+ <translation>Тип: Польз. слова+Leet</translation>
</message>
<message>
<source>Type: Repeated</source>
@@ -4568,15 +5679,15 @@ Available commands:
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation>Тип: Словарь+замена букв цифрами/знаками (повт.)</translation>
+ <translation>Тип: Словарь+Leet (повт.)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation>Тип: Пользовательские слова (повт.)</translation>
+ <translation>Тип: Польз. слова (повт.)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation>Тип: Пользователь+замена букв цифрами/знаками (повт.)</translation>
+ <translation>Тип: Польз. слова+Leet (повт.)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
@@ -4608,31 +5719,11 @@ Available commands:
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation>Ошибка загрузки ключевого файла %1: %2</translation>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation>Файл %1 не существует.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Невозможно открыть файл %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Ошибка при чтении базы данных:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Ошибка при разборе базы данных:
-%1</translation>
+ <translation>Не удалось загрузить ключевой файл %1: %2</translation>
</message>
<message>
<source>Length of the generated password</source>
- <translation>Длина генерируемого пароля</translation>
+ <translation>Длина сгенерированного пароля</translation>
</message>
<message>
<source>Use lowercase characters</source>
@@ -4643,10 +5734,6 @@ Available commands:
<translation>Использовать заглавные буквы</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Использовать цифры</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Использовать специальные символы</translation>
</message>
@@ -4681,16 +5768,16 @@ Available commands:
<message>
<source>Error reading merge file:
%1</source>
- <translation>Ошибка при чтении объединяемого файла:
+ <translation>Ошибка при чтении файла слияния:
%1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation>Невозможно сохранить базу данных в файл: %1</translation>
+ <translation>Невозможно сохранить базу данных в файле: %1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation>Невозможно сохранить базу данных в файл: %1</translation>
+ <translation>Невозможно сохранить базу данных в файле: %1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
@@ -4710,11 +5797,11 @@ Available commands:
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation>Не задана программа для управления буфером обмена</translation>
+ <translation>Не задана программа для работы с буфером обмена</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation>Невозможно запустить программу %1</translation>
+ <translation>Не удалось запустить программу %1</translation>
</message>
<message>
<source>file empty</source>
@@ -4726,15 +5813,15 @@ Available commands:
</message>
<message>
<source>AES: 256-bit</source>
- <translation>AES: 256-бит</translation>
+ <translation>AES: 256 бит</translation>
</message>
<message>
<source>Twofish: 256-bit</source>
- <translation>Twofish: 256-бит</translation>
+ <translation>Twofish: 256 бит</translation>
</message>
<message>
<source>ChaCha20: 256-bit</source>
- <translation>ChaCha20: 256-бит</translation>
+ <translation>ChaCha20: 256 бит</translation>
</message>
<message>
<source>Argon2 (KDBX 4 – recommended)</source>
@@ -4780,7 +5867,7 @@ Available commands:
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation>Не задан ключ. Создание базы данных отменено.</translation>
+ <translation>Не задан ключ. Создание базы данных прервано.</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
@@ -4791,10 +5878,6 @@ Available commands:
<translation>Новая база данных успешно создана.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Введите пароль для шифрования базы данных (нажмите Enter, чтобы оставить его пустым):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Ошибка создания ключевого файла %1: %2</translation>
</message>
@@ -4803,10 +5886,6 @@ Available commands:
<translation>Ошибка загрузки ключевого файла %1: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Удалить запись из базы данных.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Путь к записи для удаления.</translation>
</message>
@@ -4844,7 +5923,7 @@ Available commands:
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
- <translation>Другой экземпляр KeePassXC уже запущен.</translation>
+ <translation>Уже запущен другой экземпляр KeePassXC.</translation>
</message>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
@@ -4852,7 +5931,7 @@ Available commands:
</message>
<message>
<source>KeePassXC - Error</source>
- <translation>Ошибка - KeePassXC</translation>
+ <translation>KeePassXC - Ошибка</translation>
</message>
<message>
<source>Database password: </source>
@@ -4862,6 +5941,330 @@ Available commands:
<source>Cannot create new group</source>
<translation>Невозможно создать новую группу</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Версия %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Тип сборки: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Ревизия: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Дистрибутив: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Операционная система: %1
+Архитектура ЦП: %2
+Ядро: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Автоввод</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (доступ с использованием подписей и без)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (доступ только с использованием подписи)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (доступ только без использованием подписи)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Включённые расширения:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>База данных не была изменена операцией объединения.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4901,7 +6304,7 @@ Available commands:
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation>Сбой подключения агента.</translation>
+ <translation>Ошибка подключения агента.</translation>
</message>
<message>
<source>Agent protocol error.</source>
@@ -4909,15 +6312,15 @@ Available commands:
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation>Агент не запущен, невозможно добавить идентификатор.</translation>
+ <translation>Агент не запущен, не удается добавить идентификатор.</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation>Агент не запущен, невозможно удалить идентификатор.</translation>
+ <translation>Агент не запущен, невозможно удалить учётную запись.</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
- <translation>Идентификатор отклонён агентом. Возможные причины:</translation>
+ <translation>Агент отклонил учётную запись. Возможные причины:</translation>
</message>
<message>
<source>The key has already been added.</source>
@@ -4936,7 +6339,7 @@ Available commands:
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation>Поиск в Справке</translation>
+ <translation>Искать в справке</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
@@ -4944,7 +6347,7 @@ Available commands:
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation>Каждое поисковое выражение должно иметь соответствие (т.е. логическое И)</translation>
+ <translation>Каждое поисковое выражение должно иметь соответствие (то есть логическое И)</translation>
</message>
<message>
<source>Modifiers</source>
@@ -4956,7 +6359,7 @@ Available commands:
</message>
<message>
<source>match term exactly</source>
- <translation>соответствовать выражению в точности</translation>
+ <translation>точно соответствовать выражению</translation>
</message>
<message>
<source>use regex in term</source>
@@ -4972,7 +6375,7 @@ Available commands:
</message>
<message>
<source>match anything</source>
- <translation>соответствие всему</translation>
+ <translation>соответствие любому</translation>
</message>
<message>
<source>match one</source>
@@ -5003,7 +6406,7 @@ Available commands:
</message>
<message>
<source>Search Help</source>
- <translation>Поиск в Справке</translation>
+ <translation>Искать в справке</translation>
</message>
<message>
<source>Search (%1)...</source>
@@ -5016,6 +6419,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Общие</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Группа</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Параметры базы данных</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Разблокировать базу данных</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Заблокировать базу данных</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5031,7 +6521,7 @@ Available commands:
</message>
<message>
<source>Own certificate</source>
- <translation>Свой сертификат</translation>
+ <translation>Собственный сертификат</translation>
</message>
<message>
<source>Fingerprint:</source>
@@ -5128,30 +6618,125 @@ Available commands:
</message>
<message>
<source>Exporting changed certificate</source>
- <translation>Экспортирование изменённого сертификата</translation>
+ <translation>Экспорт изменённого сертификата</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation>Экспортированный сертификат отличается от используемого. Хотите экспортировать текущий сертификат?</translation>
+ <translation>Экспортированный сертификат не такой же, как сейчас используемый. Экспортировать текущий сертификат?</translation>
</message>
<message>
<source>Signer:</source>
<translation>Подписант:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Ключ</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Перезапись подписанного совместного контейнера не поддерживается - экспорт запрещён</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Не удалось записать экспортируемый контейнер (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Не удалось встроить подпись: невозможно открыть файл для записи (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Не удалось встроить подпись: невозможно записать файл (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Не удалось встроить базу данных: невозможно открыть файл для записи (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Не удалось встроить базу данных: невозможно записать файл (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Перезапись не подписанного совместного контейнера не поддерживается - экспорт запрещён</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Не удалось записать экспортируемый контейнер</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Неизвестная ошибка экспорта</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
- <translation>Импортировать из контейнера без подписи</translation>
+ <translation>Импорт из контейнера без подписи</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
- <translation>Невозможно проверить источник общего контейнера, потому что он не подписан. Вы действительно хотите выполнить импорт из %1?</translation>
+ <translation>Невозможно проверить источник совместно используемого контейнера, потому что он не подписан. Вы действительно хотите выполнить импорт из %1?</translation>
</message>
<message>
<source>Import from container with certificate</source>
- <translation>Импортировать из контейнера с сертификатом</translation>
+ <translation>Импорт из контейнера с сертификатом</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Доверять %1 с отпечатком %2 из %3? {1 ?} {2 ?}</translation>
</message>
<message>
<source>Not this time</source>
@@ -5170,20 +6755,8 @@ Available commands:
<translation>Только сейчас</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Ошибка импорта из %1 (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Импорт из %1 выполнен (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Импортировано из %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
- <translation>Общий контейнер с подписью не поддерживается - импорт не выполнен</translation>
+ <translation>Подписанный совместно используемый контейнер не поддерживается - импорт запрещён</translation>
</message>
<message>
<source>File is not readable</source>
@@ -5191,11 +6764,11 @@ Available commands:
</message>
<message>
<source>Invalid sharing container</source>
- <translation>Неверный общий контейнер</translation>
+ <translation>Неверный совместно используемый контейнер</translation>
</message>
<message>
<source>Untrusted import prevented</source>
- <translation>Ненадёжный импорт не выполнен</translation>
+ <translation>Предотвращён ненадёжный импорт</translation>
</message>
<message>
<source>Successful signed import</source>
@@ -5207,7 +6780,7 @@ Available commands:
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation>Контейнер без подписи не поддерживается - импорт не выполнен</translation>
+ <translation>Не подписанный совместно используемый контейнер не поддерживается - импорт запрещён</translation>
</message>
<message>
<source>Successful unsigned import</source>
@@ -5219,27 +6792,22 @@ Available commands:
</message>
<message>
<source>Unknown share container type</source>
- <translation>Неизвестный тип контейнера</translation>
- </message>
- <message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Перезапись подписанного общего контейнера не поддерживается - экспорт не выполнен</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Ошибка записи экспортируемого контейнера (%1)</translation>
+ <translation>Неизвестный тип совместного контейнера</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Перезапись неподписанного общего контейнера не поддерживается - экспорт не выполнен</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Ошибка импорта из %1 (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Ошибка записи экспортируемого контейнера</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Импорт из %1 выполнен (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Неизвестная ошибка экспорта</translation>
+ <source>Imported from %1</source>
+ <translation>Импортировано из %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5254,10 +6822,6 @@ Available commands:
<translation>Экспорт в %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Доверять %1 с отпечатком %2 из %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Множественный путь источника импорта к %1 в %2</translation>
</message>
@@ -5265,22 +6829,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>Конфликтный путь цели экспорта %1 в %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Не удалось встроить подпись: невозможно открыть файл для записи (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Не удалось встроить подпись: невозможно записать файл (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Не удалось встроить базу данных: невозможно открыть файл для записи (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Не удалось встроить базу данных: невозможно записать файл (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5310,7 +6858,7 @@ Available commands:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation>* Эти параметры TOTP - пользовательские, они могут не работать с другими средствами проверки подлинности.</translation>
+ <translation>* Эти параметры TOTP - пользовательские и могут не работать с другими средствами проверки подлинности.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
@@ -5318,7 +6866,7 @@ Available commands:
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation>Закрытие через %1 сек.</translation>
+ <translation>Закрытие через %1 сек</translation>
</message>
</context>
<context>
@@ -5328,10 +6876,6 @@ Available commands:
<translation>Настроить TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Ключ:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Стандартные параметры токена RFC 6238</translation>
</message>
@@ -5341,11 +6885,11 @@ Available commands:
</message>
<message>
<source>Use custom settings</source>
- <translation>Использовать особые настройки</translation>
+ <translation>Использовать свои параметры</translation>
</message>
<message>
<source>Custom Settings</source>
- <translation>Особые настройки</translation>
+ <translation>Свои параметры</translation>
</message>
<message>
<source>Time step:</source>
@@ -5361,16 +6905,45 @@ Available commands:
<translation>Размер кода:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 цифр</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Алгоритм:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7 цифр</translation>
+ <source> digits</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 цифр</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5401,7 +6974,7 @@ Available commands:
</message>
<message>
<source>Software Update</source>
- <translation>Обновление ПО</translation>
+ <translation>Обновление программного обеспечения</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
@@ -5409,26 +6982,26 @@ Available commands:
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation>Доступна KeePassXC версии %1. У вас — %2.</translation>
+ <translation>Сейчас доступна KeePassXC версии %1. У вас — %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation>Загрузите её с keepassxc.org</translation>
+ <translation>Загрузите её с сайта keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation>У вас самая новая версия!</translation>
+ <translation>У вас самая новая версия программы!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation>На данный момент KeePassXC %1 — самая новая версия</translation>
+ <translation>KeePassXC %1 — самая новая версия на текущий момент</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
- <translation>Начать безопасное хранение ваших паролей в базе данных KeePassXC</translation>
+ <translation>Начать безопасное хранение паролей в базе данных KeePassXC</translation>
</message>
<message>
<source>Create new database</source>
@@ -5454,6 +7027,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>Вас приветствует KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5463,7 +7044,7 @@ Available commands:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation>Вызов-ответ YubiKey</translation>
+ <translation>YubiKey вызов-ответ</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
@@ -5471,11 +7052,19 @@ Available commands:
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation>YubiKey не обнаружен. Убедитесь, что он подключён.</translation>
+ <translation>YubiKey не обнаружен. Проверьте, подключён ли он.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
<translation>YubiKey не подключён.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_sk.ts b/share/translations/keepassx_sk.ts
index 50de22846..aadd1b145 100644
--- a/share/translations/keepassx_sk.ts
+++ b/share/translations/keepassx_sk.ts
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Štýl nasledovania</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Resetovať nastavenia?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>Spustiť len jednu inštanciu KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Zapamätať posledné databázy</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Zapamätať si posledné súbory kľúčov a bezpečnostných kľúčeniek</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Načítať predošlé databázy pri štarte</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Minimalizovať okno pri spustení aplikácie</translation>
</message>
@@ -163,10 +159,6 @@
<translation>Použiť ikonu skupiny pri vytváraní položky</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimalizovať pri skopírovaní do schránky</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Skryť panel náhľadu položky</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Skryť okno do oznamovacej oblasti pri minimalizácii</translation>
</message>
<message>
- <source>Language</source>
- <translation>Jazyk</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Automatické vypĺňanie</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Oneskorenia spustenia Auto-Type</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Pri štarte skontrolovať aktualizácie</translation>
+ <source>Movable toolbar</source>
+ <translation>Presúvateľný panel nástrojov</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Pri kontrole aktualizácii zahrnúť pred-vydania</translation>
+ <source>Remember previously used databases</source>
+ <translation>Zapamätať si predtým používané databázy</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Presúvateľný panel nástrojov</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Načítanie predtým otvorených databáz pri spustení</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation>Zapamätať databázové kľúčové súbory a zabezpečovacie HW kľúče</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>s</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>Výber jazyka</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>Obnoviť predvolené nastavenia</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Štýl tlačidla</translation>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -285,7 +354,7 @@
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>Zabudnúť TouchID po neaktivite dlhšej ako</translation>
+ <translation>Zabudnúť TouchID pri zamknutí relácie alebo zatvorení krytu</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@@ -320,8 +389,29 @@
<translation>Súkromie</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Na sťahovanie ikon použiť ako záložné riešenie DuckDuckGo</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>Používať služby DuckDuckGo na stiahnutie ikon webových stránok</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -340,7 +430,7 @@
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation>Syntax Vášho Automatického vypĺňania nieje správna!</translation>
+ <translation>Syntax Vášho Automatického vypĺňania nie je správna!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
@@ -348,7 +438,7 @@
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>Tento príkaz Automatického vypĺňania obsahuje príliš pomalé stlačenia kláves. Do you really want to proceed?</translation>
+ <translation>Tento príkaz Automatického vypĺňania obsahuje príliš pomalé stlačenia kláves. Naozaj ho chcete vykonať?</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
@@ -382,7 +472,7 @@
</message>
<message>
<source>Username</source>
- <translation>Používateľské meno</translation>
+ <translation>Použ. meno:</translation>
</message>
<message>
<source>Sequence</source>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Kopírovať po&amp;už. meno</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Kopírovať &amp;heslo</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Vyberte položku na Automatické vypĺňanie:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Hľadanie…</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 požiadal prístup k heslám nasledujúcej položky(iek).
Prosím, zvoľte, či chcete povoliť prístup.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>Povoliť prístup</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>Odmietnuť prístup</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,10 +570,6 @@ Prosím, vyberte správnu databázu na uloženie prihlasovacích údajov.</trans
<translation>Toto je potrebné na prístup k vašim databázam cez KeePassXC-Prehliadač</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Zapnúť Integráciu KeepassXC v prehliadači</translation>
- </message>
- <message>
<source>General</source>
<translation>Všeobecné</translation>
</message>
@@ -534,10 +643,6 @@ Prosím, vyberte správnu databázu na uloženie prihlasovacích údajov.</trans
<translation>Nikdy sa nepýtať pred &amp;úpravou údajov</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>S klientom má byť pripojená len zvolená databáza.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>&amp;Hľadať vyhovujúce údaje vo všetkých databázach</translation>
@@ -552,7 +657,7 @@ Prosím, vyberte správnu databázu na uloženie prihlasovacích údajov.</trans
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation>Pri spúšťaní automaticky aktualizovať cestu spustiteľného súboru s KeePassXC alebo keepassxc-proxy na skripty posielania správ medzi prehliadačom a KeePassXC (native messaging).</translation>
+ <translation>Pri štarte automaticky aktualizovať cestu spustiteľného súboru s KeePassXC alebo keepassxc-proxy na skripty posielania správ medzi prehliadačom a KeePassXC (native messaging).</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
@@ -593,10 +698,6 @@ Prosím, vyberte správnu databázu na uloženie prihlasovacích údajov.</trans
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Upozornenie&lt;/b&gt;, nebola nájdená aplikácia keepassxc-proxy!&lt;br /&gt;Prosím, skontrolujte inštalačný adresár KeePassXC alebo potvrďte vlastnú cestu v pokročilých nastaveniach.&lt;br /&gt;Integrácia prehliadača NEBUDE FUNGOVAŤ bez tejto proxy.&lt;br /&gt;Očakávaná cesta:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Spustiteľné súbory</translation>
</message>
@@ -621,6 +722,50 @@ Prosím, vyberte správnu databázu na uloženie prihlasovacích údajov.</trans
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>KeePassXC-Browser je potrebný aby fungovala integrácia s prehliadačom&lt;br /&gt; Stiahnite ho pre %1 a %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>Povoliť integráciu prehľadávača</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>Boli nainštalované prehliadače lebo &quot;snaps&quot; momentálne nie sú podporované.</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -649,7 +794,7 @@ zadajte mu jedinečný názov na identifikáciu a potvrďte ho.</translation>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
- <translation>Zdieľaný šifrovací kľúč s menom „%1” už existuje.
+ <translation>Zdiľaný šifrovací kľúč s menom „%1” už existuje.
Chcete ho prepísať?</translation>
</message>
<message>
@@ -680,7 +825,7 @@ Do vlastných dát presunuté %2 kľúče.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>Úspešne presunutý %n kľúč do vlastných dát.</numerusform><numerusform>Úspešne presunuté %n kľúče do vlastných dát.</numerusform><numerusform>Úspešne presunutých %n kľúčov do vlastných dát.</numerusform><numerusform>Úspešne presunutých %n kľúčov do vlastných dát.</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -714,6 +859,10 @@ Would you like to migrate your existing settings now?</source>
Je to potrebné kvôli správe aktuálnych pripojení prehliadača.
Chcete teraz migrovať svoje nastavenia?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Nezobrazovať znova toto upozornenie</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -766,17 +915,13 @@ Chcete teraz migrovať svoje nastavenia?</translation>
</message>
<message>
<source>Comments start with</source>
- <translation>Komentáre začínajú</translation>
+ <translation>Komentáre začínajú znakom</translation>
</message>
<message>
<source>First record has field names</source>
<translation>Prvý záznam obsahuje názvy polí</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Počet riadkov hlavičky na zahodenie</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Považovať „\” za znak „escape”</translation>
</message>
@@ -818,7 +963,7 @@ Chcete teraz migrovať svoje nastavenia?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n ďalšia správa preskočená]</numerusform><numerusform>[%n ďalšie správy preskočené</numerusform><numerusform>[%n ďalších správ preskočených]</numerusform><numerusform>[%n ďalších správ preskočených]</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -826,12 +971,28 @@ Chcete teraz migrovať svoje nastavenia?</translation>
<translation>Import CSV: chyby zápisu:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n stĺpec</numerusform><numerusform>%n stĺpce</numerusform><numerusform>%n stĺpcov</numerusform><numerusform>%n stĺpcov</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -840,11 +1001,11 @@ Chcete teraz migrovať svoje nastavenia?</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n bajt</numerusform><numerusform>%n bajty</numerusform><numerusform>%n bajtov</numerusform><numerusform>%n bajt(y)</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n riadok</numerusform><numerusform>%n riadky</numerusform><numerusform>%n riadkov</numerusform><numerusform>%n riadkov</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -867,10 +1028,6 @@ Chcete teraz migrovať svoje nastavenia?</translation>
<translation>Chyba čítania databázy: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Nemožno uložiť, databáza nemá meno súboru.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Do súboru nemožno zapisovať, pretože je otvorený v režime len na čítanie.</translation>
</message>
@@ -878,6 +1035,28 @@ Chcete teraz migrovať svoje nastavenia?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Kľúč nebol transformovaný. Je to chyba, prosím, nahláste ju vývojárom!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+Zálohovať databázu nachádzajúcu sa na %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>Nepodarilo sa uložiť, databáza neukazuje na platný súbor.</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>Nepodarilo sa uložiť, databázový súbor je iba na čítanie</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Kôš</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1068,14 @@ Chcete teraz migrovať svoje nastavenia?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Zadajte hlavný kľúč</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Súbor kľúča:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Heslo:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Prechádzať</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Obnoviť</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Výzva – odpoveď:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Starý formát kľúča</translation>
</message>
@@ -943,20 +1106,100 @@ Prosím, zvážte vygenerovanie nového súboru kľúča.</translation>
<translation>Zvoľte súbor kľúča</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID na rýchle odomknutie</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>Nepodarilo sa otvoriť kľúčový súbor: %1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Nemožno otvoriť databázu:
-%1</translation>
+ <source>Select slot...</source>
+ <translation>Vybrať slot...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Nemožno otvoriť súbor kľúča:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation>Odomknúť databázu KeePassXC</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>Zadajte heslo:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole pre heslo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Prepnúť viditeľnosť hesla</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Výber kľúčového súboru</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Výber slotu hardvérového kľúča</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Vyhľadať súbor kľúča</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Prechádzať…</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Obnoviť hardvérové tokeny</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>Hardvérový kľúč:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Môžete použiť hardvérový bezpečnostný kľúč ako &lt;strong&gt;Yubikey&lt;/strong&gt; alebo &lt;strong&gt;OnlyKey&lt;/strong&gt; so slotmi nakonfigurovanými pre HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Kliknite pre viac informácií...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>Pomocník pre hardvérový kľúč</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID pre rýchle odomknutie</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Vymazať</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>Vymazať súbor kľúča</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Vybrať súbor...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>Odomkntie zlyhalo a nebolo zadané žiadne heslo</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>Odomknutie databázy zlyhalo a nezadali ste heslo.
+Chcete sa pokúsiť znova s prázdnym heslom?
+
+Ak chcete zabrániť zobrazovaniu tejto chyby, musíte ísť do &quot;Nastavenia databázy/Zabezpečenia&quot; a obnoviť heslo.</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>Skúsiť znova s prázdnym heslom</translation>
</message>
</context>
<context>
@@ -1065,7 +1308,7 @@ Môže to brániť pripojeniu zásuvného modulu prehliadača.</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Úspešne odstránený %n šifrovací kľúč z nastavení KeePassXC.</numerusform><numerusform>Úspešne odstránené %n šifrovacie kľúče z nastavení KeePassXC.</numerusform><numerusform>Úspešne odstránených %n šifrovacích kľúčov z nastavení KeePassXC.</numerusform><numerusform>Úspešne odstránených %n šifrovacích kľúčov z nastavení KeePassXC.</numerusform></translation>
+ <translation><numerusform>Úspešne odstránené% n šifrovací kľúč (y) z KeePassXC nastavenia.</numerusform><numerusform>Úspešne odstránené% n šifrovací kľúč (y) z KeePassXC nastavenia.</numerusform><numerusform>Úspešne odstránené% n šifrovací kľúč (y) z KeePassXC nastavenia.</numerusform><numerusform>Úspešne odstránené %n šifrovacie kľúče z nastavení KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1091,7 +1334,7 @@ Povolenia na prístup k položkám budú odvolané.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Úspešne odstránené povolenia z %n položky.</numerusform><numerusform>Úspešne odstránené povolenia z %n položiek.</numerusform><numerusform>Úspešne odstránené povolenia z %n položiek.</numerusform><numerusform>Úspešne odstránené povolenia z %n položky.</numerusform></translation>
+ <translation><numerusform>Povolenia sa úspešne odstránili z% n položiek.</numerusform><numerusform>Povolenia sa úspešne odstránili z% n položiek.</numerusform><numerusform>Povolenia sa úspešne odstránili z% n položiek.</numerusform><numerusform>Povolenia sa úspešne odstránili z %n položiek.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1111,6 +1354,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Naozaj chcete presunúť všetky staré dáta integrácie prehliadača do najnovšej normy?
Je to potrebné kvôli udržaniu kompatibility so zásuvným modulom prehliadača.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>Kľúče prehliadača uložené</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>Odstrániť vybraný kľúč</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1120,7 +1371,7 @@ Je to potrebné kvôli udržaniu kompatibility so zásuvným modulom prehliadač
</message>
<message>
<source>AES: 256 Bit (default)</source>
- <translation>AES: 256 bit (predvolené)</translation>
+ <translation>AES: 256 bitov (predvolené)</translation>
</message>
<message>
<source>Twofish: 256 Bit</source>
@@ -1236,22 +1487,73 @@ Ak ponecháte toto číslo, môže byť prelomenie ochrany databázy príliš je
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>vlákno</numerusform><numerusform>vlákna</numerusform><numerusform>vlákien</numerusform><numerusform> vlákien</numerusform></translation>
+ <translation><numerusform>Závit (y)</numerusform><numerusform>Závit (y)</numerusform><numerusform>Závit (y)</numerusform><numerusform>vlákna</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>Zmeniť existujúci čas dešifrovania</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>Čas dešifrovania v sekundách</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Formát databázy</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>Šifrovací algoritmus</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>Funkcia odvodenia kľúča</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Využitie pamäte</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>Paralelizácia</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>Exponované položky</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>Neexponovať túto databázu</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1286,7 +1588,7 @@ Ak ponecháte toto číslo, môže byť prelomenie ochrany databázy príliš je
</message>
<message>
<source> MiB</source>
- <translation>MiB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1300,6 +1602,40 @@ Ak ponecháte toto číslo, môže byť prelomenie ochrany databázy príliš je
<source>Enable &amp;compression (recommended)</source>
<translation>Zapnúť &amp;komprimáciu (odporúčané)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>Odstrániť Kôš</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>Chcete odstrániť aktuálny Kôš a všetok jeho obsah?
+Táto akcia nie je reverzibilná.</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1309,7 +1645,7 @@ Ak ponecháte toto číslo, môže byť prelomenie ochrany databázy príliš je
</message>
<message>
<source>Breadcrumb</source>
- <translation type="unfinished"/>
+ <translation>Breadcrumb</translation>
</message>
<message>
<source>Type</source>
@@ -1341,7 +1677,7 @@ Ak ponecháte toto číslo, môže byť prelomenie ochrany databázy príliš je
</message>
<message>
<source>No encryption key added</source>
- <translation>Nie je pridaný šifrovací kľúč</translation>
+ <translation>Nebol pridaný šifrovací kľúč</translation>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
@@ -1367,6 +1703,10 @@ Naozaj chcete pokračovať bez hesla?</translation>
<source>Failed to change master key</source>
<translation>Zlyhala zmena hlavného kľúča</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>Pokračovať bez hesla</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1718,129 @@ Naozaj chcete pokračovať bez hesla?</translation>
<source>Description:</source>
<translation>Popis:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>Pre ďalšie informácie umiestnite kurzor myši na riadky s ikonami chýb.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Názov</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Hodnota</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>Názov databázy</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Popis</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>áno</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>nie</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>Databáza bola zmenená, ale zmeny ešte neboli uložené na disk.</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>Databáza obsahuje položky ktoré expirovali.</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>Jedinečné heslá</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1428,10 +1891,6 @@ This is definitely a bug, please report it to the developers.</source>
Toto je určite chyba, prosím nahláste ju vývojárom.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Súbor databázy neexistuje alebo nie je dostupný.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Zvoľte súbor CSV</translation>
</message>
@@ -1454,6 +1913,30 @@ Toto je určite chyba, prosím nahláste ju vývojárom.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Len na čítanie]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1471,7 +1954,7 @@ Toto je určite chyba, prosím nahláste ju vývojárom.</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>Naozaj chcete presunúť %1 položku do koša?</numerusform><numerusform>Naozaj chcete presunúť %1 položky do koša?</numerusform><numerusform>Naozaj chcete presunúť %1 položiek do koša?</numerusform><numerusform>Naozaj chcete presunúť %1 položiek do koša?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1533,19 +2016,15 @@ Chcete zlúčiť svoje zmeny?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>Naozaj chcete natrvalo odstrániť %n položku?</numerusform><numerusform>Naozaj chcete natrvalo odstrániť %n položky?</numerusform><numerusform>Naozaj chcete natrvalo odstrániť %n položiek?</numerusform><numerusform>Naozaj chcete natrvalo odstrániť %n položky?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Odstrániť položku?</numerusform><numerusform>Odstrániť položky?</numerusform><numerusform>Odstrániť položky?</numerusform><numerusform>Odstrániť položky?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Presunúť položku do koša?</numerusform><numerusform>Presunúť položky do koša?</numerusform><numerusform>Presunúť položky do koša?</numerusform><numerusform>Presunúť položky do koša?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Súbor otvorený v režime len na čítanie.</translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1588,12 +2067,6 @@ Disable safe saves and try again?</source>
Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Zapisovanie do databázy zlyhalo.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Heslá</translation>
</message>
@@ -1611,7 +2084,7 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>Položka „%1” má %2 odkaz. Chcete prepísať odkazy hodnotami, preskočiť túto položku alebo ju i tak odstrániť?</numerusform><numerusform>Položka „%1” má %2 odkazy. Chcete prepísať odkazy hodnotami, preskočiť túto položku alebo ju i tak odstrániť?</numerusform><numerusform>Položka „%1” má %2 odkazov. Chcete prepísať odkazy hodnotami, preskočiť túto položku alebo ju i tak odstrániť?</numerusform><numerusform>Položka „%1” má %2 odkazu. Chcete prepísať odkazy hodnotami, preskočiť túto položku alebo ju i tak odstrániť?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1637,6 +2110,14 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Shared group...</source>
<translation>Zdieľaná skupina…</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Zápis do databázy zlyhal: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1718,11 +2199,11 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n týždeň</numerusform><numerusform>%n týždne</numerusform><numerusform>%n týždňov</numerusform><numerusform>%n týždňov</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n mesiacoch</numerusform><numerusform>%n mesiacoch</numerusform><numerusform>%n mesiacoch</numerusform><numerusform>%n mesiacoch</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1750,12 +2231,24 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n rokov</numerusform><numerusform>%n rokov</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>Potvrdiť odstránenie</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Integrácia prehliadača</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1795,6 +2288,42 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Background Color:</source>
<translation>Farba pozadia:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1830,6 +2359,77 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Pre toto priradenie použiť špecifickú postupnosť:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Všeobecné</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Pridať</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odstrániť</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2449,26 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Delete all</source>
<translation>Odstrániť všetko</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2508,62 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Expires</source>
<translation>Platí do</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole pre heslo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Prepnúť viditeľnosť hesla</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1964,6 +2640,22 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Require user confirmation when this key is used</source>
<translation>Vyžadovať potvrdenie používateľa, keď je tento kľúč použitý</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1999,6 +2691,10 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Zdediť z nadradenej skupiny (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Položka má neuložené zmeny</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,68 +2723,98 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<translation>Neaktívne</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importovať z cesty</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Nepodpísaný kontajner KeeShare</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportovať do cesty</translation>
+ <source>KeeShare signed container</source>
+ <translation>Podpísaný kontajner KeeShare</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synchronizovať s cestou</translation>
+ <source>Select import source</source>
+ <translation>Zvoľte zdroj importu</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Táto verzia KeePassXC nepodporuje zdieľanie Vášho typu kontajnera. Prosím použite %1.</translation>
+ <source>Select export target</source>
+ <translation>Zvoľte cieľ exportu</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Zdieľanie databázy je vypnuté</translation>
+ <source>Select import/export file</source>
+ <translation>Vyberte súbor importu/exportu</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Export databázy je vpynutý</translation>
+ <source>Clear</source>
+ <translation>Vymazať</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Import databázy je vpynutý</translation>
+ <source>Import</source>
+ <translation>Importovať</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Nepodpísaný kontajner KeeShare</translation>
+ <source>Export</source>
+ <translation>Export</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Podpísaný kontajner KeeShare</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Vyberte zdroj importu</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Vyberte cieľ exportu</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Vyberte súbor importu/exportu</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Vymazať</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>Kontajner exportu %1 už je odkazovaný.</translation>
+ <source>Password field</source>
+ <translation>Pole pre heslo</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Kontajner importu %1 už je importovaný.</translation>
+ <source>Toggle password visibility</source>
+ <translation>Prepnúť viditeľnosť hesla</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Kontajner %1 importovaný a exportovaný rôznymi skupinami.</translation>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2121,6 +2847,34 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Nastaviť predvolenú &amp;postupnosť Automatického vypĺňania</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2146,7 +2900,7 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>Nemožno stiahnuť ikonu stránky</translation>
+ <translation>Nemožno stiahnuť ikonu stránky.</translation>
</message>
<message>
<source>Images</source>
@@ -2157,28 +2911,16 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
<translation>Všetky súbory</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Vlastná ikona už existuje</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Potvrďte odstránenie</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Vlastná ikona úspešne stiahnutá</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Tip: Môžete zapnúť DuckDuckGo ako náhradné riešenie v Nástroje&gt;Nastavenie&gt;Bezpečnosť</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>vyberte obrázok(y)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>Úspešne načítané %1 z %n ikony</numerusform><numerusform>Úspešne načítané %1 z %n ikon</numerusform><numerusform>Úspešne načítané %1 z %n ikon</numerusform><numerusform>Úspešne načítané %1 z %n ikony</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2186,15 +2928,51 @@ Vypnúť bezpečné ukladanie a skúsiť znova?</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n ikony už v databáze existuje</numerusform><numerusform>%n ikony už v databáze existujú</numerusform><numerusform>%n ikon už v databáze existuje</numerusform><numerusform>%n ikony už v databáze existuje</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>Nasledujúca ikona zlyhala:</numerusform><numerusform>Nasledujúce ikony zlyhali:</numerusform><numerusform>Nasledujúce ikony zlyhali:</numerusform><numerusform>Nasledujúce ikony zlyhali:</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Táto ikona je použitá v %n položke a bude nahradená predvolenou ikonou. Naozaj ju chcete odstrániť?</numerusform><numerusform>Táto ikona je použitá v %n položkách a bude nahradená predvolenou ikonou. Naozaj ju chcete odstrániť?</numerusform><numerusform>Táto ikona je použitá v %n položkách a bude nahradená predvolenou ikonou. Naozaj ju chcete odstrániť?</numerusform><numerusform>Táto ikona je použitá v %n položke a bude nahradená predvolenou ikonou. Naozaj ju chcete odstrániť?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2241,6 +3019,30 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<source>Value</source>
<translation>Hodnota</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2288,7 +3090,7 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>Naozaj chcete odstrániť %n prílohu?</numerusform><numerusform>Naozaj chcete odstrániť %n prílohy?</numerusform><numerusform>Naozaj chcete odstrániť %n príloh?</numerusform><numerusform>Naozaj chcete odstrániť %n príloh?</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2333,11 +3135,27 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>Nemožno otvoriť súbor:
-%1</numerusform><numerusform>Nemožno otvoriť súbory:
-%1</numerusform><numerusform>Nemožno otvoriť súbory:
-%1</numerusform><numerusform>Nemožno otvoriť súbory:
-%1</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>Prílohy</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2359,7 +3177,7 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
<message>
<source>Username</source>
- <translation>Používateľské meno</translation>
+ <translation>Použ. meno:</translation>
</message>
<message>
<source>URL</source>
@@ -2383,7 +3201,7 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
<message>
<source>Username</source>
- <translation>Používateľské meno</translation>
+ <translation>Použ. meno:</translation>
</message>
<message>
<source>URL</source>
@@ -2433,10 +3251,6 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generovať token TOPT</translation>
- </message>
- <message>
<source>Close</source>
<translation>Zatvoriť</translation>
</message>
@@ -2521,6 +3335,14 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<source>Share</source>
<translation>Zdieľať</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Pokročilé</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2554,11 +3376,33 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Kôš</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2577,6 +3421,58 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Zrušiť</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zatvoriť</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2598,10 +3494,6 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<translation>Nemožno vyvolať výzvu – odpoveď.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Zlý kľúč alebo je súbor databázy poškodený.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>chýbajúce hlavičky databázy</translation>
</message>
@@ -2621,6 +3513,11 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<source>Invalid header data length</source>
<translation>Neplatná dĺžka dát hlavičky</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2652,10 +3549,6 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<translation>Nezhoda hlavičky SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Zlý kľúč alebo je súbor databázy poškodený (nezhoda HMAC).</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Neznáma šifra</translation>
</message>
@@ -2703,23 +3596,22 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Neplatná dĺžka názvu položky mapy varianty</translation>
+ <translation>Neplatná dĺžka názvu položky meta-dát</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Neplatné dáta názvu položky mapy varianty</translation>
+ <translation>Neplatné dáta názvu položky meta-dát</translation>
</message>
<message>
<source>Invalid variant map entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Neplatná dĺžka hodnoty položky mapy varianty
- </translation>
+ <translation>Neplatná dĺžka hodnoty položky meta-dát</translation>
</message>
<message>
<source>Invalid variant map entry value data</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>Neplatné dáta hodnoty položky mapy varianty</translation>
+ <translation>Neplatné dáta hodnoty položky meta-dát</translation>
</message>
<message>
<source>Invalid variant map Bool entry value length</source>
@@ -2756,6 +3648,15 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Neplatná veľkosť typu poľa meta-dát</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2786,7 +3687,7 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
<message>
<source>Invalid compression flags length</source>
- <translation>Nepodporovaný komprimačný algoritmus</translation>
+ <translation>Neplatná dĺžka príznakov komprimácie</translation>
</message>
<message>
<source>Unsupported compression algorithm</source>
@@ -2798,7 +3699,7 @@ Môže to spôsobiť nefunkčnosť dotknutých zásuvných modulov.</translation
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Neplatná transformácia hlavnej náhodnosti (seed)</translation>
+ <translation>Neplatná transformácia náhodnosti (seed)</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
@@ -2871,11 +3772,11 @@ Je to jednosmerná migrácia. Importovanú databázu už nebude možné otvoriť
</message>
<message>
<source>Null group uuid</source>
- <translation>Nulový UUID skupiny</translation>
+ <translation>Žiadne UUID skupiny</translation>
</message>
<message>
<source>Invalid group icon number</source>
- <translation>Neplatný počet ikon skupiny</translation>
+ <translation>Neplatné číslo ikony skupiny</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
@@ -2891,7 +3792,7 @@ Je to jednosmerná migrácia. Importovanú databázu už nebude možné otvoriť
</message>
<message>
<source>Null DeleteObject uuid</source>
- <translation>Nulový UUID DeleteObject</translation>
+ <translation>Žiadne UUID DeleteObject</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
@@ -2899,11 +3800,11 @@ Je to jednosmerná migrácia. Importovanú databázu už nebude možné otvoriť
</message>
<message>
<source>Null entry uuid</source>
- <translation>Nulový UUID položky</translation>
+ <translation>Žiadne UUID položky</translation>
</message>
<message>
<source>Invalid entry icon number</source>
- <translation>Neplatný počet ikon položky</translation>
+ <translation>Neplatné číslo ikony položky</translation>
</message>
<message>
<source>History element in history entry</source>
@@ -2923,7 +3824,7 @@ Je to jednosmerná migrácia. Importovanú databázu už nebude možné otvoriť
</message>
<message>
<source>Entry string key or value missing</source>
- <translation>Chýba kľúč alebo hodnota reťazca položky</translation>
+ <translation>Chýba textový kľúč alebo hodnota položky</translation>
</message>
<message>
<source>Duplicate attachment found</source>
@@ -2951,7 +3852,7 @@ Je to jednosmerná migrácia. Importovanú databázu už nebude možné otvoriť
</message>
<message>
<source>Invalid color rgb part</source>
- <translation>neplatná časť RGB farby</translation>
+ <translation>Neplatná časť RGB farby</translation>
</message>
<message>
<source>Invalid number value</source>
@@ -2978,13 +3879,13 @@ Riadok %2, stĺpec %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importovať databázu KeePass 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Nemožno otvoriť databázu.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3023,7 +3924,7 @@ Riadok %2, stĺpec %3</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Neplatná transformácia hlavnej náhodnosti (seed)</translation>
+ <translation>Neplatná transformácia náhodnosti (seed)</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
@@ -3042,10 +3943,6 @@ Riadok %2, stĺpec %3</translation>
<translation>Nemožno vypočítať hlavný kľúč</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Zlý kľúč alebo je súbor databázy poškodený.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Transformácia kľúča zlyhala</translation>
</message>
@@ -3141,40 +4038,57 @@ Riadok %2, stĺpec %3</translation>
<source>unable to seek to content position</source>
<translation>nemožno sa posunúť na pozíciu obsahu</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Vypnúť zdieľanie</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importované z %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importovať z</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Exportovať do</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synchronizovať s</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Vypnuté zdieľanie %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Importovať zo zdieľania %1</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Exportovať do zdieľania %1</translation>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Synchronizovať so zdieľaním %1</translation>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3219,10 +4133,6 @@ Riadok %2, stĺpec %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Prechádzať</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generovať</translation>
</message>
@@ -3277,6 +4187,43 @@ Správa: %2</translation>
<source>Select a key file</source>
<translation>Zvoľte súbor kľúča</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>Výber kľúčového súboru</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>Vyhľadať súbor kľúča</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Prechádzať…</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3365,10 +4312,6 @@ Správa: %2</translation>
<translation>Na&amp;stavenia</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Generátor hesla</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>Za&amp;mknúť databázy</translation>
</message>
@@ -3555,14 +4498,6 @@ Odporúčame použiť AppImage dostupný v našej stránke sťahovaní.</transla
<translation>Zobraziť QR kód TOTP</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Skontrolovať aktualizácie…</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Zdieľať položku</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>UPOZORNENIE: Používate nestabilné zostavenie KeePassXC!
@@ -3580,6 +4515,74 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<source>You can always check for updates manually from the application menu.</source>
<translation>Vždy môžete skontrolovať aktualizácie manuálne z menu aplikácie.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Stiahnuť ikonu stránky</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3609,34 +4612,42 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Aplikujem položku staršieho cieľa na novší cieľ %1 [%2]</translation>
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Aplikujem položku staršieho zdroja na novší cieľ %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Synchronizujem z nového zdroja %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Synchronizujem zo staršieho zdroja %1 [%2]</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Vymazávam potomka %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Vymazávam sirotu %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
- <translation type="unfinished"/>
+ <translation>Zmenené vymazané objekty</translation>
</message>
<message>
<source>Adding missing icon %1</source>
+ <translation>Pridáva sa chýbajúca ikona %1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3644,7 +4655,7 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation type="unfinished"/>
+ <translation>Vytvoriť novú databázu KeePassXC...</translation>
</message>
<message>
<source>Root</source>
@@ -3709,6 +4720,72 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3808,6 +4885,17 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3833,6 +4921,22 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<source>Generate master password</source>
<translation>Vygenerovať hlavné heslo</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation>Pole pre heslo</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Prepnúť viditeľnosť hesla</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3862,22 +4966,10 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<translation>Typy znakov</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Veľké písmená</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Malé písmená</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Číslice</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Špeciálne znaky</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Rozšírené ASCII</translation>
</message>
@@ -3928,7 +5020,7 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<message>
<source>Poor</source>
<comment>Password quality</comment>
- <translation>Slabé</translation>
+ <translation>Biedne</translation>
</message>
<message>
<source>Weak</source>
@@ -3958,18 +5050,10 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<translation>Pokročilé</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>Veľké písmená A až F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Ž</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Malé písmená A až F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-ž</translation>
</message>
@@ -4002,18 +5086,10 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematické</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Oddeľovače</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4051,7 +5127,7 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
- <translation>Vynechané znaky: „0”, „1”, „l”, „I”, „O”, „|”, „﹒”</translation>
+ <translation>Vynechané znaky: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
</message>
<message>
<source>Word Co&amp;unt:</source>
@@ -4061,6 +5137,74 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<source>Regenerate</source>
<translation>Obnoviť</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>Prepnúť viditeľnosť hesla</translation>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4068,12 +5212,9 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Vybrať</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4110,6 +5251,10 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<source>Merge</source>
<translation>Zlúčiť</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4155,7 +5300,7 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
</message>
<message>
<source>No logins found</source>
- <translation>Nebolo nájdené prihlásenie</translation>
+ <translation>Neboli nájdené prihlásenia</translation>
</message>
<message>
<source>Unknown error</source>
@@ -4202,16 +5347,12 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<translation>Generovať heslo tejto položky.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Dĺžka generovaného hesla.</translation>
- </message>
- <message>
<source>length</source>
<translation>dĺžka</translation>
</message>
<message>
<source>Path of the entry to add.</source>
- <translation>Cesta pridávanej položky</translation>
+ <translation>Cesta pridávanej položky.</translation>
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
@@ -4255,18 +5396,6 @@ Očakávajte chyby a menšie problémy, táto verzia nie je určená na produkč
<translation>Vykonať pokročilú analýzu hesla.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Vytiahnuť a vypísať obsah databázy.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Cesta databázy na vytiahnutie.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Na odomknutie zadajte heslo: %1</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4311,10 +5440,6 @@ Dostupné príkazy:
<translation>Zlúčiť dve databázy.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Cesta databázy, do ktorej zlúčiť.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Cesta k databáze, z ktorej zlúčiť.</translation>
</message>
@@ -4356,7 +5481,7 @@ Dostupné príkazy:
</message>
<message>
<source>missing closing quote</source>
- <translation>chýba koncová úvodzovka</translation>
+ <translation>chýbajúca koncová úvodzovka</translation>
</message>
<message>
<source>Group</source>
@@ -4368,7 +5493,7 @@ Dostupné príkazy:
</message>
<message>
<source>Username</source>
- <translation>Používateľské meno</translation>
+ <translation>Použ. meno:</translation>
</message>
<message>
<source>Password</source>
@@ -4391,10 +5516,6 @@ Dostupné príkazy:
<translation>Integrácia prehliadača</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Výzva – odpoveď – slot %2 – %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Stlačiť</translation>
</message>
@@ -4425,10 +5546,6 @@ Dostupné príkazy:
<translation>Generovať nové náhodné heslo.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Neplatná hodnota dĺžky hesla %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Nemožno vytvoriť položku s cestou %1.</translation>
</message>
@@ -4462,7 +5579,7 @@ Dostupné príkazy:
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation>TTOP aktuálnej položky skopírovaný do schránky!</translation>
+ <translation>TTOP aktuálnej položky skopírované do schránky!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
@@ -4478,7 +5595,7 @@ Dostupné príkazy:
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation type="unfinished"/>
+ <translation>Umlčať prompt hesla a ďalšie sekundárne výstupy</translation>
</message>
<message>
<source>count</source>
@@ -4486,16 +5603,12 @@ Dostupné príkazy:
<translation>počet</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Nepodarilo sa nájsť položku s cestou %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Nemení sa žiadne pole položky %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
@@ -4535,11 +5648,11 @@ Dostupné príkazy:
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation>Typ: Slovník+Leet</translation>
+ <translation>Typ: Slovníík+Leet</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation>Typ: Použ. slová</translation>
+ <translation>Type: Použ. slová</translation>
</message>
<message>
<source>Type: User+Leet</source>
@@ -4563,23 +5676,23 @@ Dostupné príkazy:
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
- <translation>Typ: Hrubou silou(Rep)</translation>
+ <translation>Typ: Hrubou silou (Opak)</translation>
</message>
<message>
<source>Type: Dictionary(Rep)</source>
- <translation>Typ: Slovník(Rep)</translation>
+ <translation>Typ: Slovník(Opak)</translation>
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation>Typ: Slovník+Leet(Rep)</translation>
+ <translation>Typ: Slovník+Leet(Opak)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation>Type: Použ. slová(Rep)</translation>
+ <translation>Type: Použ. slová(Opak)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation>Typ: Použ.+Leet(Rep)</translation>
+ <translation>Typ: Použ.+Leet(Opak)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
@@ -4607,33 +5720,13 @@ Dostupné príkazy:
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation type="unfinished"/>
+ <translation>*** Dĺžka hesla (%1) NIE JE súčtom dĺžky častí (%2) * * *</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
<translation>Zlyhalo načítanie súboru kľúča %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Súbor %1 neexistuje.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Nemožno otvoriť súbor %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Chyba čítania databázy:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Chyba spracovania databázy:
-1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Dĺžka generovaného hesla</translation>
</message>
@@ -4646,10 +5739,6 @@ Dostupné príkazy:
<translation>Použiť veľké písmená</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Použiť čísla</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Použiť špeciálne znaky</translation>
</message>
@@ -4675,7 +5764,7 @@ Dostupné príkazy:
</message>
<message>
<source>Recursively list the elements of the group.</source>
- <translation type="unfinished"/>
+ <translation>Rekurzívne vypísať zoznam prvkov skupiny.</translation>
</message>
<message>
<source>Cannot find group %1.</source>
@@ -4697,11 +5786,11 @@ Dostupné príkazy:
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Položka %1 bola úspešne recyklovaná.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Položka %1 bola úspešne odstránená.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
@@ -4725,7 +5814,7 @@ Dostupné príkazy:
</message>
<message>
<source>%1: (row, col) %2,%3</source>
- <translation type="unfinished"/>
+ <translation>%1: (riadok, stĺpec) %2, %3</translation>
</message>
<message>
<source>AES: 256-bit</source>
@@ -4794,20 +5883,12 @@ Dostupné príkazy:
<translation>Úspešne vytvorená nová databáza.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Zadajte heslo na zašifrovanie databázy (Stlačte Enter na ponechanie prázdneho): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
+ <translation>Vytvorenie súboru KeyFile %1 zlyhalo: %2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>Odstrániť položku z databázy.</translation>
+ <translation>Načítanie súboru KeyFile %1 zlyhalo: %2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4865,6 +5946,330 @@ Dostupné príkazy:
<source>Cannot create new group</source>
<translation>Nemožno vytvoriť novú skupinu</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Verzia %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Typ zostavenia: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Revízia %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Distribúcia %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operačný systém: %1
+Architektúra CPU: %2
+Jadro: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Automatické vypĺňanie</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (podpísané a nepodpísané zdieľanie)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (len podpísané zdieľanie)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (len nepodpísané zdieľanie)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Žiadny</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Zapnuté rozšírenia:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Databáza nebola operáciou zlúčenia zmenená.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -4912,7 +6317,7 @@ Dostupné príkazy:
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation>Nie je spustený žiadny agent, nemožno identifikovať.</translation>
+ <translation>Nie je spustený žiadny agent, nemožno pridať identitu.</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
@@ -4928,7 +6333,7 @@ Dostupné príkazy:
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation>Obmedzená doba platnosti nie je agentom podporovaná (skontrolujte voľby)</translation>
+ <translation>Obmedzená doba platnosti nie je agentom podporovaná (skontrolujte voľby).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
@@ -4943,11 +6348,11 @@ Dostupné príkazy:
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>Hľadané výrazy sú nasledovné: [modifikátory] [pole:] [&quot;] termín [&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>Každý hľadaný výraz sa musí zhodovať (tj. platí logický AND)</translation>
</message>
<message>
<source>Modifiers</source>
@@ -4955,15 +6360,15 @@ Dostupné príkazy:
</message>
<message>
<source>exclude term from results</source>
- <translation type="unfinished"/>
+ <translation>vylúčiť hľadaný výraz z výsledkov</translation>
</message>
<message>
<source>match term exactly</source>
- <translation type="unfinished"/>
+ <translation>presná zhoda výrazu</translation>
</message>
<message>
<source>use regex in term</source>
- <translation type="unfinished"/>
+ <translation>použiť regex vo výraze</translation>
</message>
<message>
<source>Fields</source>
@@ -4971,19 +6376,19 @@ Dostupné príkazy:
</message>
<message>
<source>Term Wildcards</source>
- <translation type="unfinished"/>
+ <translation>zástupné znaky (wildcards) vo výraze</translation>
</message>
<message>
<source>match anything</source>
- <translation type="unfinished"/>
+ <translation>zhoda s ktorýmkoľvek z výrazov</translation>
</message>
<message>
<source>match one</source>
- <translation type="unfinished"/>
+ <translation>zhoda s jedným z výrazov</translation>
</message>
<message>
<source>logical OR</source>
- <translation type="unfinished"/>
+ <translation>logické OR (alebo)</translation>
</message>
<message>
<source>Examples</source>
@@ -5019,6 +6424,93 @@ Dostupné príkazy:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Všeobecné</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Skupina</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Nastavenia databázy</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Odomknúť databázu</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Zamknúť databázu</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Žiadny</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5070,7 +6562,7 @@ Dostupné príkazy:
</message>
<message>
<source>Trust</source>
- <translation>Dôverovať</translation>
+ <translation>Dôveryhodnosť</translation>
</message>
<message>
<source>Ask</source>
@@ -5115,11 +6607,11 @@ Dostupné príkazy:
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation type="unfinished"/>
+ <translation>key.share</translation>
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>Kľúčový súbor KeeShare</translation>
</message>
<message>
<source>All files</source>
@@ -5131,158 +6623,217 @@ Dostupné príkazy:
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>Exportuje sa zmenený certifikát</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation type="unfinished"/>
+ <translation>Exportovaný certifikát nie je rovnaký ako ten, ktorý sa používa. Chcete exportovať aktuálny certifikát?</translation>
</message>
<message>
<source>Signer:</source>
- <translation type="unfinished"/>
+ <translation>Podpísaný:</translation>
</message>
-</context>
-<context>
- <name>ShareObserver</name>
<message>
- <source>Import from container without signature</source>
+ <source>Allow KeeShare imports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <source>Allow KeeShare exports</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from container with certificate</source>
+ <source>Only show warnings and errors</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Not this time</source>
- <translation>Teraz nie</translation>
- </message>
- <message>
- <source>Never</source>
- <translation>Nikdy</translation>
- </message>
- <message>
- <source>Always</source>
- <translation>Vždy</translation>
- </message>
- <message>
- <source>Just this time</source>
- <translation>Len tentokrát</translation>
+ <source>Key</source>
+ <translation>Kľúč</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
+ <source>Signer name field</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from %1 successful (%2)</source>
+ <source>Generate new certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Imported from %1</source>
+ <source>Import existing certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Signed share container are not supported - import prevented</source>
+ <source>Export own certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>File is not readable</source>
+ <source>Known shares</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Invalid sharing container</source>
+ <source>Trust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Untrusted import prevented</source>
+ <source>Ask whether to trust the selected certificate every time</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Successful signed import</source>
+ <source>Untrust selected certificate</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Unexpected error</source>
+ <source>Remove selected certificate</source>
<translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ShareExport</name>
<message>
- <source>Unsigned share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation> 
+Prepis podpísaných zdieľaných kontajnerov nie je podporovaný - export sa neuskutočnil</translation>
</message>
<message>
- <source>Successful unsigned import</source>
- <translation type="unfinished"/>
+ <source>Could not write export container (%1)</source>
+ <translation>Nie je možné zapísať do exportného kontajnera (%1)</translation>
</message>
<message>
- <source>File does not exist</source>
- <translation type="unfinished"/>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Podpis sa nedá vložiť: nedá sa otvoriť súbor na zápis (%1)</translation>
</message>
<message>
- <source>Unknown share container type</source>
- <translation type="unfinished"/>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Podpis sa nedá vložiť: súbor sa nedá zapísať (%1)</translation>
</message>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Nepodarilo sa vložiť databázu: nedá sa otvoriť súbor na zápis (%1)</translation>
</message>
<message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Nedá sa vložiť databáza: súbor sa nedá zapísať (%1)</translation>
</message>
<message>
<source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <translation>Prepis nepodpísaných zdieľaných kontajnerov nie je podporovaný - export sa neuskutočnil</translation>
</message>
<message>
<source>Could not write export container</source>
- <translation type="unfinished"/>
+ <translation>Nemožno zapísať do exportného kontajnera</translation>
</message>
<message>
<source>Unexpected export error occurred</source>
- <translation type="unfinished"/>
+ <translation>Vyskytla sa neočakávaná chyba exportu</translation>
</message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
- <source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <source>Import from container without signature</source>
+ <translation>Import z kontajnera bez podpisu</translation>
</message>
<message>
- <source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
+ <translation>Nie je možné overiť zdroj zdieľaného kontajnera, pretože nie je podpísaný. Naozaj chcete importovať z %1?</translation>
</message>
<message>
- <source>Export to %1</source>
- <translation type="unfinished"/>
+ <source>Import from container with certificate</source>
+ <translation>Importovať z kontajnera s certifikátom</translation>
</message>
<message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
+ <translation>Chcete dôverovať %1 odtlačkom prsta %2 z %3? {1?} {2?}</translation>
</message>
<message>
- <source>Multiple import source path to %1 in %2</source>
- <translation type="unfinished"/>
+ <source>Not this time</source>
+ <translation>Teraz nie</translation>
</message>
<message>
- <source>Conflicting export target path %1 in %2</source>
- <translation type="unfinished"/>
+ <source>Never</source>
+ <translation>Nikdy</translation>
</message>
<message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
+ <source>Always</source>
+ <translation>Vždy</translation>
</message>
<message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <source>Just this time</source>
+ <translation>Len tentokrát</translation>
</message>
<message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
+ <source>Signed share container are not supported - import prevented</source>
+ <translation>Podpísané zdieľané kontajnery nie sú podporované - import sa neuskutočnil</translation>
</message>
<message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <source>File is not readable</source>
+ <translation>Súbor nie je čitateľný</translation>
+ </message>
+ <message>
+ <source>Invalid sharing container</source>
+ <translation>Neplatný kontajner zdieľania</translation>
+ </message>
+ <message>
+ <source>Untrusted import prevented</source>
+ <translation>Bolo zabránené nedôveryhodnému importu</translation>
+ </message>
+ <message>
+ <source>Successful signed import</source>
+ <translation>Úspešný podpísaný import</translation>
+ </message>
+ <message>
+ <source>Unexpected error</source>
+ <translation>Neočakávaná chyba</translation>
+ </message>
+ <message>
+ <source>Unsigned share container are not supported - import prevented</source>
+ <translation>Nepodpísané zdieľané kontajnery nie sú podporované - import sa neuskutočnil</translation>
+ </message>
+ <message>
+ <source>Successful unsigned import</source>
+ <translation>Úspešný nepodpísaný import</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>Súbor neexistuje</translation>
+ </message>
+ <message>
+ <source>Unknown share container type</source>
+ <translation>Neznámy typ kontajnera zdieľania</translation>
+ </message>
+</context>
+<context>
+ <name>ShareObserver</name>
+ <message>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import z %1 zlyhal (%2)</translation>
+ </message>
+ <message>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import z %1 úspešný (%2)</translation>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Importované z %1</translation>
+ </message>
+ <message>
+ <source>Export to %1 failed (%2)</source>
+ <translation>Exportovanie do %1 zlyhalo (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1 successful (%2)</source>
+ <translation>Export do %1 úspešný (%2)</translation>
+ </message>
+ <message>
+ <source>Export to %1</source>
+ <translation>Exportovať do %1</translation>
+ </message>
+ <message>
+ <source>Multiple import source path to %1 in %2</source>
+ <translation>Viaceré cesty zdroja importu do %1 v %2</translation>
+ </message>
+ <message>
+ <source>Conflicting export target path %1 in %2</source>
+ <translation>Konfliktná cieľová cesta exportu %1 v %2</translation>
</message>
</context>
<context>
@@ -5313,15 +6864,15 @@ Dostupné príkazy:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>Poznámka: tieto nastavenia TOTP sú používateľské a nemusia pracovať s inými autentikátormi.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation type="unfinished"/>
+ <translation>Pri vytváraní QR kódu sa vyskytla chyba.</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation type="unfinished"/>
+ <translation>Zatvorí sa za %1 sekúnd.</translation>
</message>
</context>
<context>
@@ -5331,10 +6882,6 @@ Dostupné príkazy:
<translation>Nastaviť TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Kľúč:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Predvolené nastavenia tokenu RFC 6238</translation>
</message>
@@ -5348,7 +6895,7 @@ Dostupné príkazy:
</message>
<message>
<source>Custom Settings</source>
- <translation type="unfinished"/>
+ <translation>Používateľské nastavenia</translation>
</message>
<message>
<source>Time step:</source>
@@ -5364,27 +6911,56 @@ Dostupné príkazy:
<translation>Veľkosť kódu:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 číslic</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
+ <source> digits</source>
<translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 číslic</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation type="unfinished"/>
+ <translation>Kontrola aktualizácií</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation type="unfinished"/>
+ <translation>Kontrola aktualizácií...</translation>
</message>
<message>
<source>Close</source>
@@ -5392,39 +6968,39 @@ Dostupné príkazy:
</message>
<message>
<source>Update Error!</source>
- <translation type="unfinished"/>
+ <translation>Chyba pri aktualizácii!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation type="unfinished"/>
+ <translation>Pri získavaní informácií o aktualizácii sa vyskytla chyba.</translation>
</message>
<message>
<source>Please try again later.</source>
- <translation type="unfinished"/>
+ <translation>Skúste to znova neskôr.</translation>
</message>
<message>
<source>Software Update</source>
- <translation type="unfinished"/>
+ <translation>Aktualizácia softvéru</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation type="unfinished"/>
+ <translation>Už existuje nová verzia KeePassXC!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation type="unfinished"/>
+ <translation>Už existuje KeePassXC %1 – vy máte %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation type="unfinished"/>
+ <translation>Stiahnite si ho na keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation type="unfinished"/>
+ <translation>Máte najnovšiu verziu.</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 je v súčasnosti najnovšia verzia</translation>
</message>
</context>
<context>
@@ -5457,6 +7033,14 @@ Dostupné príkazy:
<source>Welcome to KeePassXC %1</source>
<translation>Vitajte v KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5466,19 +7050,27 @@ Dostupné príkazy:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation type="unfinished"/>
+ <translation>YubiKey výzva-odpoveď (Challenge-Response)</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Ak vlastníte &lt;a href=&quot;https://www.yubico.com/&quot;&gt;Yubikey&lt;/a&gt;, môžete ho použiť na dodatočné zabezpečenie.&lt;/p&gt;&lt;p&gt;YubiKey vyžaduje, aby jeden z jeho slotov bol naprogramovaný ako &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation type="unfinished"/>
+ <translation>Nebol zistený žiadny YubiKey, skontrolujte, či je pripojený k PC.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
- <translation type="unfinished"/>
+ <translation>Nie je vložený žiaden YubiKey.</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>Obnoviť hardvérové tokeny</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>Výber slotu hardvérového kľúča</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_sv.ts b/share/translations/keepassx_sv.ts
index 3dcdf1c6e..ace3cf00f 100644
--- a/share/translations/keepassx_sv.ts
+++ b/share/translations/keepassx_sv.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
- <translation>Anmäl fel på: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
+ <translation>Rapportera fel på: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
@@ -50,7 +50,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>Aktivera SSH-agenten (kräver omstart)</translation>
+ <translation>Aktivera SSH-tjänsten (kräver omstart)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@@ -61,7 +61,7 @@
<name>ApplicationSettingsWidget</name>
<message>
<source>Application Settings</source>
- <translation>Applikationsinställningar</translation>
+ <translation>Programinställningar</translation>
</message>
<message>
<source>General</source>
@@ -93,7 +93,15 @@
</message>
<message>
<source>Follow style</source>
- <translation>Följ stil</translation>
+ <translation>Följstil</translation>
+ </message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>Återställa inställningarna?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>Är du säker på att du vill återställa alla allmäna inställningar och säkerhetsinställningar till standardvärden?</translation>
</message>
</context>
<context>
@@ -108,23 +116,11 @@
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
- <translation>Tillåt endast en samtidig instans av KeePassXC</translation>
- </message>
- <message>
- <source>Remember last databases</source>
- <translation>Komihåg senaste databasen</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Kom ihåg senaste nyckel-fil och säkerhets-enhet</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Ladda tidigare databaser vid uppstart</translation>
+ <translation>Tillåt endast en instans av KeePassXC</translation>
</message>
<message>
<source>Minimize window at application startup</source>
- <translation>Minimera fönstret vid start av programmet</translation>
+ <translation>Minimera fönstret vid programstart</translation>
</message>
<message>
<source>File Management</source>
@@ -132,11 +128,11 @@
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
- <translation>Spara databasfiler säkert (kan vara inkompatibelt med Dropbox, etc)</translation>
+ <translation>Spara databasfiler säkert (kan vara inkompatibelt med Dropbox etc)</translation>
</message>
<message>
<source>Backup database file before saving</source>
- <translation>Gör databasbackup innan sparning</translation>
+ <translation>Säkerhetskopiera databasfilen innan den sparas</translation>
</message>
<message>
<source>Automatically save after every change</source>
@@ -144,15 +140,15 @@
</message>
<message>
<source>Automatically save on exit</source>
- <translation>Spara automatiskt när applikationen anslutas</translation>
+ <translation>Spara automatiskt när programmet avslutas</translation>
</message>
<message>
<source>Don&apos;t mark database as modified for non-data changes (e.g., expanding groups)</source>
- <translation>Markera inte databasen som ändrad vi icke-data förändringar (t.ex. öppna grupper)</translation>
+ <translation>Markera inte databasen som ändrad vid icke-dataförändringar (t.ex. expandera grupper)</translation>
</message>
<message>
<source>Automatically reload the database when modified externally</source>
- <translation>Ladda om databasen automatiskt när den ändras externt</translation>
+ <translation>Läs om databasen automatiskt när den ändrats externt</translation>
</message>
<message>
<source>Entry Management</source>
@@ -160,15 +156,11 @@
</message>
<message>
<source>Use group icon on entry creation</source>
- <translation>Använd gruppens ikon för nya poster</translation>
- </message>
- <message>
- <source>Minimize when copying to clipboard</source>
- <translation>Minimera vid kopiering</translation>
+ <translation>Använd gruppikon för nya poster</translation>
</message>
<message>
<source>Hide the entry preview panel</source>
- <translation>Göm post förhandsvisningspanelen</translation>
+ <translation>Dölj förhandsvisningspanelen för poster</translation>
</message>
<message>
<source>General</source>
@@ -176,76 +168,153 @@
</message>
<message>
<source>Hide toolbar (icons)</source>
- <translation>Göm verktygsfält (ikonerna)</translation>
+ <translation>Dölj verktygsfältet (ikonerna)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
- <translation>Minimera istället för att avsluta</translation>
+ <translation>Minimera istället för att avsluta programmet</translation>
</message>
<message>
<source>Show a system tray icon</source>
- <translation>Visa statusfält ikon</translation>
+ <translation>Visa en systemfältsikon</translation>
</message>
<message>
<source>Dark system tray icon</source>
- <translation>Mörk ikon för systemfältet</translation>
+ <translation>Mörk systemfältsikon</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
- <translation>Vid minimering, minimera fönstret till systemfältet</translation>
- </message>
- <message>
- <source>Language</source>
- <translation>Språk</translation>
+ <translation>Minimera fönstret till systemfältet, vid minimering</translation>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-skriv</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
- <translation>Använd postens titel för att matcha fönster för global auto-skriv</translation>
+ <translation>Använd postens titel för att matcha fönster vid global autoskriv</translation>
</message>
<message>
<source>Use entry URL to match windows for global Auto-Type</source>
- <translation>Använd postens URL för att matcha fönster för global auto-skriv</translation>
+ <translation>Använd postens URL för att matcha fönster vid global autoskriv</translation>
</message>
<message>
<source>Always ask before performing Auto-Type</source>
- <translation>Fråga alltid innan auto-skriv utförs</translation>
+ <translation>Fråga alltid innan autoskriv utförs</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
- <translation>Globalt auto-skriv kortkommando</translation>
+ <translation>Globalt autoskriv-kortkommando</translation>
</message>
<message>
<source>Auto-Type typing delay</source>
- <translation>Fördröjning för auto-skriv</translation>
+ <translation>Fördröjning för autoskriv</translation>
</message>
<message>
<source> ms</source>
<comment>Milliseconds</comment>
- <translation>ms.</translation>
+ <translation> ms</translation>
</message>
<message>
<source>Auto-Type start delay</source>
- <translation>Auto-skriv start fördröjning</translation>
+ <translation>Autoskriv startfördröjning</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Leta efter uppdateringar vid start</translation>
+ <source>Movable toolbar</source>
+ <translation>Flyttbart verktygsfält</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Inkludera förhandsversioner vid sökning efter uppdateringar</translation>
+ <source>Remember previously used databases</source>
+ <translation>Kom ihåg tidigare använda databaser</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Rörligt verktygsfält</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>Ladda tidigare använda databaser vid start</translation>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation>Kom ihåg databasers nyckelfiler och säkerhetsdonglar </translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Knapp-stil</translation>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> sek</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -261,7 +330,7 @@
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>sek</translation>
+ <translation> sek</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -293,15 +362,15 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>Lås tidigare låst databas efter att ha utfört Auto-skriv</translation>
+ <translation>Lås tidigare låst databas efter att ha utfört autoskriv</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>Behöver inte upprepa lösenord när det är synligt</translation>
+ <translation>Behöver inte upprepa lösenordet när det är synligt</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
- <translation>Dölj inte lösenord vid editering</translation>
+ <translation>Dölj inte lösenord vid redigering</translation>
</message>
<message>
<source>Don&apos;t use placeholder for empty password fields</source>
@@ -309,7 +378,7 @@
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
- <translation>Göm lösenord i förhandsgranskningsrutan</translation>
+ <translation>Dölj lösenord i förhandsgranskningsrutan</translation>
</message>
<message>
<source>Hide entry notes by default</source>
@@ -320,15 +389,36 @@
<translation>Integritet</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Använd DuckDuckGo som alternativ vid nedladdning av webbplatsikoner</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> min</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>AutoType</name>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
- <translation>Kunde inte hitta en post som matchar fönstertiteln:</translation>
+ <translation>Kunde inte hitta någon post som matchar fönstertiteln:</translation>
</message>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Kopiera användar&amp;namn</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Kopiera &amp;lösenord</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Välj post att autoskriva:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Sök...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -422,7 +527,15 @@
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
<translation>%1 har begärt åtkomst till lösenorden för följande objekt.
-Vill du tillåta det?</translation>
+Välj om du vill tillåta åtkomst.</translation>
+ </message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -433,7 +546,7 @@ Vill du tillåta det?</translation>
</message>
<message>
<source>Ok</source>
- <translation>Ok</translation>
+ <translation>OK</translation>
</message>
<message>
<source>Cancel</source>
@@ -443,22 +556,18 @@ Vill du tillåta det?</translation>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
<translation>Du ha flera databaser öppna.
-Välj databas för att spara uppgifter.</translation>
+Välj rätt databas för att spara inloggningsuppgifterna.</translation>
</message>
</context>
<context>
<name>BrowserOptionDialog</name>
<message>
<source>Dialog</source>
- <translation>Dialogruta</translation>
+ <translation>Dialog</translation>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>Det här krävs för KeePassXC-Browser ska kunna komma åt dina databaser</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Aktivera KeepassXC:s webbläsarintegration</translation>
+ <translation>Detta krävs för att KeePassXC-Browser ska kunna komma åt dina databaser</translation>
</message>
<message>
<source>General</source>
@@ -466,7 +575,7 @@ Välj databas för att spara uppgifter.</translation>
</message>
<message>
<source>Enable integration for these browsers:</source>
- <translation>Aktivera integration i dessa webbläsare:</translation>
+ <translation>Aktivera integrering i dessa webbläsare:</translation>
</message>
<message>
<source>&amp;Google Chrome</source>
@@ -507,17 +616,17 @@ Välj databas för att spara uppgifter.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
- <translation>&amp;Returnera bara de lämpligaste</translation>
+ <translation>&amp;Returnera bara de bäst lämpade inloggningsuppgifterna</translation>
</message>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Sortera &amp;matchande autentiseringsuppgifter per titel</translation>
+ <translation>Sortera &amp;matchande autentiseringsuppgifter efter titel</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Sortera matchande autentiseringsuppgifter per &amp;användarnamn</translation>
+ <translation>Sortera matchande autentiseringsuppgifter efter &amp;användarnamn</translation>
</message>
<message>
<source>Advanced</source>
@@ -526,16 +635,12 @@ Välj databas för att spara uppgifter.</translation>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>&amp;Fråga aldrig innan åtkomst till autentisieringsuppgifter</translation>
+ <translation>&amp;Fråga aldrig före åtkomst till autentisieringsuppgifter</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>Fråga aldrig innan &amp;uppdatering av autetiseringsuppgifter</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Endast den valda databasen måste vara ansluten med en klient.</translation>
+ <translation>Fråga aldrig före &amp;uppdatering av autetiseringsuppgifter</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
@@ -544,27 +649,27 @@ Välj databas för att spara uppgifter.</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
- <translation>Automatiskt skapande eller uppdaterande av strängfält stöds inte.</translation>
+ <translation>Automatiskt skapande eller uppdaterande av textfält stöds inte.</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>Returnera avancerade text-fält som börjar med &quot;KPH: &quot;</translation>
+ <translation>Returnera avancerade textfält som börjar med &quot;KPH: &quot;</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation type="unfinished"/>
+ <translation>Uppdaterar KeePassXC eller keepassxc-proxyns binärsökväg automatiskt, till ursprungliga meddelandeskript vid uppstart.</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation type="unfinished"/>
+ <translation>Uppdatera &amp;ursprungliga meddelandemanifestfiler vid uppstart</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
- <translation type="unfinished"/>
+ <translation>Stödjer ett proxyprogram mellan KeePassXC och webbläsartillägget.</translation>
</message>
<message>
<source>Use a &amp;proxy application between KeePassXC and browser extension</source>
- <translation type="unfinished"/>
+ <translation>Använd ett &amp;proxyprogram mellan KeePassXC och webbläsartillägget</translation>
</message>
<message>
<source>Use a custom proxy location if you installed a proxy manually.</source>
@@ -578,27 +683,23 @@ Välj databas för att spara uppgifter.</translation>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Utforska...</translation>
+ <translation>Bläddra...</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
- <translation>&lt;b&gt;Varning:&lt;/b&gt; Följande parametrar kan vara farliga!</translation>
+ <translation>&lt;b&gt;Varning:&lt;/b&gt; Följande alternativ kan vara farliga!</translation>
</message>
<message>
<source>Select custom proxy location</source>
- <translation>Välj en proxy</translation>
+ <translation>Välj en anpassad proxy</translation>
</message>
<message>
<source>&amp;Tor Browser</source>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Executable Files</source>
- <translation>Exekverbara filer</translation>
+ <translation>Körbara filer</translation>
</message>
<message>
<source>All Files</source>
@@ -607,18 +708,62 @@ Välj databas för att spara uppgifter.</translation>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation type="unfinished"/>
+ <translation>Be inte om tillstånd för HTTP &amp;grundläggande autentisering</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation type="unfinished"/>
+ <translation>På grund av Snaps sandlådeteknik, måste du köra ett skript för att aktivera webbläsarintegration.&lt;br /&gt;Du kan hämta skriptet från %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation type="unfinished"/>
+ <translation>Se specialinstruktioner för webbläsarintegreringens användning nedan</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
+ <translation>KeePassXC-Browser behövs för att webbläsarintegration skall fungera.&lt;br /&gt;Ladda ner det för %1 och %2. %3</translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -626,14 +771,17 @@ Välj databas för att spara uppgifter.</translation>
<name>BrowserService</name>
<message>
<source>KeePassXC: New key association request</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Ny nyckelassocieringsbegäran</translation>
</message>
<message>
<source>You have received an association request for the above key.
If you would like to allow it access to your KeePassXC database,
give it a unique name to identify and accept it.</source>
- <translation type="unfinished"/>
+ <translation>Du har fått en associationsbegäran för ovanstående nyckel.
+
+Ge den ett unikt namn för identifikation och acceptera, om du
+vill tillåta åtkomst till din KeePassXC-databas.</translation>
</message>
<message>
<source>Save and allow access</source>
@@ -641,12 +789,13 @@ give it a unique name to identify and accept it.</source>
</message>
<message>
<source>KeePassXC: Overwrite existing key?</source>
- <translation>KeePassXC: Skriv över befintlig nyckel?</translation>
+ <translation>KeePassXC: Vill du skriva över befintlig nyckel?</translation>
</message>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
- <translation type="unfinished"/>
+ <translation>En delad krypteringsnyckel med namnet &quot;%1&quot; finns redan.
+Vill du skriva över den?</translation>
</message>
<message>
<source>KeePassXC: Update Entry</source>
@@ -662,59 +811,68 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation type="unfinished"/>
+ <translation>Konverterar attribut till anpassad data...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation>KeePassXC: Konverterade KeePassHTTP attribut</translation>
+ <translation>KeePassXC: Konverterade KeePassHTTP-attribut</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>Konverterade attribut från %1 post(er).
+Flyttade %2 nycklar till anpassad data.</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Flyttade %n nyckel till anpassad data.</numerusform><numerusform>Flyttade %n nycklar till anpassad data.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Hittade ingen post med KeePassHTTP-attribut!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation type="unfinished"/>
+ <translation>Den aktiva databasen innehåller inte någon post med KeePassHTTP-attribut.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Inställningar för webbläsarintegrering har identifierats</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC: Skapa en ny grupp</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation type="unfinished"/>
+ <translation>En begäran om att skapa en ny grupp &quot;%1&quot; har tagits emot.
+Vill du skapa denna grupp?
+</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation type="unfinished"/>
+ <translation>Dina inställningar för KeePassXC-Browser behöver flyttas in i databasinställningarna.
+Detta är nödvändigt för att behålla dina aktuella webbläsaranslutningar.
+Vill du migrera dina befintliga inställningar nu?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Visa inte denna varning igen</translation>
</message>
</context>
<context>
<name>CloneDialog</name>
<message>
<source>Clone Options</source>
- <translation>Klonings alternativ</translation>
+ <translation>Kloningsalternativ</translation>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>Lägg till &apos; - Klon&apos; i titel</translation>
+ <translation>Lägg till &quot; - Klon&quot; i titeln</translation>
</message>
<message>
<source>Replace username and password with references</source>
@@ -729,7 +887,7 @@ Would you like to migrate your existing settings now?</source>
<name>CsvImportWidget</name>
<message>
<source>Import CSV fields</source>
- <translation>Importera CSV fält</translation>
+ <translation>Importera CSV-fält</translation>
</message>
<message>
<source>filename</source>
@@ -745,7 +903,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Codec</source>
- <translation>Codec</translation>
+ <translation>Kodek</translation>
</message>
<message>
<source>Text is qualified by</source>
@@ -764,12 +922,8 @@ Would you like to migrate your existing settings now?</source>
<translation>Första data har fältnamn</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Antal rubrikrader att kasta bort</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
- <translation type="unfinished"/>
+ <translation>Betrakta &quot;\&quot; som ett kommentarstecken</translation>
</message>
<message>
<source>Preview</source>
@@ -777,19 +931,19 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Column layout</source>
- <translation>Kolumn layout</translation>
+ <translation>Kolumnlayout</translation>
</message>
<message>
<source>Not present in CSV file</source>
- <translation>Finns inte i CSV filen</translation>
+ <translation>Finns inte i CSV-filen</translation>
</message>
<message>
<source>Imported from CSV file</source>
- <translation>Importerat från CSV fil</translation>
+ <translation>Importerat från CSV-fil</translation>
</message>
<message>
<source>Original data: </source>
- <translation>Ursprungsdata:</translation>
+ <translation>Ursprunglig data: </translation>
</message>
<message>
<source>Error</source>
@@ -809,20 +963,36 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n fler meddelande(n) hoppades över]</numerusform><numerusform>[%n fler meddelande(n) hoppades över]</numerusform></translation>
+ <translation><numerusform>[%n meddelande hoppades över]</numerusform><numerusform>[%n meddelanden hoppades över]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
- <translation>CSV importering: skrivare har fel:
+ <translation>CSV-import: Skrivare har fel:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n kolumn(er)</numerusform><numerusform>%n kolumn(er)</numerusform></translation>
+ <translation><numerusform>%n kolumn</numerusform><numerusform>%n kolumner</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -831,11 +1001,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n byte(s)</numerusform><numerusform>%n byte(s)</numerusform></translation>
+ <translation><numerusform>%n byte</numerusform><numerusform>%n byte</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n rad(er)</numerusform><numerusform>%n rad(er)</numerusform></translation>
+ <translation><numerusform>%n rad</numerusform><numerusform>%n rader</numerusform></translation>
</message>
</context>
<context>
@@ -847,28 +1017,45 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>File %1 does not exist.</source>
- <translation>Fil %1 finns inte.</translation>
+ <translation>Filen %1 finns inte.</translation>
</message>
<message>
<source>Unable to open file %1.</source>
- <translation>Kunde inte öppna fil %1.</translation>
+ <translation>Kunde inte öppna filen %1.</translation>
</message>
<message>
<source>Error while reading the database: %1</source>
<translation>Fel vid inläsning av databas: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Kunde inte spara, databasen har inget filnamn.</translation>
+ <source>File cannot be written as it is opened in read-only mode.</source>
+ <translation>Filen kan inte skrivas eftersom den är öppnad i skrivskyddat läge.</translation>
+ </message>
+ <message>
+ <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <translation>Nyckeln har inte transformerats. Detta är ett programfel, rapportera det till utvecklarna!</translation>
</message>
<message>
- <source>File cannot be written as it is opened in read-only mode.</source>
+ <source>%1
+Backup database located at %2</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Key not transformed. This is a bug, please report it to the developers!</source>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Papperskorg</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -880,39 +1067,26 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Ange huvud lösenord</translation>
- </message>
- <message>
<source>Key File:</source>
- <translation>Nyckel-fil:</translation>
- </message>
- <message>
- <source>Password:</source>
- <translation>Lösenord:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Bläddra</translation>
+ <translation>Nyckelfil:</translation>
</message>
<message>
<source>Refresh</source>
<translation>Uppdatera</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Utmanings respons</translation>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation type="unfinished"/>
+ <translation>Äldre nyckelfilsformat</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Du använder ett äldre nyckelfilsformat, som stödet kan
+komma att tas bort för i framtiden.
+
+Överväg att generera en ny nyckelfil.</translation>
</message>
<message>
<source>Don&apos;t show this warning again</source>
@@ -924,27 +1098,103 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Key files</source>
- <translation>Nyckel-filer</translation>
+ <translation>Nyckelfiler</translation>
</message>
<message>
<source>Select key file</source>
- <translation>Välj nyckel-fil</translation>
+ <translation>Välj nyckelfil</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID för snabbupplåsning</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Kunde inte öppna databasen:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Kunde inte öppna nyckelfilen:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Bläddra...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Rensa</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -970,7 +1220,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Master Key</source>
- <translation>Huvud-lösenord</translation>
+ <translation>Huvudlösenord</translation>
</message>
<message>
<source>Encryption Settings</source>
@@ -978,30 +1228,30 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Browser Integration</source>
- <translation>Webbläsarintegration</translation>
+ <translation>Webbläsarintegrering</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidgetBrowser</name>
<message>
<source>KeePassXC-Browser settings</source>
- <translation>KeePassXC-Browser inställningar</translation>
+ <translation>KeePassXC-Browser-inställningar</translation>
</message>
<message>
<source>&amp;Disconnect all browsers</source>
- <translation>&amp;Koppla från alla browsers</translation>
+ <translation>&amp;Koppla bort alla webbläsare</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Gl&amp;öm alla sidspecifika inställningar i befintliga poster</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation type="unfinished"/>
+ <translation>Flytta KeePassHTTP-attribut till KeePassXC-Browser &amp;anpassad data</translation>
</message>
<message>
<source>Stored keys</source>
- <translation>Sparade nycklar</translation>
+ <translation>Lagrade nycklar</translation>
</message>
<message>
<source>Remove</source>
@@ -1009,12 +1259,13 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Delete the selected key?</source>
- <translation>Radera den valda nyckeln?</translation>
+ <translation>Vill du ta bort den valda nyckeln?</translation>
</message>
<message>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen ta bort den valda nyckeln?
+Detta kan förhindra anslutning till webbläsartillägget.</translation>
</message>
<message>
<source>Key</source>
@@ -1026,45 +1277,47 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>Enable Browser Integration to access these settings.</source>
- <translation type="unfinished"/>
+ <translation>Aktivera webbläsarintegrering för åtkomst till dessa inställningar.</translation>
</message>
<message>
<source>Disconnect all browsers</source>
- <translation>Koppla från alla webbläsare</translation>
+ <translation>Koppla bort alla webbläsare</translation>
</message>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen koppla bort alla webbläsare?
+Detta kan förhindra anslutning till webbläsartillägget.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
- <translation>KeePassXC: Hittade inga nycklar</translation>
+ <translation>KeePassXC: Inga nycklar hittades</translation>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>Inga delade krypteringsnycklar hittades i KeePassXC:s inställningar.</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
- <translation>KeePassXC: Nycklar borttagna från databasen</translation>
+ <translation>KeePassXC: Tog bort nycklar från databasen</translation>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Tog bort %n krypteringsnyckel från KeePassXC:s inställningar.</numerusform><numerusform>Tog bort %n krypteringsnycklar från KeePassXC:s inställningar.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>Glöm alla sidspecifika inställningar i befintliga poster</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen glömma alla sidspecifika inställningar i varje post?
+Behörighet att komma åt posterna kommer att återkallas.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
- <translation>Raderar sparade rättigheter...</translation>
+ <translation>Tar bort lagrade rättigheter...</translation>
</message>
<message>
<source>Abort</source>
@@ -1076,7 +1329,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Tog bort behörighet från %n post.</numerusform><numerusform>Tog bort behörigheter från %n poster.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1084,15 +1337,24 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
- <translation>Den aktiva databasen innehåller inte en post med behörigheter.</translation>
+ <translation>Den aktiva databasen innehåller ingen post med behörigheter.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation type="unfinished"/>
+ <translation>Flytta KeePassHTTP-attribut till anpassad data</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
+ <translation>Vill du verkligen flytta all äldre webbläsarintegrationsdata till den senaste standarden?
+Detta är nödvändigt för att få kompatibilitet med webbläsartillägget.</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1104,7 +1366,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>AES: 256 Bit (default)</source>
- <translation>AES: 256 Bit (standard)</translation>
+ <translation>AES: 256 Bit (standard)</translation>
</message>
<message>
<source>Twofish: 256 Bit</source>
@@ -1112,15 +1374,15 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Key Derivation Function:</source>
- <translation type="unfinished"/>
+ <translation>Nyckelhärledningsfunktion:</translation>
</message>
<message>
<source>Transform rounds:</source>
- <translation>Transformerings varv:</translation>
+ <translation>Transformeringsrundor:</translation>
</message>
<message>
<source>Benchmark 1-second delay</source>
- <translation type="unfinished"/>
+ <translation>Beräkna 1 sekunds fördröjning</translation>
</message>
<message>
<source>Memory Usage:</source>
@@ -1128,11 +1390,11 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Parallelism:</source>
- <translation>Parallelism:</translation>
+ <translation>Parallellitet:</translation>
</message>
<message>
<source>Decryption Time:</source>
- <translation>Dektypterings-tid:</translation>
+ <translation>Dekrypteringstid:</translation>
</message>
<message>
<source>?? s</source>
@@ -1152,7 +1414,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>Högre värde medger bättre skydd, men databasen tar längre tid att öppna.</translation>
</message>
<message>
<source>Database format:</source>
@@ -1160,11 +1422,11 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>This is only important if you need to use your database with other programs.</source>
- <translation type="unfinished"/>
+ <translation>Detta är bara viktigt om du behöver använda din databas med andra program.</translation>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
- <translation>KDBX 4.0 (rekommenderad)</translation>
+ <translation>KDBX 4.0 (rekommenderas)</translation>
</message>
<message>
<source>KDBX 3.1</source>
@@ -1178,17 +1440,19 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<message>
<source>Number of rounds too high</source>
<comment>Key transformation rounds</comment>
- <translation>För högt antal omgångar</translation>
+ <translation>För högt antal rundor</translation>
</message>
<message>
<source>You are using a very high number of key transform rounds with Argon2.
If you keep this number, your database may take hours or days (or even longer) to open!</source>
- <translation type="unfinished"/>
+ <translation>Du använder ett mycket högt antal nyckeltransformeringsrundor med Argon2.
+
+Om du behåller detta antal, kan din databas ta timmar eller dagar (eller t.om. längre) att öppna!</translation>
</message>
<message>
<source>Understood, keep number</source>
- <translation>Uppfattat, behåll nummer</translation>
+ <translation>Uppfattat, behåll antalet</translation>
</message>
<message>
<source>Cancel</source>
@@ -1197,13 +1461,15 @@ If you keep this number, your database may take hours or days (or even longer) t
<message>
<source>Number of rounds too low</source>
<comment>Key transformation rounds</comment>
- <translation>För lågt antal omgångar</translation>
+ <translation>För lågt antal rundor</translation>
</message>
<message>
<source>You are using a very low number of key transform rounds with AES-KDF.
If you keep this number, your database may be too easy to crack!</source>
- <translation type="unfinished"/>
+ <translation>Du använder ett mycket lågt antal nyckeltransformeringsrundor med AES-KDF.
+
+Om du behåller detta antal, kan din databas bli för lätt att hacka!</translation>
</message>
<message>
<source>KDF unchanged</source>
@@ -1211,7 +1477,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte transformera nyckeln med nya KDF-parametrar. KDF oförändrad.</translation>
</message>
<message numerus="yes">
<source> MiB</source>
@@ -1221,7 +1487,7 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>tråd(ar)</numerusform><numerusform>tråd(ar)</numerusform></translation>
+ <translation><numerusform> tråd</numerusform><numerusform> trådar</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1233,12 +1499,63 @@ If you keep this number, your database may be too easy to crack!</source>
<comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
<message>
<source>Database Meta Data</source>
- <translation>Databas metadata</translation>
+ <translation>Databasmetadata</translation>
</message>
<message>
<source>Database name:</source>
@@ -1250,27 +1567,27 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Default username:</source>
- <translation>Standard användarnamn:</translation>
+ <translation>Standardanvändarnamn:</translation>
</message>
<message>
<source>History Settings</source>
- <translation>Inställningar historik</translation>
+ <translation>Historikinställningar</translation>
</message>
<message>
<source>Max. history items:</source>
- <translation>Maxantal historikposter:</translation>
+ <translation>Max antal historikposter:</translation>
</message>
<message>
<source>Max. history size:</source>
- <translation>Maximal historik storlek:</translation>
+ <translation>Maximal historikstorlek:</translation>
</message>
<message>
<source> MiB</source>
- <translation>MiB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
- <translation>Använd soptunnan</translation>
+ <translation>Använd papperskorgen</translation>
</message>
<message>
<source>Additional Database Settings</source>
@@ -1280,6 +1597,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>Aktivera &amp;komprimering (rekommenderas)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1301,7 +1651,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Last Signer</source>
- <translation type="unfinished"/>
+ <translation>Senaste undertecknare</translation>
</message>
<message>
<source>Certificates</source>
@@ -1317,7 +1667,7 @@ If you keep this number, your database may be too easy to crack!</source>
<name>DatabaseSettingsWidgetMasterKey</name>
<message>
<source>Add additional protection...</source>
- <translation type="unfinished"/>
+ <translation>Lägg till ytterligare skydd...</translation>
</message>
<message>
<source>No encryption key added</source>
@@ -1325,17 +1675,19 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation type="unfinished"/>
+ <translation>Du måste lägga till minst en krypteringsnyckel, för att säkra din databas!</translation>
</message>
<message>
<source>No password set</source>
- <translation>Inget lösenord satt</translation>
+ <translation>Inget lösenord angivet</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
Are you sure you want to continue without a password?</source>
- <translation type="unfinished"/>
+ <translation>VARNING! Du har inte angivit något lösenord. Du avråds bestämt att använda en databas utan lösenord!
+
+Vill du verkligen fortsätta utan lösenord?</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1343,6 +1695,10 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Failed to change master key</source>
+ <translation>Kunde inte ändra huvudlösenordet</translation>
+ </message>
+ <message>
+ <source>Continue without password</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1356,12 +1712,135 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Beskrivning:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Värde</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
<message>
<source>KeePass 2 Database</source>
- <translation>KeePass 2 databas</translation>
+ <translation>KeePass 2-databas</translation>
</message>
<message>
<source>All files</source>
@@ -1381,11 +1860,11 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Open KeePass 1 database</source>
- <translation>Öppna KeePass 1 databas</translation>
+ <translation>Öppna KeePass 1-databas</translation>
</message>
<message>
<source>KeePass 1 database</source>
- <translation>KeePass 1 databas</translation>
+ <translation>KeePass 1-databas</translation>
</message>
<message>
<source>Export database to CSV file</source>
@@ -1393,20 +1872,17 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Writing the CSV file failed.</source>
- <translation>Kunde inte skriva till CSV-filen</translation>
+ <translation>Kunde inte skriva CSV-filen.</translation>
</message>
<message>
<source>Database creation error</source>
- <translation type="unfinished"/>
+ <translation>Fel vid databasskapande</translation>
</message>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
+ <translation>Den skapade databasen har ingen nyckel eller KDF, vägrar att spara den.
+Detta är definitivt ett programfel, rapportera det till utvecklarna.</translation>
</message>
<message>
<source>Select CSV file</source>
@@ -1429,6 +1905,30 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>%1 [Read-only]</source>
<comment>Database tab name modifier</comment>
+ <translation>%1 [Skrivskyddad]</translation>
+ </message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1444,23 +1944,23 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
- <translation>Vill du verkligen flytta %n poster till papperskorgen?</translation>
+ <translation>Vill du verkligen flytta &quot;%1&quot; till papperskorgen?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Vill du verkligen flytta %n post till papperskorgen?</numerusform><numerusform>Vill du verkligen flytta %n poster till papperskorgen?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
- <translation>Utför kommando?</translation>
+ <translation>Vill du köra kommandot?</translation>
</message>
<message>
<source>Do you really want to execute the following command?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen köra följande kommando?&lt;br&gt;&lt;br&gt;%1&lt;br&gt;</translation>
</message>
<message>
<source>Remember my choice</source>
- <translation type="unfinished"/>
+ <translation>Komihåg mitt val</translation>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
@@ -1468,11 +1968,11 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>No current database.</source>
- <translation>Ingen nuvarande databas.</translation>
+ <translation>Ingen aktuell databas.</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
- <translation>Ingen ursprungs databas, inget att göra.</translation>
+ <translation>Ingen källdatabas, inget att göra.</translation>
</message>
<message>
<source>Search Results (%1)</source>
@@ -1488,7 +1988,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>The database file has changed. Do you want to load the changes?</source>
- <translation>Databasfilen har ändrats. Vill du ladda in ändringarna?</translation>
+ <translation>Databasfilen har ändrats. Vill du läsa in ändringarna?</translation>
</message>
<message>
<source>Merge Request</source>
@@ -1497,73 +1997,68 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>The database file has changed and you have unsaved changes.
Do you want to merge your changes?</source>
- <translation type="unfinished"/>
+ <translation>Databasfilen har ändrats och du har osparade ändringar.
+Vill du slå samman dina ändringar?</translation>
</message>
<message>
<source>Empty recycle bin?</source>
- <translation>Töm papperskorgen?</translation>
+ <translation>Vill du tömma papperskorgen?</translation>
</message>
<message>
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen ta bort allt från din papperskorg permanent?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Vill du verkligen ta bort %n post för gott?</numerusform><numerusform>Vill du verkligen ta bort %n poster för gott?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>Ta bort post?</numerusform><numerusform>Ta bort poster?</numerusform></translation>
+ <translation><numerusform>Vill du ta bort posten?</numerusform><numerusform>Vill du ta bort posterna?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Fil öppnad i läs-enbart läge.</translation>
+ <translation><numerusform>Vill du flytta posten till papperskorgen?</numerusform><numerusform>Vill du flytta posterna till papperskorgen?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
- <translation>Lås databas?</translation>
+ <translation>Vill du låsa databasen?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>Du redigerar en post. Vill du förkasta ändringarna och låsa ändå?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation>&quot;%1&quot; har ändrats.
-Spara ändringarna?</translation>
+Vill du spara ändringarna?</translation>
</message>
<message>
<source>Database was modified.
Save changes?</source>
- <translation type="unfinished"/>
+ <translation>Databasen har ändrats.
+Vill du spara ändringarna?</translation>
</message>
<message>
<source>Save changes?</source>
- <translation>Spara ändringar?</translation>
+ <translation>Vill du spara ändringarna?</translation>
</message>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte öppna den nya databasen vid försök att läsa in automatisk.
+Fel: %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
- <translation>Inaktivera spara säkert?</translation>
+ <translation>Vill du inaktivera &quot;Spara säkert&quot;?</translation>
</message>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC har misslyckats med att spara databasen flera gånger. Det beror troligen på att filsynkroniseringstjänsten har låst filsparandet.
+Vill du inaktivera &quot;Spara säkert&quot; och försöka igen?</translation>
</message>
<message>
<source>Passwords</source>
@@ -1571,44 +2066,52 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Save database as</source>
- <translation>Spara databas som</translation>
+ <translation>Spara databasen som</translation>
</message>
<message>
<source>KeePass 2 Database</source>
- <translation>KeePass 2 databas</translation>
+ <translation>KeePass 2-databas</translation>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>Vill du ersätta referenserna till posten?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Posten &quot;%1&quot; har %2 referens. Vill du skriva över referensen med värden, hoppa över den här posten eller ta bort ändå?</numerusform><numerusform>Posten &quot;%1&quot; har %2 referenser. Vill du skriva över referenserna med värden, hoppa över den här posten eller ta bort ändå?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
- <translation>Ta bort grupp</translation>
+ <translation>Ta bort gruppen</translation>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Vill du flytta gruppen till papperskorgen?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen flytta &quot;%1&quot; till papperskorgen?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation type="unfinished"/>
+ <translation>Slog samman databasfilerna.</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation type="unfinished"/>
+ <translation>Databasen ändrades inte av sammanslagningen.</translation>
</message>
<message>
<source>Shared group...</source>
<translation>Delad grupp...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Kunde inte skriva databas: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1626,7 +2129,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-skriv</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>Properties</source>
@@ -1638,7 +2141,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>SSH Agent</source>
- <translation>SSH Agent</translation>
+ <translation>SSH-tjänst</translation>
</message>
<message>
<source>n/a</source>
@@ -1654,11 +2157,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>File too large to be a private key</source>
- <translation type="unfinished"/>
+ <translation>Filen är för stor för att vara en privat nyckel</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>Misslyckades med att öppna privat nyckel</translation>
+ <translation>Kunde inte öppna privat nyckel</translation>
</message>
<message>
<source>Entry history</source>
@@ -1670,11 +2173,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit entry</source>
- <translation>Ändra post</translation>
+ <translation>Redigera post</translation>
</message>
<message>
<source>Different passwords supplied.</source>
- <translation>Olika lösenord angivna</translation>
+ <translation>Olika lösenord angivna.</translation>
</message>
<message>
<source>New attribute</source>
@@ -1682,7 +2185,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>Är du säker på att du vill ta bort detta attribut?</translation>
+ <translation>Vill du verkligen ta bort detta attribut?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1694,23 +2197,23 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n månad(er)</numerusform><numerusform>%n månad(er)</numerusform></translation>
+ <translation><numerusform>%n månad</numerusform><numerusform>%n månader</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
- <translation>Använd genererat lösenord?</translation>
+ <translation>Vill du använda det genererade lösenordet?</translation>
</message>
<message>
<source>Do you want to apply the generated password to this entry?</source>
- <translation type="unfinished"/>
+ <translation>Vill du använda det genererade lösenordet till den här posten?</translation>
</message>
<message>
<source>Entry updated successfully.</source>
- <translation type="unfinished"/>
+ <translation>Posten uppdaterad.</translation>
</message>
<message>
<source>Entry has unsaved changes</source>
- <translation type="unfinished"/>
+ <translation>Posten har osparade ändringar</translation>
</message>
<message>
<source>New attribute %1</source>
@@ -1718,7 +2221,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>[PROTECTED] Press reveal to view or edit</source>
- <translation type="unfinished"/>
+ <translation>[SKYDDAT] Tryck på &quot;Visa&quot; för att visa eller redigera</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -1728,6 +2231,18 @@ Disable safe saves and try again?</source>
<source>Confirm Removal</source>
<translation>Bekräfta borttagning</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Webbläsarintegrering</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1767,20 +2282,56 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>Bakgrundsfärg:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
- <translation>Slå på auto-skriv för denna post</translation>
+ <translation>Aktivera autoskriv för denna post</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation type="unfinished"/>
+ <translation>Ärv standard autoskrivsekvens från &amp;gruppen</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
- <translation type="unfinished"/>
+ <translation>&amp;Använd anpassad autoskrivsekvens:</translation>
</message>
<message>
<source>Window Associations</source>
@@ -1796,14 +2347,85 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Window title:</source>
- <translation>Fönster titel:</translation>
+ <translation>Fönstertitel:</translation>
</message>
<message>
<source>Use a specific sequence for this association:</source>
+ <translation>Använd en specifik sekvens för denna association:</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
<translation type="unfinished"/>
</message>
</context>
<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allmänt</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Lägg till</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Ta bort</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Ändra</translation>
+ </message>
+</context>
+<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
@@ -1821,6 +2443,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>Ta bort alla</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1834,7 +2476,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Repeat:</source>
- <translation>Repetera:</translation>
+ <translation>Upprepa:</translation>
</message>
<message>
<source>Title:</source>
@@ -1850,7 +2492,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation type="unfinished"/>
+ <translation>Klicka i kryssrutan för att visa anteckningssektionen.</translation>
</message>
<message>
<source>Username:</source>
@@ -1858,7 +2500,63 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Expires</source>
- <translation>Går ut</translation>
+ <translation>Förfaller</translation>
+ </message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1869,11 +2567,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Remove key from agent after</source>
- <translation type="unfinished"/>
+ <translation>Ta bort nyckeln från agenten efter</translation>
</message>
<message>
<source> seconds</source>
- <translation>sekunder</translation>
+ <translation> sekunder</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -1881,15 +2579,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
- <translation type="unfinished"/>
+ <translation>Ta bort nyckeln från agenten när databasen är stängd/låst</translation>
</message>
<message>
<source>Public key</source>
- <translation>Publik nyckel</translation>
+ <translation>Offentlig nyckel</translation>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation type="unfinished"/>
+ <translation>Lägg till nyckeln till agenten när databasen är öppen/upplåst</translation>
</message>
<message>
<source>Comment</source>
@@ -1901,7 +2599,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>n/a</source>
- <translation>n/a</translation>
+ <translation>Ej tillämplig</translation>
</message>
<message>
<source>Copy to clipboard</source>
@@ -1909,7 +2607,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Private key</source>
- <translation>Private key</translation>
+ <translation>Privat nyckel</translation>
</message>
<message>
<source>External file</source>
@@ -1918,7 +2616,7 @@ Disable safe saves and try again?</source>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>Utforska...</translation>
+ <translation>Bläddra...</translation>
</message>
<message>
<source>Attachment</source>
@@ -1926,14 +2624,30 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Add to agent</source>
- <translation type="unfinished"/>
+ <translation>Lägg till i agenten</translation>
</message>
<message>
<source>Remove from agent</source>
- <translation type="unfinished"/>
+ <translation>Ta bort från agenten</translation>
</message>
<message>
<source>Require user confirmation when this key is used</source>
+ <translation>Kräv användarbekräftelse när denna nyckel används</translation>
+ </message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1957,19 +2671,23 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Edit group</source>
- <translation>Ändra grupp</translation>
+ <translation>Redigera grupp</translation>
</message>
<message>
<source>Enable</source>
- <translation>Slå på</translation>
+ <translation>Aktivera</translation>
</message>
<message>
<source>Disable</source>
- <translation>Stäng av</translation>
+ <translation>Avaktivera</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
- <translation>Ärv från förälder grupp (%1)</translation>
+ <translation>Ärv från överordnad grupp (%1)</translation>
+ </message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Posten har osparade ändringar</translation>
</message>
</context>
<context>
@@ -1999,67 +2717,97 @@ Disable safe saves and try again?</source>
<translation>Inaktiv</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Importera från sökväg</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare osignerad behållare</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Exportera till sökväg</translation>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare signerad behållare</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Synkronisera med sökväg</translation>
+ <source>Select import source</source>
+ <translation>Välj importkälla</translation>
+ </message>
+ <message>
+ <source>Select export target</source>
+ <translation>Välj exportmål</translation>
+ </message>
+ <message>
+ <source>Select import/export file</source>
+ <translation>Välj fil för import/export</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Rensa</translation>
+ </message>
+ <message>
+ <source>Import</source>
+ <translation>Importera</translation>
+ </message>
+ <message>
+ <source>Export</source>
+ <translation>Exportera</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
+ <source>Synchronize</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Databasdelning är inaktiverad</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Databasexport är inaktiverad</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Databasimport är inaktiverad</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>KeeShare unsigned container</source>
+ <source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
<translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Välj källa för import</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Välj mål för export</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Välj fil för import/export</translation>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Rensa</translation>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
+ <source>Toggle password visibility</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
+ <source>Clear fields</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2075,7 +2823,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Expires</source>
- <translation>Går ut</translation>
+ <translation>Förfaller</translation>
</message>
<message>
<source>Search</source>
@@ -2083,14 +2831,42 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Auto-Type</source>
- <translation>Auto-skriv</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Använd standard autoskrivsekvens från överordnad grupp</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
+ <translation>Anv&amp;änd standard autoskrivsekvens</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2098,19 +2874,19 @@ Disable safe saves and try again?</source>
<name>EditWidgetIcons</name>
<message>
<source>&amp;Use default icon</source>
- <translation>Använd standard ikon</translation>
+ <translation>&amp;Använd standardikon</translation>
</message>
<message>
<source>Use custo&amp;m icon</source>
- <translation>Använd egen ikon</translation>
+ <translation>Använd an&amp;passad ikon</translation>
</message>
<message>
<source>Add custom icon</source>
- <translation>Lägg till egen ikon</translation>
+ <translation>Lägg till anpassad ikon</translation>
</message>
<message>
<source>Delete custom icon</source>
- <translation>Ta bort egen ikon</translation>
+ <translation>Ta bort anpassad ikon</translation>
</message>
<message>
<source>Download favicon</source>
@@ -2129,20 +2905,8 @@ Disable safe saves and try again?</source>
<translation>Alla filer</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Confirm Delete</source>
- <translation>Bekräfta radering</translation>
- </message>
- <message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
+ <translation>Bekräfta borttagning</translation>
</message>
<message>
<source>Select Image(s)</source>
@@ -2150,23 +2914,59 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Läste in %1 av %n ikoner</numerusform><numerusform>Läste in %1 av %n ikoner</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation type="unfinished"/>
+ <translation>Inga ikoner lästes in</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n ikon finns redan i databasen</numerusform><numerusform>%n ikoner finns redan i databasen</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Följande ikon misslyckades:</numerusform><numerusform>Följande ikoner misslyckades:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Denna ikon används av %n post och kommer att ersättas av standardikonen. Vill du verkligen ta bort den?</numerusform><numerusform>Denna ikon används av %n poster och kommer att ersättas av standardikonen. Vill du verkligen ta bort den?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2181,7 +2981,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Accessed:</source>
- <translation>Läst:</translation>
+ <translation>Använd:</translation>
</message>
<message>
<source>Uuid:</source>
@@ -2197,12 +2997,13 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Delete plugin data?</source>
- <translation>Radera tilläggsdata?</translation>
+ <translation>Vill du ta bort tilläggsdata?</translation>
</message>
<message>
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen ta bort den valda tilläggsdatan?
+Det kan medföra att de berörda tilläggen inte fungerar.</translation>
</message>
<message>
<source>Key</source>
@@ -2212,6 +3013,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>Värde</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2259,7 +3084,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Vill du verkligen ta bort %n bilaga?</numerusform><numerusform>Vill du verkligen ta bort %n bilagor?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2268,11 +3093,12 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to create directory:
%1</source>
- <translation type="unfinished"/>
+ <translation>Kan inte skapa mappen:
+%1</translation>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation type="unfinished"/>
+ <translation>Vill du verkligen skriva över den befintliga filen &quot;%1&quot; med bilagan?</translation>
</message>
<message>
<source>Confirm overwrite</source>
@@ -2281,19 +3107,19 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unable to save attachments:
%1</source>
- <translation>Kunde inte spara bilagor:
+ <translation>Kan inte spara bilagor:
%1</translation>
</message>
<message>
<source>Unable to open attachment:
%1</source>
- <translation>Kunde inte öppna bilaga:
+ <translation>Kan inte öppna bilaga:
%1</translation>
</message>
<message>
<source>Unable to open attachments:
%1</source>
- <translation>Kunde inte öppna bilagor:
+ <translation>Kan inte öppna bilagor:
%1</translation>
</message>
<message>
@@ -2303,7 +3129,28 @@ This may cause the affected plugins to malfunction.</source>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Kan inte öppna fil:</numerusform><numerusform>Kan inte öppna filer:
+%1</numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>Bilagor</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2317,7 +3164,7 @@ This may cause the affected plugins to malfunction.</source>
<name>EntryHistoryModel</name>
<message>
<source>Last modified</source>
- <translation>Senast ändrad</translation>
+ <translation>Ändrad</translation>
</message>
<message>
<source>Title</source>
@@ -2337,7 +3184,7 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Ref: </source>
<comment>Reference abbreviation</comment>
- <translation type="unfinished"/>
+ <translation>Ref: </translation>
</message>
<message>
<source>Group</source>
@@ -2369,7 +3216,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Expires</source>
- <translation>Går ut</translation>
+ <translation>Förfaller</translation>
</message>
<message>
<source>Created</source>
@@ -2381,7 +3228,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Accessed</source>
- <translation>Läst</translation>
+ <translation>Använd</translation>
</message>
<message>
<source>Attachments</source>
@@ -2393,16 +3240,12 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>TOTP</source>
- <translation type="unfinished"/>
+ <translation>TOTP</translation>
</message>
</context>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Generera TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>Stäng</translation>
</message>
@@ -2420,7 +3263,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Expiration</source>
- <translation>Utgår</translation>
+ <translation>Förfaller</translation>
</message>
<message>
<source>URL</source>
@@ -2440,7 +3283,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Autotype</source>
- <translation>Autotyp</translation>
+ <translation>Autoskriv</translation>
</message>
<message>
<source>Window</source>
@@ -2487,12 +3330,20 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>Dela</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avancerat</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
<message>
<source>Customize View</source>
- <translation>Anpassa vy</translation>
+ <translation>Anpassa vyn</translation>
</message>
<message>
<source>Hide Usernames</source>
@@ -2520,11 +3371,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Papperskorg</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2539,6 +3412,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
+ <translation>Kan inte att spara den inbyggda meddelandeskriptfilen.</translation>
+ </message>
+</context>
+<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Stäng</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2557,34 +3482,35 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx3Reader</name>
<message>
<source>Unable to calculate master key</source>
- <translation>Kunde inte räkna nu master-nyckeln</translation>
+ <translation>Kan inte beräkna huvudnyckeln</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Fel lösenord eller korrupt databas-fil</translation>
+ <translation>Kan inte utfärda challenge-response.</translation>
</message>
<message>
<source>missing database headers</source>
- <translation type="unfinished"/>
+ <translation>saknade databashuvuden</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation type="unfinished"/>
+ <translation>Huvudet stämmer inte med hashen</translation>
</message>
<message>
<source>Invalid header id size</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på sidhuvudets ID</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på sidhuvudets fältlängd</translation>
</message>
<message>
<source>Invalid header data length</source>
+ <translation>Ogiltig storlek på sidhuvudets datalängd</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"/>
</message>
</context>
@@ -2592,79 +3518,75 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx3Writer</name>
<message>
<source>Unable to issue challenge-response.</source>
- <translation type="unfinished"/>
+ <translation>Kan inte utfärda challenge-response.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Kunde inte räkna nu master-nyckeln</translation>
+ <translation>Kan inte beräkna huvudnyckeln</translation>
</message>
</context>
<context>
<name>Kdbx4Reader</name>
<message>
<source>missing database headers</source>
- <translation type="unfinished"/>
+ <translation>saknade databashuvuden</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Kunde inte räkna nu master-nyckeln</translation>
+ <translation>Kan inte beräkna huvudnyckeln</translation>
</message>
<message>
<source>Invalid header checksum size</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på sidhuvudets kontrollsumma</translation>
</message>
<message>
<source>Header SHA256 mismatch</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation type="unfinished"/>
+ <translation>Sidhuvudets SHA256 stämmer inte</translation>
</message>
<message>
<source>Unknown cipher</source>
- <translation>Okänt krypto</translation>
+ <translation>Okänt chiffer</translation>
</message>
<message>
<source>Invalid header id size</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på sidhuvudets ID</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på sidhuvudets fältlängd</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på sidhuvudets datalängd</translation>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte öppna buffert för KDF-parametrar i sidhuvudet</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
- <translation type="unfinished"/>
+ <translation>Nyckelhärledningen stöds inte (KDF), eller ogiltiga parametrar.</translation>
</message>
<message>
<source>Legacy header fields found in KDBX4 file.</source>
- <translation type="unfinished"/>
+ <translation>Äldre sidhuvudfält hittades i KDBX4-filen.</translation>
</message>
<message>
<source>Invalid inner header id size</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på inre sidhuvud-ID</translation>
</message>
<message>
<source>Invalid inner header field length</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig längd på inre sidhuvudfält</translation>
</message>
<message>
<source>Invalid inner header binary size</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på inre sidhuvudbinär</translation>
</message>
<message>
<source>Unsupported KeePass variant map version.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>KeePass-versionen av datastruktur för lagring av metadata stöds inte.</translation>
</message>
<message>
<source>Invalid variant map entry name length</source>
@@ -2721,33 +3643,42 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
<message>
<source>Invalid symmetric cipher algorithm.</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig symetrisk chifferalgoritm.</translation>
</message>
<message>
<source>Invalid symmetric cipher IV size.</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation type="unfinished"/>
+ <translation>Ogiltig symmetrisk chiffer IV-storlek.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>Kunde inte räkna nu master-nyckeln</translation>
+ <translation>Kan inte beräkna huvudnyckeln</translation>
</message>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation type="unfinished"/>
+ <translation>Det gick inte att serialisera KDF-parametrarnas datastruktur för lagring av metadata</translation>
</message>
</context>
<context>
<name>KdbxReader</name>
<message>
<source>Unsupported cipher</source>
- <translation type="unfinished"/>
+ <translation>Chiffer som inte stöds</translation>
</message>
<message>
<source>Invalid compression flags length</source>
@@ -2755,7 +3686,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unsupported compression algorithm</source>
- <translation type="unfinished"/>
+ <translation>Stöd saknas för komprimeringsalgoritmen</translation>
</message>
<message>
<source>Invalid master seed size</source>
@@ -2783,18 +3714,21 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Inte en KeePass databas.</translation>
+ <translation>Inte en KeePass-databas.</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"/>
+ <translation>Den valda filen är en gammal KeePass 1-databas (.kdb).
+
+Du kan importera den genom att klicka på &quot;Databas &gt; Importera &gt; KeePass 1-databas...&quot;.
+Detta är en envägsmigrering. Du kommer inte att kunna öppna den importerade databasen med den gamla KeePassX 0.4-versionen.</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
- <translation type="unfinished"/>
+ <translation>KeePass 2 databasversion som inte stöds.</translation>
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
@@ -2806,7 +3740,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Failed to read database file.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte läsa databasfilen.</translation>
</message>
</context>
<context>
@@ -2817,7 +3751,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>No root group</source>
- <translation type="unfinished"/>
+ <translation>Ingen root-grupp</translation>
</message>
<message>
<source>Missing icon uuid or data</source>
@@ -2938,48 +3872,48 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Importera KeePass1 databas</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Kunde inte öppna databas.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
- <translation>Kunde inte läsa nyckel-filen.</translation>
+ <translation>Kan inte läsa nyckelfilen.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>Inte en KeePass databas.</translation>
+ <translation>Inte en KeePass-databas.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
- <translation>Krypteringsalgoritnmen stöds ej</translation>
+ <translation>Krypteringsalgoritnmen stöds ej.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
- <translation>KeePass databas versionen stöds ej.</translation>
+ <translation>KeePass-databasversionen stöds ej.</translation>
</message>
<message>
<source>Unable to read encryption IV</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation type="unfinished"/>
+ <translation>Kan inte läsa kryptering IV</translation>
</message>
<message>
<source>Invalid number of groups</source>
- <translation type="unfinished"/>
+ <translation>Ogiltigt antal grupper</translation>
</message>
<message>
<source>Invalid number of entries</source>
- <translation type="unfinished"/>
+ <translation>Ogiltigt antal poster</translation>
</message>
<message>
<source>Invalid content hash size</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig storlek på innehålls-hash</translation>
</message>
<message>
<source>Invalid transform seed size</source>
@@ -2987,11 +3921,11 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation type="unfinished"/>
+ <translation>Ogiltigt antal transformeringsrundor</translation>
</message>
<message>
<source>Unable to construct group tree</source>
- <translation type="unfinished"/>
+ <translation>Kan inte konstruera gruppträd</translation>
</message>
<message>
<source>Root</source>
@@ -3002,12 +3936,8 @@ Line %2, column %3</source>
<translation>Kunde inte räkna nu master-nyckeln</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Fel lösenord eller korrupt databas-fil</translation>
- </message>
- <message>
<source>Key transformation failed</source>
- <translation type="unfinished"/>
+ <translation>Nyckeltransformering misslyckades</translation>
</message>
<message>
<source>Invalid group field type number</source>
@@ -3101,39 +4031,56 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Importera från</translation>
+ <source>Imported from %1</source>
+ <translation>Importerad ifrån %1</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Exportera till</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Synkronisera med</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
+ <source>Export is disabled in settings</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
+ <source>Inactive share</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
+ <source>Imported from</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3141,11 +4088,11 @@ Line %2, column %3</source>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation type="unfinished"/>
+ <translation>Nyckelkomponent</translation>
</message>
<message>
<source>Key Component Description</source>
- <translation type="unfinished"/>
+ <translation>Beskrivning för nyckelkomponent</translation>
</message>
<message>
<source>Cancel</source>
@@ -3153,7 +4100,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation type="unfinished"/>
+ <translation>Nyckelkomponent angiven, klicka för att ändra eller ta bort</translation>
</message>
<message>
<source>Add %1</source>
@@ -3173,46 +4120,45 @@ Line %2, column %3</source>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation type="unfinished"/>
+ <translation>%1 angivet, klicka för att ändra eller ta bort</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Bläddra</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Generera</translation>
</message>
<message>
<source>Key File</source>
- <translation>Nyckel-fil</translation>
+ <translation>Nyckelfil</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Du kan lägga till en nyckelfil innehållande slumpmässiga byte för ytterligare säkerhet.&lt;/p&gt;&lt;p&gt;Du måste lagra den säkert och aldrig förlora den, för att inte bli utestängd&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
- <translation type="unfinished"/>
+ <translation>Äldre nyckelfilsformat</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation type="unfinished"/>
+ <translation>Du använder ett äldre nyckelfilsformat, som kanske inte kommer att stödjas i framtiden.
+
+Gå till huvudnyckelinställningarna och generera en ny nyckelfil.</translation>
</message>
<message>
<source>Error loading the key file '%1'
Message: %2</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte läsa in nyckelfilen &quot;%1&quot;
+Meddelande: %2</translation>
</message>
<message>
<source>Key files</source>
- <translation>Nyckel-filer</translation>
+ <translation>Nyckelfiler</translation>
</message>
<message>
<source>All files</source>
@@ -3220,19 +4166,56 @@ Message: %2</source>
</message>
<message>
<source>Create Key File...</source>
- <translation>Skapa nyckel-fil...</translation>
+ <translation>Skapa nyckelfil...</translation>
</message>
<message>
<source>Error creating key file</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte skapa nyckelfil</translation>
</message>
<message>
<source>Unable to create key file: %1</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte skapa nyckelfil: %1</translation>
</message>
<message>
<source>Select a key file</source>
- <translation>Välj nyckel-fil</translation>
+ <translation>Välj nyckelfil</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Bläddra...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3243,7 +4226,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Recent databases</source>
- <translation type="unfinished"/>
+ <translation>&amp;Tidigare databaser</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -3251,7 +4234,7 @@ Message: %2</source>
</message>
<message>
<source>E&amp;ntries</source>
- <translation>Poster</translation>
+ <translation>&amp;Poster</translation>
</message>
<message>
<source>&amp;Groups</source>
@@ -3271,7 +4254,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Open database...</source>
- <translation>&amp;Öppna databas</translation>
+ <translation>&amp;Öppna databas...</translation>
</message>
<message>
<source>&amp;Save database</source>
@@ -3279,11 +4262,11 @@ Message: %2</source>
</message>
<message>
<source>&amp;Close database</source>
- <translation>&amp;Stäng databas</translation>
+ <translation>St&amp;äng databas</translation>
</message>
<message>
<source>&amp;Delete entry</source>
- <translation>&amp;Radera post</translation>
+ <translation>&amp;Ta bort post</translation>
</message>
<message>
<source>&amp;Edit group</source>
@@ -3291,11 +4274,11 @@ Message: %2</source>
</message>
<message>
<source>&amp;Delete group</source>
- <translation>&amp;Radera grupp</translation>
+ <translation>Ta bort &amp;grupp</translation>
</message>
<message>
<source>Sa&amp;ve database as...</source>
- <translation>Sp&amp;ara databas som...</translation>
+ <translation>S&amp;para databas som...</translation>
</message>
<message>
<source>Database settings</source>
@@ -3307,27 +4290,23 @@ Message: %2</source>
</message>
<message>
<source>Copy &amp;username</source>
- <translation>Kopiera &amp;användarnamn</translation>
+ <translation>Kopiera användar&amp;namn</translation>
</message>
<message>
<source>Copy username to clipboard</source>
- <translation>Kopiera användarnamn</translation>
+ <translation>Kopiera användarnamn till urklipp</translation>
</message>
<message>
<source>Copy password to clipboard</source>
- <translation>Kopiera lösenord</translation>
+ <translation>Kopiera lösenord till urklipp</translation>
</message>
<message>
<source>&amp;Settings</source>
<translation>&amp;Inställningar</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Lösenordsgenerator</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation>&amp;Lås databas</translation>
+ <translation>&amp;Lås databaser</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -3335,7 +4314,7 @@ Message: %2</source>
</message>
<message>
<source>Copy title to clipboard</source>
- <translation>Kopiera titeln till Urklipp</translation>
+ <translation>Kopiera titel till urklipp</translation>
</message>
<message>
<source>&amp;URL</source>
@@ -3343,15 +4322,15 @@ Message: %2</source>
</message>
<message>
<source>Copy URL to clipboard</source>
- <translation>Kopiera URL till Urklipp</translation>
+ <translation>Kopiera URL till urklipp</translation>
</message>
<message>
<source>&amp;Notes</source>
- <translation>&amp;Noteringar</translation>
+ <translation>&amp;Anteckningar</translation>
</message>
<message>
<source>Copy notes to clipboard</source>
- <translation>Kopiera anteckningar till Urklipp</translation>
+ <translation>Kopiera anteckningar till urklipp</translation>
</message>
<message>
<source>&amp;Export to CSV file...</source>
@@ -3371,7 +4350,7 @@ Message: %2</source>
</message>
<message>
<source>Clear history</source>
- <translation>Töm historiken</translation>
+ <translation>Rensa historiken</translation>
</message>
<message>
<source>Access error for config file %1</source>
@@ -3383,7 +4362,7 @@ Message: %2</source>
</message>
<message>
<source>Toggle window</source>
- <translation>Visa/dölj fönster</translation>
+ <translation>Visa/Dölj fönster</translation>
</message>
<message>
<source>Quit KeePassXC</source>
@@ -3391,13 +4370,15 @@ Message: %2</source>
</message>
<message>
<source>Please touch the button on your YubiKey!</source>
- <translation type="unfinished"/>
+ <translation>Rör vid knappen på din YubiKey!</translation>
</message>
<message>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation type="unfinished"/>
+ <translation>VARNING! Du använder en instabil kompilering av KeePassXC!
+Det är hög risk för fel, säkerhetskopiera dina databaser.
+Denna version är inte ämnad för daglig användning.</translation>
</message>
<message>
<source>&amp;Donate</source>
@@ -3405,16 +4386,17 @@ This version is not meant for production use.</source>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation>Rapportera en &amp;bug</translation>
+ <translation>&amp;Rapportera ett fel</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
- <translation type="unfinished"/>
+ <translation>VARNING! Din Qt-version kan leda till att KeePassXC kraschar vid användning av skärmtangentbord!
+Vi rekommenderar att du använder tillgänglig AppImage, från vår nerladdningssida.</translation>
</message>
<message>
<source>&amp;Import</source>
- <translation>&amp;Import</translation>
+ <translation>&amp;Importera</translation>
</message>
<message>
<source>Copy att&amp;ribute...</source>
@@ -3430,47 +4412,47 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Create a new database</source>
- <translation>Skapa ny databas</translation>
+ <translation>Skapa en ny databas</translation>
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation>&amp;Sammanfoga från databas...</translation>
+ <translation>&amp;Infoga från databas...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
- <translation>Sammanfoga från annan KDBX-databas</translation>
+ <translation>Infoga från annan KDBX-databas</translation>
</message>
<message>
<source>&amp;New entry</source>
- <translation>Ny post</translation>
+ <translation>&amp;Ny post</translation>
</message>
<message>
<source>Add a new entry</source>
- <translation>Lägg till ny post</translation>
+ <translation>Lägg till en ny post</translation>
</message>
<message>
<source>&amp;Edit entry</source>
- <translation type="unfinished"/>
+ <translation>&amp;Redigera post</translation>
</message>
<message>
<source>View or edit entry</source>
- <translation type="unfinished"/>
+ <translation>Visa eller redigera posten</translation>
</message>
<message>
<source>&amp;New group</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ny grupp</translation>
</message>
<message>
<source>Add a new group</source>
- <translation type="unfinished"/>
+ <translation>Lägg till en ny grupp</translation>
</message>
<message>
<source>Change master &amp;key...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Ändra huvudnyckel...</translation>
</message>
<message>
<source>&amp;Database settings...</source>
- <translation type="unfinished"/>
+ <translation>&amp;Databasinställningar...</translation>
</message>
<message>
<source>Copy &amp;password</source>
@@ -3478,19 +4460,19 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
- <translation type="unfinished"/>
+ <translation>&amp;Utför autoskriv</translation>
</message>
<message>
<source>Open &amp;URL</source>
- <translation type="unfinished"/>
+ <translation>&amp;Öppna URL</translation>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation>KeePass 1 databas...</translation>
+ <translation>KeePass 1-databas...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
- <translation>Importera en KeePass1 databas</translation>
+ <translation>Importera en KeePass1-databas</translation>
</message>
<message>
<source>CSV file...</source>
@@ -3509,28 +4491,89 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation>Visa TOTP QR-kod...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Sök efter uppdateringar...</translation>
+ <source>NOTE: You are using a pre-release version of KeePassXC!
+Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <translation>NOTIS: Du använder en förhandsversion av KeePassXC!
+Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för daglig användning.</translation>
</message>
<message>
- <source>Share entry</source>
- <translation>Dela post</translation>
+ <source>Check for updates on startup?</source>
+ <translation>Vill du söka efter uppdateringar vid uppstart?</translation>
</message>
<message>
- <source>NOTE: You are using a pre-release version of KeePassXC!
-Expect some bugs and minor issues, this version is not meant for production use.</source>
+ <source>Would you like KeePassXC to check for updates on startup?</source>
+ <translation>Vill du att KeePassXC skall söka efter uppdateringar vid uppstart?</translation>
+ </message>
+ <message>
+ <source>You can always check for updates manually from the application menu.</source>
+ <translation>Du kan alltid söka efter uppdateringar manuellt, från programmenyn.</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Check for updates on startup?</source>
+ <source>&amp;Check for Updates...</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Would you like KeePassXC to check for updates on startup?</source>
+ <source>Downlo&amp;ad all favicons</source>
<translation type="unfinished"/>
</message>
<message>
- <source>You can always check for updates manually from the application menu.</source>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Ladda ner favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3538,11 +4581,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Skapar saknad %1 [%2]</translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Omplacerar %1 [%2]</translation>
</message>
<message>
<source>Overwriting %1 [%2]</source>
@@ -3550,46 +4593,54 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation type="unfinished"/>
+ <translation>äldre post infogad från databas &quot;%1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Lägger till säkerhetskopia från äldre mål %1 [%2]</translation>
</message>
<message>
<source>Adding backup for older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Lägger till säkerhetskopia från äldre källa %1 [%2]</translation>
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Återanvänder äldre målpost ovanpå nyare källa %1 [%2]</translation>
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Återanvänder äldre källpost ovanpå nyare mål %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Synkroniserar från nyare källa %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Synkroniserar från äldre källa %1 [%2]</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Tar bort underpost %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>Tar bort post %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
- <translation type="unfinished"/>
+ <translation>Ändrade borttagna objekt</translation>
</message>
<message>
<source>Adding missing icon %1</source>
+ <translation>Lägger till saknad ikon %1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3597,7 +4648,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation type="unfinished"/>
+ <translation>Skapa en ny KeePassXC-databas...</translation>
</message>
<message>
<source>Root</source>
@@ -3609,15 +4660,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizardPage</name>
<message>
<source>WizardPage</source>
- <translation type="unfinished"/>
+ <translation>Guidesida</translation>
</message>
<message>
<source>En&amp;cryption Settings</source>
- <translation type="unfinished"/>
+ <translation>&amp;Krypteringsinställningar</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Här kan du justera inställningarna för databaskrypteringen. Oroa dig inte, du kan ändra dem senare, i databasinställningarna.</translation>
</message>
<message>
<source>Advanced Settings</source>
@@ -3625,7 +4676,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Simple Settings</source>
- <translation type="unfinished"/>
+ <translation>Förenklade inställningar</translation>
</message>
</context>
<context>
@@ -3636,28 +4687,94 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation type="unfinished"/>
+ <translation>Här kan du justera inställningarna för databaskrypteringen. Oroa dig inte, du kan ändra dem senare, i databasinställningarna.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMasterKey</name>
<message>
<source>Database Master Key</source>
- <translation type="unfinished"/>
+ <translation>Databasens huvudnyckel</translation>
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation type="unfinished"/>
+ <translation>En huvudnyckel som bara du känner till, skyddar din databas.</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageMetaData</name>
<message>
<source>General Database Information</source>
- <translation type="unfinished"/>
+ <translation>Allmän databasinformation</translation>
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
+ <translation>Fyll i visningsnamnet och en frivillig beskrivning för din nya databas.</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3665,91 +4782,91 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig nyckelfil, en OpenSSH-nyckel förväntas</translation>
</message>
<message>
<source>PEM boundary mismatch</source>
- <translation type="unfinished"/>
+ <translation>PEM-gränsfel</translation>
</message>
<message>
<source>Base64 decoding failed</source>
- <translation type="unfinished"/>
+ <translation>Base64-avkodning misslyckades</translation>
</message>
<message>
<source>Key file way too small.</source>
- <translation>Nyckelfilen är alldeles för liten</translation>
+ <translation>Nyckelfilen är alldeles för liten.</translation>
</message>
<message>
<source>Key file magic header id invalid</source>
- <translation type="unfinished"/>
+ <translation>Nyckelfilens magiska huvud-ID är ogiltigt</translation>
</message>
<message>
<source>Found zero keys</source>
- <translation type="unfinished"/>
+ <translation>Hittade inga nycklar</translation>
</message>
<message>
<source>Failed to read public key.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte läsa offentlig nyckel.</translation>
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation type="unfinished"/>
+ <translation>Skadad nyckelfil, kunde inte läsa privat nyckel</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation type="unfinished"/>
+ <translation>Ingen nyttolast att avkryptera, från privat nyckel</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
- <translation type="unfinished"/>
+ <translation>Försöker köra KDF utan chiffer</translation>
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
- <translation type="unfinished"/>
+ <translation>Lösenordsfras krävs för att avkryptera denna nyckel</translation>
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation type="unfinished"/>
+ <translation>Nyckelhärledning misslyckades, är nyckelfilen skadad?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation type="unfinished"/>
+ <translation>Avkryptering misslyckades, är det fel lösenord?</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation type="unfinished"/>
+ <translation>Oväntad EOF, under inläsning av offentlig nyckel</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation type="unfinished"/>
+ <translation>Oväntad EOF, under inläsning av privat nyckel</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
- <translation type="unfinished"/>
+ <translation>Kan inte skriva offentlig nyckel, eftersom den är tom</translation>
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation type="unfinished"/>
+ <translation>Oväntad EOF, vid skrivning av offentlig nyckel</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
- <translation type="unfinished"/>
+ <translation>Kan inte skriva privat nyckel, eftersom den är tom</translation>
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation type="unfinished"/>
+ <translation>Oväntad EOF, vid skrivning av privat nyckel</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
- <translation type="unfinished"/>
+ <translation>Nyckeltypen stöds ej: %1</translation>
</message>
<message>
<source>Unknown cipher: %1</source>
- <translation type="unfinished"/>
+ <translation>Okänt chiffer: %1</translation>
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
- <translation type="unfinished"/>
+ <translation>Chiffer IV är för kort för MD5 kdf</translation>
</message>
<message>
<source>Unknown KDF: %1</source>
@@ -3761,6 +4878,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3768,7 +4896,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Confirm password:</source>
- <translation type="unfinished"/>
+ <translation>Bekräfta lösenord:</translation>
</message>
<message>
<source>Password</source>
@@ -3776,14 +4904,30 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Ett lösenord är den primära metoden för att säkra din databas.&lt;/p&gt;&lt;p&gt;Bra lösenord är långa, komplexa och unika. KeePassXC kan skapa dem åt dig.&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
- <translation type="unfinished"/>
+ <translation>Lösenorden stämmer inte.</translation>
</message>
<message>
<source>Generate master password</source>
+ <translation>Skapa huvudlösenord</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3815,32 +4959,20 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Teckentyper</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Versaler</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Gemener</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Siffror</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Specialtecken</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Utökad ASCII</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
- <translation>Uteslut liknande tecken</translation>
+ <translation>Undanta tecken som liknar varandra</translation>
</message>
<message>
<source>Pick characters from every group</source>
- <translation>Välj tecken från alla grupper</translation>
+ <translation>Plocka tecken från alla grupper</translation>
</message>
<message>
<source>&amp;Length:</source>
@@ -3848,7 +4980,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passphrase</source>
- <translation>Lösenfras</translation>
+ <translation>Lösenordsfras</translation>
</message>
<message>
<source>Wordlist:</source>
@@ -3856,7 +4988,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Word Separator:</source>
- <translation>Ordseparerare:</translation>
+ <translation>Ordavdelare:</translation>
</message>
<message>
<source>Copy</source>
@@ -3872,11 +5004,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Entropy: %1 bit</source>
- <translation type="unfinished"/>
+ <translation>Entropi: %1 bit</translation>
</message>
<message>
<source>Password Quality: %1</source>
- <translation>Lösenord kvalitet: %1</translation>
+ <translation>Lösenordskvalitet: %1</translation>
</message>
<message>
<source>Poor</source>
@@ -3900,29 +5032,21 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>ExtendedASCII</source>
- <translation type="unfinished"/>
+ <translation>Utökad ASCII</translation>
</message>
<message>
<source>Switch to advanced mode</source>
- <translation type="unfinished"/>
+ <translation>Växla till avancerat läge</translation>
</message>
<message>
<source>Advanced</source>
<translation>Avancerat</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3932,100 +5056,157 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Braces</source>
- <translation type="unfinished"/>
+ <translation>Klammerparenteser</translation>
</message>
<message>
<source>{[(</source>
- <translation type="unfinished"/>
+ <translation>{[(</translation>
</message>
<message>
<source>Punctuation</source>
- <translation type="unfinished"/>
+ <translation>Skiljetecken</translation>
</message>
<message>
<source>.,:;</source>
- <translation type="unfinished"/>
+ <translation>.,:;</translation>
</message>
<message>
<source>Quotes</source>
- <translation type="unfinished"/>
+ <translation>Citationstecken</translation>
</message>
<message>
<source>&quot; &apos;</source>
+ <translation>&quot; &apos;</translation>
+ </message>
+ <message>
+ <source>&lt;*+!?=</source>
+ <translation>&lt;*+!?=</translation>
+ </message>
+ <message>
+ <source>\_|-/</source>
+ <translation>\_|-/</translation>
+ </message>
+ <message>
+ <source>Logograms</source>
+ <translation>Logogram</translation>
+ </message>
+ <message>
+ <source>#$%&amp;&amp;@^`~</source>
+ <translation>#$%&amp;&amp;@^`~</translation>
+ </message>
+ <message>
+ <source>Switch to simple mode</source>
+ <translation>Växla till förenklat läge</translation>
+ </message>
+ <message>
+ <source>Simple</source>
+ <translation>Förenklat</translation>
+ </message>
+ <message>
+ <source>Character set to exclude from generated password</source>
+ <translation>Tecken som undantas från genererade lösenord</translation>
+ </message>
+ <message>
+ <source>Do not include:</source>
+ <translation>Undanta:</translation>
+ </message>
+ <message>
+ <source>Add non-hex letters to &quot;do not include&quot; list</source>
+ <translation>Lägg till icke-hexadecimala tecken till undantagslistan</translation>
+ </message>
+ <message>
+ <source>Hex</source>
+ <translation>Hex</translation>
+ </message>
+ <message>
+ <source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
+ <translation>Undanta tecknen: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
+ </message>
+ <message>
+ <source>Word Co&amp;unt:</source>
+ <translation>&amp;Antal ord:</translation>
+ </message>
+ <message>
+ <source>Regenerate</source>
+ <translation>Återgenerera</translation>
+ </message>
+ <message>
+ <source>Generated password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Math</source>
+ <source>Upper-case letters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>&lt;*+!?=</source>
+ <source>Lower-case letters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Dashes</source>
+ <source>Special characters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>\_|-/</source>
+ <source>Math Symbols</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Logograms</source>
+ <source>Dashes and Slashes</source>
<translation type="unfinished"/>
</message>
<message>
- <source>#$%&amp;&amp;@^`~</source>
+ <source>Excluded characters</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Switch to simple mode</source>
+ <source>Hex Passwords</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Simple</source>
+ <source>Password length</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Character set to exclude from generated password</source>
+ <source>Word Case:</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Do not include:</source>
+ <source>Regenerate password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Add non-hex letters to &quot;do not include&quot; list</source>
+ <source>Copy password</source>
+ <translation>Kopiera lösenord</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Hex</source>
+ <source>lower case</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
+ <source>UPPER CASE</source>
<translation type="unfinished"/>
</message>
<message>
- <source>Word Co&amp;unt:</source>
- <translation>&amp;Antal ord:</translation>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Regenerate</source>
- <translation>Regenerera</translation>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>QApplication</name>
<message>
<source>KeeShare</source>
- <translation type="unfinished"/>
+ <translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
+ <source>Statistics</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4033,7 +5214,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>QMessageBox</name>
<message>
<source>Overwrite</source>
- <translation type="unfinished"/>
+ <translation>Skriv över</translation>
</message>
<message>
<source>Delete</source>
@@ -4041,11 +5222,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation type="unfinished"/>
+ <translation>Flytta</translation>
</message>
<message>
<source>Empty</source>
- <translation type="unfinished"/>
+ <translation>Tom</translation>
</message>
<message>
<source>Remove</source>
@@ -4053,14 +5234,18 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Skip</source>
- <translation type="unfinished"/>
+ <translation>Hoppa över</translation>
</message>
<message>
<source>Disable</source>
- <translation>Stäng av</translation>
+ <translation>Inaktivera</translation>
</message>
<message>
<source>Merge</source>
+ <translation>Sammanfoga</translation>
+ </message>
+ <message>
+ <source>Continue</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4072,27 +5257,27 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Database hash not available</source>
- <translation type="unfinished"/>
+ <translation>Databas-hash inte tillgänglig</translation>
</message>
<message>
<source>Client public key not received</source>
- <translation type="unfinished"/>
+ <translation>Klientens offentliga nyckel inte mottagen</translation>
</message>
<message>
<source>Cannot decrypt message</source>
- <translation>Kan inte avkoda meddelande</translation>
+ <translation>Kan inte avkryptera meddelande</translation>
</message>
<message>
<source>Action cancelled or denied</source>
- <translation>Åtgärden avbröts eller nekades</translation>
+ <translation>Åtgärden avbröts eller avisades</translation>
</message>
<message>
<source>KeePassXC association failed, try again</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC-association misslyckades, försök igen!</translation>
</message>
<message>
<source>Encryption key is not recognized</source>
- <translation type="unfinished"/>
+ <translation>Krypteringsnyckeln känns inte igen</translation>
</message>
<message>
<source>Incorrect action</source>
@@ -4108,7 +5293,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>No logins found</source>
- <translation>Hittade inga inloggningar</translation>
+ <translation>Inga inloggningar hittades</translation>
</message>
<message>
<source>Unknown error</source>
@@ -4120,7 +5305,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Path of the database.</source>
- <translation>Sökväg till databasen</translation>
+ <translation>Sökväg till databasen.</translation>
</message>
<message>
<source>Key file of the database.</source>
@@ -4148,23 +5333,19 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Prompt for the entry&apos;s password.</source>
- <translation type="unfinished"/>
+ <translation>Fråga efter postens lösenord.</translation>
</message>
<message>
<source>Generate a password for the entry.</source>
<translation>Generera ett lösenord för posten.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>length</source>
<translation>längd</translation>
</message>
<message>
<source>Path of the entry to add.</source>
- <translation type="unfinished"/>
+ <translation>Sökväg till den tillagda posten.</translation>
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
@@ -4173,11 +5354,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
<message>
<source>Path of the entry to clip.</source>
<comment>clip = copy to clipboard</comment>
- <translation type="unfinished"/>
+ <translation>Sökväg att kopiera.</translation>
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
- <translation>Timeout i sekunder innan Urklipp rensas.</translation>
+ <translation>Tidsgräns i sekunder innan urklipp rensas.</translation>
</message>
<message>
<source>Edit an entry.</source>
@@ -4193,38 +5374,29 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Path of the entry to edit.</source>
- <translation>Sökvägen till posten att redigera.</translation>
+ <translation>Sökväg till posten att redigera.</translation>
</message>
<message>
<source>Estimate the entropy of a password.</source>
- <translation type="unfinished"/>
+ <translation>Uppskatta ett lösenords entropi.</translation>
</message>
<message>
<source>Password for which to estimate the entropy.</source>
- <translation type="unfinished"/>
+ <translation>Lösenord som entropin skall uppskattas för.</translation>
</message>
<message>
<source>Perform advanced analysis on the password.</source>
<translation>Utföra avancerad analys av lösenordet.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Sökvägen till databasen som skall extraheras.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Ange lösenordet för att låsa upp %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation type="unfinished"/>
+ <translation>VARNING! Du använder ett äldre nyckelfilsformat som kanske
+inte kommer att stödjas i framtiden.
+
+Överväg att generera en ny nyckelfil.</translation>
</message>
<message>
<source>
@@ -4238,7 +5410,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Name of the command to execute.</source>
- <translation>Namnet på kommandot som ska köras.</translation>
+ <translation>Namn på kommandot som skall köras.</translation>
</message>
<message>
<source>List database entries.</source>
@@ -4246,7 +5418,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Path of the group to list. Default is /</source>
- <translation>Sökvägen till gruppen att lista. Standard är /</translation>
+ <translation>Sökväg till gruppen som skall listas. Standard är /</translation>
</message>
<message>
<source>Find entries quickly.</source>
@@ -4254,35 +5426,31 @@ Tillgängliga kommandon:
</message>
<message>
<source>Search term.</source>
- <translation>Sökord.</translation>
+ <translation>Sökterm.</translation>
</message>
<message>
<source>Merge two databases.</source>
<translation>Sammanfoga två databaser.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Sökvägen till databasen för att sammanfoga till.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
- <translation>Sökvägen till databasen för att sammanfoga från.</translation>
+ <translation>Sökväg till databas att infoga från.</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation>Använda samma autentiseringsuppgifter för båda databasfilerna.</translation>
+ <translation>Använd samma autentiseringsuppgifter för bägge databasfilerna.</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
- <translation>Nyckelfilen för databasen att sammanfoga från.</translation>
+ <translation>Nyckelfil för databas att infoga från.</translation>
</message>
<message>
<source>Show an entry&apos;s information.</source>
- <translation>Visa en posts information.</translation>
+ <translation>Visa en information för en post.</translation>
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
- <translation type="unfinished"/>
+ <translation>Attributnamn att visa. Detta alternativ kan specificeras fler än en gång, med varje attribut visat, ett per rad i given ordning. Om inga attribut specificeras, kommer en summering av standardattributen att ges.</translation>
</message>
<message>
<source>attribute</source>
@@ -4290,11 +5458,11 @@ Tillgängliga kommandon:
</message>
<message>
<source>Name of the entry to show.</source>
- <translation>Namnet på posten som skall visas.</translation>
+ <translation>Namn på posten som skall visas.</translation>
</message>
<message>
<source>NULL device</source>
- <translation>NULL device</translation>
+ <translation>NULL-enhet</translation>
</message>
<message>
<source>error reading from device</source>
@@ -4302,11 +5470,11 @@ Tillgängliga kommandon:
</message>
<message>
<source>malformed string</source>
- <translation>felaktigt uppbyggd textsträng</translation>
+ <translation>felaktigt uppbyggd sträng</translation>
</message>
<message>
<source>missing closing quote</source>
- <translation>saknar avslutande citattecken</translation>
+ <translation>saknar avslutande citationstecken</translation>
</message>
<message>
<source>Group</source>
@@ -4330,7 +5498,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Last Modified</source>
- <translation>Senast ändrad</translation>
+ <translation>Ändrad</translation>
</message>
<message>
<source>Created</source>
@@ -4341,10 +5509,6 @@ Tillgängliga kommandon:
<translation>Webbläsarintegration</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Press</source>
<translation>Tryck</translation>
</message>
@@ -4354,316 +5518,288 @@ Tillgängliga kommandon:
</message>
<message>
<source>SSH Agent</source>
- <translation>SSH Agent</translation>
+ <translation>SSH-tjänst</translation>
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
- <translation type="unfinished"/>
+ <translation>Generera en ny slumpmässig lösenordsfras.</translation>
</message>
<message>
<source>Word count for the diceware passphrase.</source>
- <translation type="unfinished"/>
+ <translation>Antal ord för lösenordsfrasen.</translation>
</message>
<message>
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
- <translation type="unfinished"/>
+ <translation>Ordlista för lösenordgeneratorn.
+[Standard: EFF English]</translation>
</message>
<message>
<source>Generate a new random password.</source>
- <translation>Generera ett nytt slumpmässigt lösenord.</translation>
- </message>
- <message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
+ <translation>Skapa ett nytt slumpmässigt lösenord.</translation>
</message>
<message>
<source>Could not create entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte skapa post med sökvägen %1.</translation>
</message>
<message>
<source>Enter password for new entry: </source>
- <translation type="unfinished"/>
+ <translation>Ange lösenord för ny post: </translation>
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte skriva databas %1.</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Posten %1 tillagd.</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>Kopiera aktuell TOTP till urklipp.</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation type="unfinished"/>
+ <translation>Ogiltig tidsgräns %1.</translation>
</message>
<message>
<source>Entry %1 not found.</source>
- <translation type="unfinished"/>
+ <translation>Posten %1 hittades inte.</translation>
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
- <translation type="unfinished"/>
+ <translation>Posten med sökväg %1 har ingen TOTP konfigurerad.</translation>
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>Postens aktuella TOTP kopierad till urklipp!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>Postens lösenord kopierat till urklipp!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Rensar urklipp om %1 sekund...</numerusform><numerusform>Rensar urklipp om %1 sekunder...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
- <translation type="unfinished"/>
+ <translation>Urklipp rensat!</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation type="unfinished"/>
+ <translation>Fråga inte efter lösenord och andra sekundära utdata.</translation>
</message>
<message>
<source>count</source>
<comment>CLI parameter</comment>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
+ <translation>antal</translation>
</message>
<message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte hitta post på sökvägen %1.</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Ändrar inga fält för posten %1.</translation>
</message>
<message>
<source>Enter new password for entry: </source>
- <translation type="unfinished"/>
+ <translation>Ange nytt lösenord för posten: </translation>
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte skriva databas: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Redigerade posten %1.</translation>
</message>
<message>
<source>Length %1</source>
- <translation type="unfinished"/>
+ <translation>Längd %1</translation>
</message>
<message>
<source>Entropy %1</source>
- <translation type="unfinished"/>
+ <translation>Entropi %1</translation>
</message>
<message>
<source>Log10 %1</source>
- <translation type="unfinished"/>
+ <translation>Logg10 %1</translation>
</message>
<message>
<source>Multi-word extra bits %1</source>
- <translation type="unfinished"/>
+ <translation>Extra bitar för flerord %1</translation>
</message>
<message>
<source>Type: Bruteforce</source>
- <translation type="unfinished"/>
+ <translation>Typ: Bruteforce</translation>
</message>
<message>
<source>Type: Dictionary</source>
- <translation type="unfinished"/>
+ <translation>Typ: Ordbok</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation type="unfinished"/>
+ <translation>Typ: Ordbok+Leet</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation type="unfinished"/>
+ <translation>Typ: Användarord</translation>
</message>
<message>
<source>Type: User+Leet</source>
- <translation type="unfinished"/>
+ <translation>Typ: Användare+Leet</translation>
</message>
<message>
<source>Type: Repeated</source>
- <translation type="unfinished"/>
+ <translation>Typ: Repeterad</translation>
</message>
<message>
<source>Type: Sequence</source>
- <translation type="unfinished"/>
+ <translation>Typ: Sekvens</translation>
</message>
<message>
<source>Type: Spatial</source>
- <translation type="unfinished"/>
+ <translation>Typ: Spatial</translation>
</message>
<message>
<source>Type: Date</source>
- <translation type="unfinished"/>
+ <translation>Typ: Datum</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Bruteforce (Rep)</translation>
</message>
<message>
<source>Type: Dictionary(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Ordbok (Rep)</translation>
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Ordbok+Leet (Rep)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Användarord (Rep)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Användare+Leet (Rep)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Repeterad (Rep)</translation>
</message>
<message>
<source>Type: Sequence(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Sekvens (Rep)</translation>
</message>
<message>
<source>Type: Spatial(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Spatial (Rep)</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
- <translation type="unfinished"/>
+ <translation>Typ: Datum (Rep)</translation>
</message>
<message>
<source>Type: Unknown%1</source>
- <translation type="unfinished"/>
+ <translation>Typ: Okänd %1</translation>
</message>
<message>
<source>Entropy %1 (%2)</source>
- <translation type="unfinished"/>
+ <translation>Entropi %1 (%2)</translation>
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation type="unfinished"/>
+ <translation>*** Lösenordslängd (%1) != sammanlagd längd av delar (%2) ***</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation>Fil %1 finns inte.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Kunde inte öppna fil %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte läsa in nyckelfil %1: %2</translation>
</message>
<message>
<source>Length of the generated password</source>
- <translation type="unfinished"/>
+ <translation>Längd på det genererade lösenordet</translation>
</message>
<message>
<source>Use lowercase characters</source>
- <translation type="unfinished"/>
+ <translation>Använd gemener</translation>
</message>
<message>
<source>Use uppercase characters</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
+ <translation>Amvänd VERSALER</translation>
</message>
<message>
<source>Use special characters</source>
- <translation type="unfinished"/>
+ <translation>Använd specialtecken</translation>
</message>
<message>
<source>Use extended ASCII</source>
- <translation type="unfinished"/>
+ <translation>Använd utökad ASCII</translation>
</message>
<message>
<source>Exclude character set</source>
- <translation type="unfinished"/>
+ <translation>Undanta teckenupsättning</translation>
</message>
<message>
<source>chars</source>
- <translation type="unfinished"/>
+ <translation>tecken</translation>
</message>
<message>
<source>Exclude similar looking characters</source>
- <translation type="unfinished"/>
+ <translation>Undanta tecken som liknar varandra</translation>
</message>
<message>
<source>Include characters from every selected group</source>
- <translation type="unfinished"/>
+ <translation>Ta med tecken från samtliga valda grupper</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
- <translation type="unfinished"/>
+ <translation>Lista elementen i gruppen rekursivt.</translation>
</message>
<message>
<source>Cannot find group %1.</source>
- <translation type="unfinished"/>
+ <translation>Kan inte hitta gruppen %1.</translation>
</message>
<message>
<source>Error reading merge file:
%1</source>
- <translation type="unfinished"/>
+ <translation>Fel vid läsning av sammanslagningsfil:
+%1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation type="unfinished"/>
+ <translation>Kan inte spara databas till fil: %1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation type="unfinished"/>
+ <translation>Kan inte spara databas till fil: %1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Återvinning av posten %1 slutförd.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation type="unfinished"/>
+ <translation>Tog bort posten %1.</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
- <translation type="unfinished"/>
+ <translation>Visa postens aktuella TOTP.</translation>
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
- <translation type="unfinished"/>
+ <translation>FEL: Okänt attribut %1.</translation>
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation type="unfinished"/>
+ <translation>Inget program definierat för urklippsmanipulation</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation type="unfinished"/>
+ <translation>Kan inte starta programmet %1</translation>
</message>
<message>
<source>file empty</source>
@@ -4675,19 +5811,19 @@ Tillgängliga kommandon:
</message>
<message>
<source>AES: 256-bit</source>
- <translation>AES: 256-bitar</translation>
+ <translation>AES: 256 bitar</translation>
</message>
<message>
<source>Twofish: 256-bit</source>
- <translation>Twofish: 256-bitar</translation>
+ <translation>Twofish: 256 bitar</translation>
</message>
<message>
<source>ChaCha20: 256-bit</source>
- <translation>ChaCha20: 256-bitar</translation>
+ <translation>ChaCha20: 256 bitar</translation>
</message>
<message>
<source>Argon2 (KDBX 4 – recommended)</source>
- <translation>Argon2 (KDBX 4 – rekommenderad)</translation>
+ <translation>Argon2 (KDBX 4 – rekommenderas)</translation>
</message>
<message>
<source>AES-KDF (KDBX 4)</source>
@@ -4709,11 +5845,11 @@ Tillgängliga kommandon:
</message>
<message>
<source>Message encryption failed.</source>
- <translation>Meddelandekryptering misslyckad.</translation>
+ <translation>Meddelandekryptering misslyckaes.</translation>
</message>
<message>
<source>No groups found</source>
- <translation>Inga grupper funna</translation>
+ <translation>Inga grupper hittades</translation>
</message>
<message>
<source>Create a new database.</source>
@@ -4721,75 +5857,67 @@ Tillgängliga kommandon:
</message>
<message>
<source>File %1 already exists.</source>
- <translation>Filen %1 existerar redan.</translation>
+ <translation>Filen %1 finns redan.</translation>
</message>
<message>
<source>Loading the key file failed</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte läsa in nyckelfilen</translation>
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation type="unfinished"/>
+ <translation>Ingen nyckel angiven. Avbryter skapande av databas.</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte spara databasen: %1.</translation>
</message>
<message>
<source>Successfully created new database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
+ <translation>Ny databas skapad.</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
+ <translation>Kunde inte skapa nyckelfilen %1: %2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>Ta bort en post från databasen</translation>
+ <translation>Kunde inte läsa in nyckelfilen %1: %2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
- <translation>Sökväg till posten som tas bort</translation>
+ <translation>Sökväg till posten som tas bort.</translation>
</message>
<message>
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
- <translation type="unfinished"/>
+ <translation>Låsfilen för befintlig enkelinstans är ogiltig. Startar en ny instans.</translation>
</message>
<message>
<source>The lock file could not be created. Single-instance mode disabled.</source>
- <translation type="unfinished"/>
+ <translation>Låsfilen kunde inte skapas. Enkelinstansläge inaktiverat.</translation>
</message>
<message>
<source>KeePassXC - cross-platform password manager</source>
- <translation>KeePassXC - plattformsoberoende lösenordshanterare</translation>
+ <translation>KeePassXC - Plattformsoberoende lösenordshanterare</translation>
</message>
<message>
<source>filenames of the password databases to open (*.kdbx)</source>
- <translation>namnen på lösenordsdatabaserna som öppnas (*.kdbx)</translation>
+ <translation>filnamn på lösenordsdatabaser att öppna (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
- <translation>Sökväg till egen konfigurations-fil</translation>
+ <translation>Sökväg till en anpassad konfigurationsfil</translation>
</message>
<message>
<source>key file of the database</source>
- <translation>nyckel-fil för databas</translation>
+ <translation>nyckelfil för databasen</translation>
</message>
<message>
<source>read password of the database from stdin</source>
- <translation>mottag databaslösenord från stdin</translation>
+ <translation>hämta databaslösenordet från stdin</translation>
</message>
<message>
<source>Parent window handle</source>
- <translation type="unfinished"/>
+ <translation>Hanterare för överordnat fönster</translation>
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
@@ -4797,7 +5925,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
- <translation>Allvarligt fel vid testning av kryptografiska funktioner.</translation>
+ <translation>Allvarligt fel vid test av kryptografiska funktioner.</translation>
</message>
<message>
<source>KeePassXC - Error</source>
@@ -4805,10 +5933,334 @@ Tillgängliga kommandon:
</message>
<message>
<source>Database password: </source>
- <translation>Databaslösenord:</translation>
+ <translation>Databaslösenord: </translation>
</message>
<message>
<source>Cannot create new group</source>
+ <translation>Kan inte skapa ny grupp</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Version %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Build Type: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Ändring: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Utdelning: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Operativsystem: %1
+Processorarkitektur: %2
+Kärna: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Autoskriv</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (signerad och osignerad delning)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (endast signerad delning)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (endast osignerad delning)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ingen</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Aktiverade tillägg:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Databasen ändrades inte av sammanslagningen.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
<translation type="unfinished"/>
</message>
</context>
@@ -4816,100 +6268,100 @@ Tillgängliga kommandon:
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
- <translation>Internt zlib fel vid komprimering:</translation>
+ <translation>Internt zlib-fel vid komprimering: </translation>
</message>
<message>
<source>Error writing to underlying device: </source>
- <translation>Fel vid skrivning till underliggande enhet:</translation>
+ <translation>Kunde inte skriva till underliggande enhet: </translation>
</message>
<message>
<source>Error opening underlying device: </source>
- <translation>Fel vid öppning av underliggande enhet:</translation>
+ <translation>Kunde inte öppna underliggande enhet: </translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
- <translation>Fel vid läsning från underliggande enhet:</translation>
+ <translation>Kunde inte läsa data från underliggande enhet: </translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
- <translation>Internt zlib fel vid extrahering:</translation>
+ <translation>Internt zlib-fel vid extrahering: </translation>
</message>
</context>
<context>
<name>QtIOCompressor::open</name>
<message>
<source>The gzip format not supported in this version of zlib.</source>
- <translation>Gzip formatet stöds inte av denna version av zlib.</translation>
+ <translation>Gzip-formatet stöds inte i denna version av zlib.</translation>
</message>
<message>
<source>Internal zlib error: </source>
- <translation>Internt zlib fel:</translation>
+ <translation>Internt zlib-fel: </translation>
</message>
</context>
<context>
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation type="unfinished"/>
+ <translation>Tjänstanslutning misslyckades.</translation>
</message>
<message>
<source>Agent protocol error.</source>
- <translation type="unfinished"/>
+ <translation>Fel i tjänstprotokollet.</translation>
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation type="unfinished"/>
+ <translation>Ingen tjänst körs. Kan inte lägga till identitet.</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation type="unfinished"/>
+ <translation>Ingen tjänst körs. Kan inte ta bort identitet.</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
- <translation type="unfinished"/>
+ <translation>Tjänsten avvisade denna identitet. Möjliga orsaker inkluderar:</translation>
</message>
<message>
<source>The key has already been added.</source>
- <translation type="unfinished"/>
+ <translation>Nyckeln har redan lagts till.</translation>
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>Begränsad livstid stöds inte av tjänsten (kontrollera alternativen).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>Bekräftelsebegäran stöds inte av tjänsten (kontrollera alternativen).</translation>
</message>
</context>
<context>
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Sökhjälp</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>Söktermer är följande: [modifierare][fält:][&quot;]term[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>Varje sökterm måste matcha (ex. logisk OCH)</translation>
</message>
<message>
<source>Modifiers</source>
- <translation type="unfinished"/>
+ <translation>Modifierare</translation>
</message>
<message>
<source>exclude term from results</source>
- <translation type="unfinished"/>
+ <translation>Undanta termen från resultat</translation>
</message>
<message>
<source>match term exactly</source>
- <translation type="unfinished"/>
+ <translation>Matcha termen exakt</translation>
</message>
<message>
<source>use regex in term</source>
- <translation type="unfinished"/>
+ <translation>Använd RegEx i termen</translation>
</message>
<message>
<source>Fields</source>
@@ -4917,19 +6369,19 @@ Tillgängliga kommandon:
</message>
<message>
<source>Term Wildcards</source>
- <translation type="unfinished"/>
+ <translation>Jokertecken</translation>
</message>
<message>
<source>match anything</source>
- <translation type="unfinished"/>
+ <translation>Matcha allt</translation>
</message>
<message>
<source>match one</source>
- <translation type="unfinished"/>
+ <translation>Matcha en</translation>
</message>
<message>
<source>logical OR</source>
- <translation type="unfinished"/>
+ <translation>Logisk ELLER</translation>
</message>
<message>
<source>Examples</source>
@@ -4952,7 +6404,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>Sökhjälp</translation>
</message>
<message>
<source>Search (%1)...</source>
@@ -4965,6 +6417,93 @@ Tillgängliga kommandon:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allmänt</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Grupp</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Databasinställningar</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Lås upp databas</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Lås databasen</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ingen</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -4972,19 +6511,19 @@ Tillgängliga kommandon:
</message>
<message>
<source>Allow export</source>
- <translation type="unfinished"/>
+ <translation>Tillåt export</translation>
</message>
<message>
<source>Allow import</source>
- <translation type="unfinished"/>
+ <translation>Tillåt import</translation>
</message>
<message>
<source>Own certificate</source>
- <translation type="unfinished"/>
+ <translation>Eget certifikat</translation>
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>Fingeravtryck:</translation>
</message>
<message>
<source>Certificate:</source>
@@ -4992,7 +6531,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Signer</source>
- <translation type="unfinished"/>
+ <translation>Undertecknare</translation>
</message>
<message>
<source>Key:</source>
@@ -5008,15 +6547,15 @@ Tillgängliga kommandon:
</message>
<message>
<source>Export</source>
- <translation>Export</translation>
+ <translation>Exportera</translation>
</message>
<message>
<source>Imported certificates</source>
- <translation type="unfinished"/>
+ <translation>Importerade certifikat</translation>
</message>
<message>
<source>Trust</source>
- <translation type="unfinished"/>
+ <translation>Betrodd</translation>
</message>
<message>
<source>Ask</source>
@@ -5024,7 +6563,7 @@ Tillgängliga kommandon:
</message>
<message>
<source>Untrust</source>
- <translation type="unfinished"/>
+ <translation>Ej betrodd</translation>
</message>
<message>
<source>Remove</source>
@@ -5048,11 +6587,11 @@ Tillgängliga kommandon:
</message>
<message>
<source>Trusted</source>
- <translation type="unfinished"/>
+ <translation>Betrodd</translation>
</message>
<message>
<source>Untrusted</source>
- <translation type="unfinished"/>
+ <translation>Ej betrodd</translation>
</message>
<message>
<source>Unknown</source>
@@ -5061,11 +6600,11 @@ Tillgängliga kommandon:
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation type="unfinished"/>
+ <translation>key.share</translation>
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>KeeShare nyckelfil</translation>
</message>
<message>
<source>All files</source>
@@ -5073,38 +6612,133 @@ Tillgängliga kommandon:
</message>
<message>
<source>Select path</source>
- <translation type="unfinished"/>
+ <translation>Välj sökväg</translation>
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>Exporterar ändrat certifikat</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation type="unfinished"/>
+ <translation>Det exporterade certifikatet är inte detsamma som det som används. Vill du exportera det aktuella certifikatet?</translation>
</message>
<message>
<source>Signer:</source>
+ <translation>Undertecknare:</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Nyckel</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
<translation type="unfinished"/>
</message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Det saknas stöd för att skriva över signerad delningsbehållare. - Export förhindrad.</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Kunde inte skriva exportbehållare (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Kunde inte bädda in signatur: Kunde inte öppna filen för skrivning (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Kunde inte bädda in signatur: Kunde inte skriva filen (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Kunde inte bädda in databas: Kunde inte öppna filen för skrivning (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Kunde inte bädda in databa: Kunde inte skriva filen (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Det saknas stöd för att skriva över osignerad delningsbehållare. - Export förhindrad.</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Kunde inte skriva exportbehållare</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Ett oväntat exportfel inträffade</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
- <translation type="unfinished"/>
+ <translation>Importera från behållare utan signatur</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
- <translation type="unfinished"/>
+ <translation>Vi kan inte verifiera källan för den delade behållaren, eftersom den inte är signerad. Vill du verkligen importera från %1?</translation>
</message>
<message>
<source>Import from container with certificate</source>
- <translation type="unfinished"/>
+ <translation>Importera från behållare med certifikat</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Vill du lita på %1, med fingeravtryck för %2, från %3?</translation>
</message>
<message>
<source>Not this time</source>
- <translation>Inte denna gång</translation>
+ <translation>Inte den här gången</translation>
</message>
<message>
<source>Never</source>
@@ -5116,39 +6750,27 @@ Tillgängliga kommandon:
</message>
<message>
<source>Just this time</source>
- <translation>Bara denna gång</translation>
- </message>
- <message>
- <source>Import from %1 failed (%2)</source>
- <translation>Import från %1 misslyckades (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Import från %1 lyckades (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Importerad ifrån %1</translation>
+ <translation>Endast den här gången</translation>
</message>
<message>
<source>Signed share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>Signerad delningsbehållare stöds inte. - Import förhindrad.</translation>
</message>
<message>
<source>File is not readable</source>
- <translation>Filen är inte läsbar</translation>
+ <translation>Filen kan inte läsas</translation>
</message>
<message>
<source>Invalid sharing container</source>
- <translation>Ogiltig delningscontainer</translation>
+ <translation>Ogiltig delningsbehållare</translation>
</message>
<message>
<source>Untrusted import prevented</source>
- <translation type="unfinished"/>
+ <translation>Ej betrodd import förhindrad</translation>
</message>
<message>
<source>Successful signed import</source>
- <translation type="unfinished"/>
+ <translation>Signerad import slutförd</translation>
</message>
<message>
<source>Unexpected error</source>
@@ -5156,86 +6778,61 @@ Tillgängliga kommandon:
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>Osignerad delningsbehållare stöds inte. - Import förhindrad.</translation>
</message>
<message>
<source>Successful unsigned import</source>
- <translation type="unfinished"/>
+ <translation>Osignerad import slutförd</translation>
</message>
<message>
<source>File does not exist</source>
- <translation>Filen existerar inte.</translation>
+ <translation>Filen finns inte</translation>
</message>
<message>
<source>Unknown share container type</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
+ <translation>Okänd typ av delningsbehållare</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Import från %1 misslyckades (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation type="unfinished"/>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Import från %1 slutförd (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation type="unfinished"/>
+ <source>Imported from %1</source>
+ <translation>Importerad ifrån %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <translation>Export till %1 misslyckades (%2)</translation>
</message>
<message>
<source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <translation>Export till %1 slutförd (%2)</translation>
</message>
<message>
<source>Export to %1</source>
<translation>Exportera till %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
- <translation type="unfinished"/>
+ <translation>Sökväg till flerfaldig importkälla för %1 i %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <translation>Motstridiga sökvägar för exportmål %1 i %2</translation>
</message>
</context>
<context>
<name>TotpDialog</name>
<message>
<source>Timed Password</source>
- <translation>Tidsinställt Lösenord</translation>
+ <translation>Tidsbegränsat lösenord</translation>
</message>
<message>
<source>000000</source>
@@ -5247,7 +6844,7 @@ Tillgängliga kommandon:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>Löper ut om %n sekund(er)</numerusform><numerusform>Löper ut om &lt;b&gt;%n&lt;/b&gt; sekund(er)</numerusform></translation>
+ <translation><numerusform>Upphör att gälla om &lt;b&gt;%n&lt;/b&gt; sekund</numerusform><numerusform>Upphör att gälla om &lt;b&gt;%n&lt;/b&gt; sekunder</numerusform></translation>
</message>
</context>
<context>
@@ -5259,7 +6856,7 @@ Tillgängliga kommandon:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>OBS! Dessa TOTP-inställningar är anpassade och kanske inte fungerar med andra autentiserare.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
@@ -5277,16 +6874,12 @@ Tillgängliga kommandon:
<translation>Konfigurera TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Nyckel:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
- <translation>Standard RFC 6238 token inställningar</translation>
+ <translation>Standard RFC 6238 token-inställningar</translation>
</message>
<message>
<source>Steam token settings</source>
- <translation>Steam token inställningar</translation>
+ <translation>Steam token-inställningar</translation>
</message>
<message>
<source>Use custom settings</source>
@@ -5303,23 +6896,52 @@ Tillgängliga kommandon:
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>sek</translation>
+ <translation> sek</translation>
</message>
<message>
<source>Code size:</source>
<translation>Kodstorlek:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 siffror</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7 siffror</translation>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 siffror</translation>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritm</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5342,11 +6964,11 @@ Tillgängliga kommandon:
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation>Ett felinträffade vid inhämtning av information.</translation>
+ <translation>Ett fel inträffade vid inhämtning av uppdateringsinformation.</translation>
</message>
<message>
<source>Please try again later.</source>
- <translation>Vänligen försök igen senare.</translation>
+ <translation>Försök igen senare.</translation>
</message>
<message>
<source>Software Update</source>
@@ -5354,15 +6976,15 @@ Tillgängliga kommandon:
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation>En ny version av KeePassXC är tillgänglig!</translation>
+ <translation>En ny version av KeePassXC finns tillgänglig!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation>KeePassXC %1 är nu tillgänglig — du har %2.</translation>
+ <translation>KeePassXC %1 är nu tillgänglig — Du har %2.</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
- <translation>Ladda ner den nu på keepassxc.org</translation>
+ <translation>Ladda ner den på keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
@@ -5370,14 +6992,14 @@ Tillgängliga kommandon:
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation>KeePassXC %1 är för närvarande den nyaste tillgängliga version</translation>
+ <translation>KeePassXC %1 är för närvarande den nyaste tillgängliga versionen</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
- <translation>Påbörja att spara dina lösenord säkert i en KeePassXC databas</translation>
+ <translation>Börja spara dina lösenord säkert, i en KeePassXC-databas.</translation>
</message>
<message>
<source>Create new database</source>
@@ -5397,12 +7019,20 @@ Tillgängliga kommandon:
</message>
<message>
<source>Recent databases</source>
- <translation>Senast använda databaser</translation>
+ <translation>Tidigare databaser</translation>
</message>
<message>
<source>Welcome to KeePassXC %1</source>
<translation>Välkommen till KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5412,18 +7042,26 @@ Tillgängliga kommandon:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation type="unfinished"/>
+ <translation>YubiKey Challenge-Response</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;Om du äger en &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, kan du använda den för ytterligare säkerhet.&lt;/p&gt;&lt;p&gt;YubiKey kräver att en av dess platser programmeras som &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation type="unfinished"/>
+ <translation>Ingen YubiKey identifierad, tillse att den är ansluten.</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
+ <translation>Ingen YubiKey ansluten.</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
<translation type="unfinished"/>
</message>
</context>
diff --git a/share/translations/keepassx_th.ts b/share/translations/keepassx_th.ts
index eebea66af..1d9c44f45 100644
--- a/share/translations/keepassx_th.ts
+++ b/share/translations/keepassx_th.ts
@@ -11,11 +11,12 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
- <translation>รายงานจุดบกพร่องที่ &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
+ <translation>รายงานข้อผิดพลาดที่: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
- <translation>KeePassXC เผยแพร่ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของกนู (GNU GPL) รุ่น 2 หรือรุ่น 3 (คุณสามารถเลือกได้)</translation>
+ <translation>KeePassXC เผยแพร่ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของกนู (GNU GPL)
+รุ่น 2 หรือรุ่น 3 (คุณสามารถเลือกได้)</translation>
</message>
<message>
<source>Contributors</source>
@@ -27,19 +28,19 @@
</message>
<message>
<source>Debug Info</source>
- <translation>ข้อมูลการแก้จุดบกพร่อง</translation>
+ <translation>ข้อมูลดีบัก</translation>
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
- <translation>ใส่ข้อมูลดังต่อไปนี้ทุกครั้งที่คุณรายงานจุดบกพร่องของซอฟต์แวร์</translation>
+ <translation>ใส่ข้อมูลดังต่อไปนี้ทุกครั้งที่คุณรายงานข้อผิดปกติของซอฟต์แวร์:</translation>
</message>
<message>
<source>Copy to clipboard</source>
- <translation>คัดลอกไปยังคลิปบอร์ด</translation>
+ <translation>คัดลอกไปยังคลิปบอร์ด:</translation>
</message>
<message>
<source>Project Maintainers:</source>
- <translation>ผู้ดูแลโครงการ</translation>
+ <translation>ผู้บำรุงรักษาโครงการ:</translation>
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
@@ -61,7 +62,7 @@
<name>ApplicationSettingsWidget</name>
<message>
<source>Application Settings</source>
- <translation>การตั้งค่าโปรแกรม</translation>
+ <translation>การตั้งค่าแอป</translation>
</message>
<message>
<source>General</source>
@@ -69,7 +70,7 @@
</message>
<message>
<source>Security</source>
- <translation>ความปลอดภัย</translation>
+ <translation>ความมั่นคง</translation>
</message>
<message>
<source>Access error for config file %1</source>
@@ -95,6 +96,14 @@
<source>Follow style</source>
<translation>ปฏิบัติตามสไตล์</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,20 +120,8 @@
<translation>เริ่มต้นอินสแตนซ์เดี่ยวของ KeePassXC เท่านั้น</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>จดจำฐานข้อมูลล่าสุด</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>จดจำไฟล์สำคัญล่าสุดและความปลอดภัยของดองเกิล</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>โหลดฐานข้อมูลก่อนหน้าเมื่อเริ่มต้นระบบ</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
- <translation>ย่อหน้าต่างลงเล็กสุดตอนเริ่มโปรแกรม</translation>
+ <translation>ย่อหน้าต่างลงเล็กสุดตอนเริ่มแอป</translation>
</message>
<message>
<source>File Management</source>
@@ -132,7 +129,7 @@
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
- <translation>บันทึกไฟล์ฐานข้อมูลอย่างปลอดภัย ( อาจจะไม่ตรงกับ Dropbox และอื่น ๆ )</translation>
+ <translation>บันทึกไฟล์ฐานข้อมูลอย่างปลอดภัย (อาจจะไม่ตรงกับ Dropbox ฯลฯ)</translation>
</message>
<message>
<source>Backup database file before saving</source>
@@ -163,10 +160,6 @@
<translation>ใช้ไอคอนกลุ่มบนการสร้างรายการ</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>ย่อหน้าต่างขณะที่คัดลอกไปยังคลิปบอร์ด</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>ซ่อนแผงตัวอย่างแสดงรายการ</translation>
</message>
@@ -184,7 +177,7 @@
</message>
<message>
<source>Show a system tray icon</source>
- <translation>แสดงไอคอนของซิสเต็มเทรย์</translation>
+ <translation>แสดงไอคอนสำหรับ system tray</translation>
</message>
<message>
<source>Dark system tray icon</source>
@@ -195,28 +188,24 @@
<translation>ซ่อนหน้าต่างในซิสเต็มเทรย์เมื่อถูกย่อ</translation>
</message>
<message>
- <source>Language</source>
- <translation>ภาษา</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Auto-Type</translation>
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
- <translation>ใช้หัวข้อของรายการในการจับคู่หน้าต่างกับ Auto-Type สากล</translation>
+ <translation>ใช้หัวข้อเรื่องในการจับคู่หน้าต่างกับ Auto-Type ระดับโลก</translation>
</message>
<message>
<source>Use entry URL to match windows for global Auto-Type</source>
- <translation>ใช้ URL ของรายการในการจับคู่หน้าต่างกับ Auto-Type สากล</translation>
+ <translation>ใช้ URL ของรายการในการจับคู่หน้าต่างกับ Auto-Type ระดับโลก</translation>
</message>
<message>
<source>Always ask before performing Auto-Type</source>
- <translation>ถามก่อนเสมอเมื่อจะทำการ Auto-Type</translation>
+ <translation>ถามเสมอก่อนจะทำการ Auto-Type</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
- <translation>ทางลัดสำหรับ Auto-Type สากล</translation>
+ <translation>ทางลัดสำหรับ Auto-Type ระดับโลก</translation>
</message>
<message>
<source>Auto-Type typing delay</source>
@@ -225,34 +214,115 @@
<message>
<source> ms</source>
<comment>Milliseconds</comment>
- <translation>มิลลิวินาที</translation>
+ <translation>มิลลิวิ</translation>
</message>
<message>
<source>Auto-Type start delay</source>
<translation>การเริ่ม Auto-Type ล่าช้า</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>ตรวจสอบการอัปเดตตอนเริ่มแอปพลิเคชัน</translation>
+ <source>Movable toolbar</source>
+ <translation>แถบเครื่องมือที่เคลื่อนย้ายได้</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>รวมเวอร์ชันที่ยังไม่เผยแพร่ในการตรวจสอบการอัปเดต</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>แถบเครื่องมือที่เคลื่อนย้ายได้</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>สไตล์ปุ่ม</translation>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>วินาที</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
<message>
<source>Timeouts</source>
- <translation>หมดเวลา</translation>
+ <translation>การหยุดชั่วคราว</translation>
</message>
<message>
<source>Clear clipboard after</source>
@@ -261,11 +331,11 @@
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>วินาที</translation>
+ <translation>วิ</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
- <translation>ล็อคฐานข้อมูลหลังไม่มีการใช้งาน</translation>
+ <translation>ล็อกฐานข้อมูลหลังไม่มีการใช้งาน</translation>
</message>
<message>
<source> min</source>
@@ -273,7 +343,7 @@
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation>ไม่จำ TouchID หลังไม่มีการใช้งาน</translation>
+ <translation>ลืม TouchID หลังไม่มีการใช้งาน</translation>
</message>
<message>
<source>Convenience</source>
@@ -281,23 +351,23 @@
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
- <translation>ล็อคฐานข้อมูลเมื่อเซสชันถูกล็อคหรือฝาถูกปิด</translation>
+ <translation>ล็อคฐานข้อมูลเมื่อเซสชันถูกล็อคหรือฝาครอบถูกผิด</translation>
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>ไม่จำ TouchID เมื่อเซสชันถูกล็อคหรือฝาถูกปิด</translation>
+ <translation>ลืม TouchID เมื่อเซสชันถูกล็อคหรือฝาครอบถูกผิด</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
- <translation>ล็อคฐานข้อมูลหลังย่อหน้าต่างลง</translation>
+ <translation>ล็อกฐานข้อมูลหลังย่อหน้าต่างลงเล็กสุด</translation>
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>ล็อคฐานข้อมูลก่อนหน้าอีกครั้งหลังทำการ Auto-Type</translation>
+ <translation>ล็อคฐานข้อมูลที่เคยถูกล็อคมาก่อนอีกครั้งหลังทำการ Auto-Type</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>ไม่ต้องถามรหัสผ่านซ้ำถ้ามองเห็นรหัสผ่านอยู่แล้ว</translation>
+ <translation>ไม่ต้องถามรหัสผ่านซ้ำถ้ามองเห็นรหัสผ่านอยู่</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
@@ -305,7 +375,7 @@
</message>
<message>
<source>Don&apos;t use placeholder for empty password fields</source>
- <translation>ไม่ต้องแสดงข้อความตัวอย่างในช่องกรอกรหัสผ่าน</translation>
+ <translation>ไม่ต้องแสดงข้อความตัวอย่างในช่องรหัสผ่านที่ว่างเปล่า</translation>
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
@@ -320,8 +390,29 @@
<translation>ความเป็นส่วนตัว</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>ใช้ DuckDuckGo เป็นตัวแทนสำหรับดาวน์โหลดไอคอนเว็บไซต์</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>นาที</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -348,7 +439,7 @@
</message>
<message>
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
- <translation>คำสั่ง Auto-Type นี้กดแป้นพิมพ์ช้า ต้องการดำเนินการต่อหรือไม่</translation>
+ <translation>คำสั่ง Auto-Type นี้กดปุ่มช้า ต้องการดำเนินการต่อหรือไม่</translation>
</message>
<message>
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
@@ -390,6 +481,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>คัดลอกชื่อผู้ใช้ (&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>คัดลอกรหัสผ่าน</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +501,10 @@
<source>Select entry to Auto-Type:</source>
<translation>เลือกรายการเพื่อ Auto-Type</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>ค้นหา...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -421,8 +527,16 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
- <translation>%1 ต้องการเข้าถึงรหัสผ่านของไอเทมต่อไปนี้
-กรุณาเลือกว่าคุณจะอนุญาตหรือไม่</translation>
+ <translation>%1 ต้องการเข้าถึงรหัสผ่านของไอเทมต่อไปนี้
+กรุณาเลือกว่าคุณจะอนุญาติหรือไม่</translation>
+ </message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -442,22 +556,18 @@ Please select whether you want to allow access.</source>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
- <translation>คุณเปิดหลายฐานข้อมูล กรุณาเลือกฐานข้อมูลที่ถูกต้องเพื่อบันทึกข้อมูลของคุณ</translation>
+ <translation>คุณเปิดหลายฐานข้อมูล กรุณาเลือกฐานข้อมูลที่ถูกต้องเพื่อบันทึกข้อมูลประจำตัวเพื่ิอเข้าระบบ</translation>
</message>
</context>
<context>
<name>BrowserOptionDialog</name>
<message>
<source>Dialog</source>
- <translation>หน้าต่าง</translation>
+ <translation>กล่องโต้ตอบ</translation>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>สิ่งนี้จำเป็นเพื่อการเข้าถึงฐานข้อมูลผ่านเบราว์เซอร์ KeePassXC</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>เปิดใช้ KeepassXC ร่วมกับเบราว์เซอร์</translation>
+ <translation>การเข้าถึงฐานข้อมูลของคุณจำเป็นต้องเข้าผ่านเบราว์เซอร์ KeePassXC</translation>
</message>
<message>
<source>General</source>
@@ -465,7 +575,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Enable integration for these browsers:</source>
- <translation>เปิดการใช้เบราว์เซอร์เหล่านี้ร่วมกับ</translation>
+ <translation>เปิดใช้การผสานกับเบราว์เซอร์เหล่านี้:</translation>
</message>
<message>
<source>&amp;Google Chrome</source>
@@ -494,7 +604,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>ข้อมูลรูปแบบเดียวกันเท่านั้น (http://, https://, ...) จะถูกส่งคืน</translation>
+ <translation>ข้อมูลรูปแบบเดียวกัันเท่านั้น (http://, https://, ...) จะถูกส่งคืน</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
@@ -502,7 +612,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>ส่งคืนรายการเฉพาะที่ตรงกับ URL มากที่สุด แทนที่จะส่งคืนรายการทั้งหมดของทั้งโดเมน</translation>
+ <translation>ย้อนกลับเฉพาะเมื่อ URL นั้น ๆ ตรงกันมากที่สุด ไม่ใช่เมืื่อมีข้อมูลทั้งหมดสำหรับโดเมน</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
@@ -525,16 +635,12 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>ไม่เคยและถามก่อนการเข้าถึงเอกสารที่ผ่านการรับรอง</translation>
+ <translation>ไม่เคย &amp; ถามก่อนการเข้าถึงเอกสารรับรอง</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>อย่าถามก่อนและระหว่างการอัปโหลดเอกสารที่ผ่านการรับรอง</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>ฐานข้อมูลที่ถูกเลือกเท่านั้นที่เชื่อมกับผู้รับบริการ</translation>
+ <translation>ไม่เคย &amp; ถามก่อนการอัปโหลดเอกสารรับรอง</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
@@ -551,11 +657,11 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation>ปรับปรุงข้อมูล KeePassXC หรือเส้นทางของไบนารี keepassxc-proxy โดยอัตโนมัติไปยังการส่งข้อความฉบับดั้งเดิมเมื่อเริ่มต้น</translation>
+ <translation>ปรับปรุงข้อมูล KeePassXC หรือคู่ keepassxc-proxy ให้ทันสมัยโดยอัตโนมัติไปยังการส่งข้อความฉบับดั้งเดิมเมื่อเริ่มต้น</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>ปรับปรุงข้อมูลไฟล์รายการให้ทันสมัยเมื่อเริ่มต้น</translation>
+ <translation>ปรับปรุงข้อมูลให้ทันสมัยและ ข้อความฉบับดั้งเดิมให้ปรากฏเมื่อเริ่มต้น</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -567,7 +673,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Use a custom proxy location if you installed a proxy manually.</source>
- <translation>ใช้พร็อกซีแบบกำหนดเอง ในกรณีที่คุณติดตั้งพร็อกซีด้วยตนเอง</translation>
+ <translation>ใช้สนับสนุน proxy application หากคุณติดตั้งพรอกซีด้วยตนเอง</translation>
</message>
<message>
<source>Use a &amp;custom proxy location</source>
@@ -577,11 +683,11 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>ดู</translation>
+ <translation>ดู...</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
- <translation>&lt;b&gt; คำเตือน &lt;/b&gt; ตัวเลือกต่อไปนี้อาจจะอันตราย</translation>
+ <translation>&lt;b&gt;คำเตือน:&lt;/b&gt; ตัวเลือกดังต่อไปนี้อาจจะอันตราย!</translation>
</message>
<message>
<source>Select custom proxy location</source>
@@ -592,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>&amp;Tor Browser</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;คำเตือน&lt;/b&gt; ไม่พบ keepassxc-proxy application &lt;br /&gt;กรุณาตรวจสอบการลงข้อมูลไดเรคทอรี KeePassXC หรือยืนยันตัวเลือกขั้นสูงที่คุณกำหนดเอง &lt;br /&gt;การรวมเบราว์เซอร์จะไม่ทำงานถ้าไม่มีพร๊อกซี application &lt;br /&gt;เส้นทางที่คาดหวัง</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>ไฟล์ปฏิบัติการ</translation>
</message>
@@ -606,11 +708,11 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation>ไ่ม่ถามเพื่อขออนุญาติสำหรับ HTTP และ Basic Auth</translation>
+ <translation>ไ่ม่ถามเพื่อขออนุญาติสำหรับ HTTP และBasic Auth</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation>เนื่องจาก Snap sandbox คุณต้องเรียกใช้สคริปต์เพื่อเปิดใช้งานการรวมเบราว์เซอร์ &lt;br /&gt; คุณสามารถรับสคริปต์นี้จาก %1</translation>
+ <translation>เนื่องจาก Snap sandbox คุณต้องเรียกใช้สคริปต์เพื่อเปิดใช้งานการรวมเบราว์เซอ.&lt;br /&gt;คุณสามารถรับสคริปต์นี้จาก% 1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
@@ -618,14 +720,58 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
- <translation>KeePassXC-Browser เป็นสิ่งจำเป็นสำหรับการทำงานร่วมกับเบราว์เซอร์ &lt;br /&gt; Download มันสำหรับ %1 และ %2. %3 </translation>
+ <translation>KeePassXC-Browser เป็นสิ่งจำเป็นสำหรับการทำงานร่วมกับเบราว์เซอร์ &lt;br /&gt;Download มันสำหรับ %1 และ %2. %3 </translation>
+ </message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>BrowserService</name>
<message>
<source>KeePassXC: New key association request</source>
- <translation>KeePassXC คำขอกุญแจที่เชื่อมโยงใหม่</translation>
+ <translation>KeePassXC: คำขอกุญแจที่เชื่อมโยงใหม่</translation>
</message>
<message>
<source>You have received an association request for the above key.
@@ -634,8 +780,8 @@ If you would like to allow it access to your KeePassXC database,
give it a unique name to identify and accept it.</source>
<translation>คุณได้รับคำร้องขอที่เกี่ยวข้องสำหรับกุญแจด้านบน
-ถ้าคุณต้องการอนุญาตมันให้เข้าถึงฐานข้อมูล KeePassXC database
-โปรดให้ชื่อเฉพาะเพื่อยืนยันตัวตนและตอบรับมัน</translation>
+ถ้าคุณต้องการอนุญาติมันให้เข้าถึงฐานข้อมูล KeePassXC database,
+โปรดให้ชื่อเฉพาะเพื่อยืนยันตัวตนและตอบรับมัน.</translation>
</message>
<message>
<source>Save and allow access</source>
@@ -643,21 +789,21 @@ give it a unique name to identify and accept it.</source>
</message>
<message>
<source>KeePassXC: Overwrite existing key?</source>
- <translation>KeePassXC เขียนทับกุญแจที่มีอยู่เดิม</translation>
+ <translation>KeePassXC: เขียนทับกุญแจที่มีอยู่เดิม?</translation>
</message>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
Do you want to overwrite it?</source>
- <translation>กุญแจถอดรหัสลับที่ถูกแบ่งปันด้วยชื่อ &quot;%1&quot; มีอยู่ก่อนแล้ว
-คุณต้องการจะเขียนทับมันหรือไม่</translation>
+ <translation>กุญแจถอดรหัสลับที่ถูกแบ่งปันด้วยชื่อ &quot;%1&quot; already exists.
+เธอต้องการจะเขียนทับมันหรือไม่?</translation>
</message>
<message>
<source>KeePassXC: Update Entry</source>
- <translation>KeePassXC ปรับปรุงรายการ</translation>
+ <translation>KeePassXC: ปรับปรุงรายการ</translation>
</message>
<message>
<source>Do you want to update the information in %1 - %2?</source>
- <translation>เธอต้องการจะปรับปรุงข้อมูลให้ทันสมัยใน %1 - %2 หรือไม่</translation>
+ <translation>เธอต้องการจะปรับปรุงข้อมูลให้ทันสมัยใน %1 - %2 หรือไม่?</translation>
</message>
<message>
<source>Abort</source>
@@ -674,16 +820,16 @@ Do you want to overwrite it?</source>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation>แปลงคุณสมบัติจากรายการ %1 สำเร็จ
-ย้าย %2 กุญแจไปยังข้อมูลที่กำหนดเอง</translation>
+ <translation>แปลงคุณลักษณะจากรายการ% 1 สำเร็จ
+ย้าย % 2 กุญแจไปยังข้อมูลที่กำหนดเอง</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation><numerusform>ย้ายกุญแจ %n ไปยังข้อมูลที่กำหนดเองได้สำเร็จ</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation>KeePassXC ไม่พบรายการที่มีคุณสมบัติ KeePassHTTP</translation>
+ <translation>KeePassXC: ไม่พบรายการที่มีคุณสมบัติ KeePassHTTP!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
@@ -691,11 +837,11 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation>KeePassXC ตรวจพบการตั้งค่าการรวมเบราว์เซอร์ดั้งเดิม</translation>
+ <translation>KeePassXC: ตรวจพบการตั้งค่าการรวมเบราว์เซอร์ดั้งเดิม</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation>KeePassXC สร้างกลุ่มใหม่</translation>
+ <translation>KeePassXC: สร้างกลุ่มใหม่</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
@@ -711,6 +857,10 @@ This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation>การตั้งค่าเบราว์เซอร์ KeePassXC ของคุณต้องถูกย้ายไปสู่การตั้งค่าฐานข้อมูล นี่จำเป็นต่อการรักษาการเชื่อมต่อเบราว์เซอร์ปัจจุบันของคุณ คุณต้องการย้ายการตั้งค่าที่มีอยู่แล้วตอนนี้หรือไม่</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>ไม่ต้องแสดงคำเตือนนี้อีก</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -720,11 +870,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
- <translation>เติม &apos;- Clone&apos; ต่อท้ายชื่อ</translation>
+ <translation>เติม &apos;- โคลน&apos; ต่อท้ายชื่อ</translation>
</message>
<message>
<source>Replace username and password with references</source>
- <translation>แทนที่ชื่อผู้ใช้และรหัสผ่านด้วยข้อมูลอ้างอิง</translation>
+ <translation>แทนที่ชื่อผู้ใช้และรหัสผ่านด้วยการอ้างอิง</translation>
</message>
<message>
<source>Copy history</source>
@@ -739,7 +889,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>filename</source>
- <translation>ชื่อไฟล์</translation>
+ <translation>ชื่อแฟ้ม</translation>
</message>
<message>
<source>size, rows, columns</source>
@@ -770,10 +920,6 @@ Would you like to migrate your existing settings now?</source>
<translation>เรคคอร์ดแรกมีชื่อฟิลด์</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>จำนวนบรรทัดส่วนหัวที่จะไม่สนใจ</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>ให้นับ &apos;\&apos; เป็น escape character</translation>
</message>
@@ -783,7 +929,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Column layout</source>
- <translation>เค้าโครงหลัก</translation>
+ <translation>เค้าโครงคอลัมน์</translation>
</message>
<message>
<source>Not present in CSV file</source>
@@ -791,11 +937,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Imported from CSV file</source>
- <translation>นำเข้าจากไฟล์ CSV แล้ว</translation>
+ <translation>นำเข้าจากแฟ้ม CSV แล้ว</translation>
</message>
<message>
<source>Original data: </source>
- <translation>ข้อมูลต้นฉบับ</translation>
+ <translation>ข้อมูลต้นฉบับ:</translation>
</message>
<message>
<source>Error</source>
@@ -807,7 +953,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>column %1</source>
- <translation>หลัก %1</translation>
+ <translation>คอลัมน์ %1</translation>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
@@ -815,19 +961,35 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n ข้ามข้อความอื่นๆ]</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
- <translation>นำเข้า CSV ผู้เขียนมีข้อผิดพลาด %1</translation>
+ <translation>นำเข้า CSV: ผู้เขียนมีข้อผิดพลาด: %1</translation>
+ </message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n คอลัมน์</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
@@ -836,11 +998,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n ไบท์</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n แถว</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -863,10 +1025,6 @@ Would you like to migrate your existing settings now?</source>
<translation>เกิดข้อผิดพลาดระหว่างอ่านฐานข้อมูล %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>ฐานข้อมูลไม่มีชื่อไฟล์ ไม่สามารถบันทึกได้</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>ไม่สามารถเขียนไฟล์ได้เนื่องจากถูกเปิดอยู่ในโหมดอ่านเท่านั้น</translation>
</message>
@@ -874,6 +1032,27 @@ Would you like to migrate your existing settings now?</source>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>กุญแจไม่ถูกเปลี่ยนแปลง นี่คือจุดบกพร่อง กรุณารายงานไปที่นักพัฒนา</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>ถังขยะ</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -885,32 +1064,16 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>ใส่กุญแจมาสเตอร์</translation>
- </message>
- <message>
<source>Key File:</source>
- <translation>ไฟล์กุญแจคือ</translation>
- </message>
- <message>
- <source>Password:</source>
- <translation>รหัสผ่านคือ</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>เรียกดู</translation>
+ <translation>แฟ้มกุญแจ:</translation>
</message>
<message>
<source>Refresh</source>
- <translation>รีเฟรช</translation>
- </message>
- <message>
- <source>Challenge Response:</source>
- <translation>การตอบกลับของการตรวจสอบ คือ </translation>
+ <translation>เรียกใหม่</translation>
</message>
<message>
<source>Legacy key file format</source>
- <translation>รูปแบบไฟล์กุญแจแบบดั้งเดิม</translation>
+ <translation>นามสกุลไฟล์แบบดั้งเดิมของแฟ้มกุญแจ</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
@@ -927,31 +1090,107 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>All files</source>
- <translation>ทุกไฟล์</translation>
+ <translation>ทุกแฟ้ม</translation>
</message>
<message>
<source>Key files</source>
- <translation>ไฟล์กุญแจ</translation>
+ <translation>แฟ้มกุญแจ</translation>
</message>
<message>
<source>Select key file</source>
- <translation>เลือกไฟล์กุญแจ</translation>
+ <translation>เลือกแฟ้มกุญแจ</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID สำหรับการปลดล็อคแบบเร็ว</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>ไม่สามารถเปิดฐานข้อมูลได้
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>ไม่สามารถเปิดไฟล์กุญแจได้
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>เรียกดู...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>ล้าง</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -973,7 +1212,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Security</source>
- <translation>การรักษาความปลอดภัย</translation>
+ <translation>ความมั่นคง</translation>
</message>
<message>
<source>Master Key</source>
@@ -981,7 +1220,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Encryption Settings</source>
- <translation>การตั้งค่าการเข้ารหัสลับ</translation>
+ <translation>การตั้งค่าการเข้ารหัส</translation>
</message>
<message>
<source>Browser Integration</source>
@@ -996,7 +1235,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>&amp;Disconnect all browsers</source>
- <translation>&amp;หยุดการเชื่อมต่อกับทุกเบราว์เซอร์</translation>
+ <translation>หยุดการเชื่อมต่อกับทุกเบราว์เซอร์ (&amp;D)</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
@@ -1012,7 +1251,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Remove</source>
- <translation>ลบ</translation>
+ <translation>นำออก</translation>
</message>
<message>
<source>Delete the selected key?</source>
@@ -1034,11 +1273,11 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>Enable Browser Integration to access these settings.</source>
- <translation>เปิดการใช้ Browser Integration เพื่อเข้าถึงการตั้งค่านี้</translation>
+ <translation>เปิด Browser Integration เพื่อเข้าถึงการตั้งค่านี้</translation>
</message>
<message>
<source>Disconnect all browsers</source>
- <translation>หยุดการเชื่อมต่อกับทุกเบราว์เซอร์</translation>
+ <translation>ตัดการเชื่อมต่อกับทุกเบราว์เซอร์</translation>
</message>
<message>
<source>Do you really want to disconnect all browsers?
@@ -1060,11 +1299,11 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>ลบ %n กุญแจเข้ารหัสลับจากการตั้งค่า KeePassXC สำเร็จ</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation>ไม่จำการตั้งค่าเฉพาะสำหรับทุกไซต์บนรายการ</translation>
+ <translation>ไม่จำการตั้งค่าเฉพาะไซต์บนรายการ</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
@@ -1074,23 +1313,23 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>Removing stored permissions…</source>
- <translation>กำลังลบการอนุญาตที่บันทึกออก</translation>
+ <translation>ลบการอนุญาติที่เก็บไว้ออก</translation>
</message>
<message>
<source>Abort</source>
- <translation> ยกเลิกการทำงาน</translation>
+ <translation>หยุด</translation>
</message>
<message>
<source>KeePassXC: Removed permissions</source>
- <translation>KeePassXC: การอนุญาตถูกลบออก</translation>
+ <translation>KeePassXC: การอนุญาตถูกนำออก</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>ลบการอนุญาตจากรายการ %n</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
- <translation>KeePassXC: ไม่มีรายการที่ได้รับอนุญาต</translation>
+ <translation>KeePassXC: ไม่มีรายการที่ได้รับอนุญาติ</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
@@ -1103,7 +1342,15 @@ Permissions to access entries will be revoked.</source>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
- <translation>คุณต้องการที่จะย้ายข้อมูลผสานในเบราว์เซอร์แบบเดิมไปยังมาตรฐานล่าสุดจริงหรือ นี่เป็นสิ่งที่จำเป็นในการรักษาความเข้ากับโปรแกรเสริมของเบราว์เซอร์</translation>
+ <translation>คุณต้องการทีีจะย้ายข้อมูลผสานในเบราว์เซอร์แบบตั้งเดิมไปยังมาตรฐานล่าสุดจริง ๆ หรอ นี่เป็นสิ่งจำเป็นในการรักษาความเข้ากับโปรแกรเสริมของเบราว์เซอร์</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1114,7 +1361,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>AES: 256 Bit (default)</source>
- <translation>AES: 256 บิต (ค่าเริ่มต้น)</translation>
+ <translation>AES: 256 บิต (ค่าปริยาย)</translation>
</message>
<message>
<source>Twofish: 256 Bit</source>
@@ -1126,7 +1373,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Transform rounds:</source>
- <translation>รอบเปลี่ยนรูป</translation>
+ <translation>รอบเปลี่ยนรูป:</translation>
</message>
<message>
<source>Benchmark 1-second delay</source>
@@ -1134,7 +1381,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Memory Usage:</source>
- <translation>การใช้หน่วยความจำ</translation>
+ <translation>ปริมาณความจำที่ใช้</translation>
</message>
<message>
<source>Parallelism:</source>
@@ -1174,11 +1421,13 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
- <translation>KDBX 4.0 (แนะนำ)</translation>
+ <translation>KDBX 4.0 (แนะนำ)
+</translation>
</message>
<message>
<source>KDBX 3.1</source>
- <translation>KDBX 3.1</translation>
+ <translation>KDBX 3.1
+</translation>
</message>
<message>
<source>unchanged</source>
@@ -1188,7 +1437,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<message>
<source>Number of rounds too high</source>
<comment>Key transformation rounds</comment>
- <translation>จำนวนรอบยาวเกินไป</translation>
+ <translation>จำนวนรอบมากเกินไป</translation>
</message>
<message>
<source>You are using a very high number of key transform rounds with Argon2.
@@ -1215,7 +1464,7 @@ If you keep this number, your database may take hours or days (or even longer) t
If you keep this number, your database may be too easy to crack!</source>
<translation>คุณกำลังใช้จำนวนของรอบการแปลงกุญแจกับ AES-KDF ต่ำ
-ถ้าคุณใช้จำนวนนี้ ฐานข้อมูลของคุณอาจจะถูกถอดได้อย่างง่าย</translation>
+ถ้าคุณใช้จำนวนนี้ ฐานข้อมูลของคุณอาจจะถูกถอดได้ง่าย</translation>
</message>
<message>
<source>KDF unchanged</source>
@@ -1228,12 +1477,12 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform> MiB</numerusform></translation>
+ <translation><numerusform>MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>thread(s)</numerusform></translation>
+ <translation><numerusform>thread</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1245,6 +1494,57 @@ If you keep this number, your database may be too easy to crack!</source>
<comment>seconds</comment>
<translation><numerusform>%1 วินาที</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
@@ -1254,15 +1554,15 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Database name:</source>
- <translation>ชื่อฐานข้อมูล</translation>
+ <translation>ชื่อฐานข้อมูล:</translation>
</message>
<message>
<source>Database description:</source>
- <translation>รายละเอียดฐานข้อมูล</translation>
+ <translation>รายละเอียดฐานข้อมูล:</translation>
</message>
<message>
<source>Default username:</source>
- <translation>ค่าเริ่มต้นของชื่อผู้ใช้</translation>
+ <translation>ชื่อผู้ใช้มาตรฐาน:</translation>
</message>
<message>
<source>History Settings</source>
@@ -1270,15 +1570,15 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Max. history items:</source>
- <translation>จำนวนมากสุดของรายการประวัติ</translation>
+ <translation>จำนวนมากสุดของรายการประวัติ:</translation>
</message>
<message>
<source>Max. history size:</source>
- <translation>ขนาดมากสุดของรายการประวัติ</translation>
+ <translation>ขนาดมากสุดของรายการประวัติ:</translation>
</message>
<message>
<source> MiB</source>
- <translation>MiB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1292,6 +1592,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>การเปิดใช้งานและการบีบอัด (แนะนำ)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1359,16 +1692,143 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>การเปลี่ยนแปลงกุญแจหลักล้มเหลว</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
<message>
<source>Database Name:</source>
- <translation>ชื่อฐานข้อมูล</translation>
+ <translation>ชื่อฐานข้อมูล:</translation>
</message>
<message>
<source>Description:</source>
- <translation>รายละเอียด</translation>
+ <translation>รายละเอียด:</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ชื่อ</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>ค่า</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1379,7 +1839,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>All files</source>
- <translation>ทุกไฟล์</translation>
+ <translation>ทุกแฟ้ม</translation>
</message>
<message>
<source>Open database</source>
@@ -1387,7 +1847,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>CSV file</source>
- <translation>ไฟล์ CSV</translation>
+ <translation>แฟ้ม CSV</translation>
</message>
<message>
<source>Merge database</source>
@@ -1403,11 +1863,11 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Export database to CSV file</source>
- <translation>ส่งออกฐานข้อมูลเป็นไฟล์ CSV</translation>
+ <translation>ส่งออกฐานข้อมูลเป็นแฟ้ม CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
- <translation>การเขียนไฟล์ CSV ล้มเหลว</translation>
+ <translation>การเขียนแฟ้ม CSV ล้มเหลว</translation>
</message>
<message>
<source>Database creation error</source>
@@ -1420,10 +1880,6 @@ This is definitely a bug, please report it to the developers.</source>
สิ่งนี้มีจุดบกพร่องแน่นอนโปรดรายงานต่อนักพัฒนาเวป</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>ไม่พบไฟล์ฐานข้อมูล หรือไม่สามารถเข้าถึงได้</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>เลือกไฟล์ CSV</translation>
</message>
@@ -1434,28 +1890,52 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>%1 [New Database]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [ฐานข้อมูลใหม่]</translation>
+ <translation>%1 [New Database]</translation>
</message>
<message>
<source>%1 [Locked]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [ถูกล็อก]</translation>
+ <translation>%1 [Locked]</translation>
</message>
<message>
<source>%1 [Read-only]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [อ่านอย่างเดียว]</translation>
+ <translation>%1 [Read-only]</translation>
+ </message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Searching...</source>
- <translation>กำลังค้นหา</translation>
+ <translation>ค้นหา...</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
- <translation>คุณต้องการจะลบรายการ &quot;%1&quot; ให้หายไปอย่างถาวรจริงหรือไม่</translation>
+ <translation>คุณต้องการจะลบรายการ &quot;%1&quot; ให้หายไปตลอดกาลจริงๆ?</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
@@ -1463,7 +1943,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>คุณต้องการจะลบ %n รายการไปยังถังขยะจริงหรือไม่</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1475,23 +1955,23 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Remember my choice</source>
- <translation>จำสิ่งที่ฉันเลือก</translation>
+ <translation>จำที่ฉันเลือก</translation>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation>คุณต้องการจะลบกลุ่ม &quot;%1&quot; ให้หายไปอย่างถาวรจริงหรือไม่</translation>
+ <translation>คุณต้องการจะลบกลุ่ม &quot;%1&quot; ไปตลอดกาลจริงหรือ?</translation>
</message>
<message>
<source>No current database.</source>
- <translation>ไม่มีฐานข้อมูลปัจจุบัน</translation>
+ <translation>ไม่มีฐานข้อมูลขณะนี้</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
- <translation>ไม่มีฐานข้อมูลต้นทาง ไม่ต้องทำอะไร</translation>
+ <translation>ไม่มีฐานข้อมูลต้นทาง ไม่มีงานให้ทำ</translation>
</message>
<message>
<source>Search Results (%1)</source>
- <translation>ผลการค้นหา (%1)</translation>
+ <translation>ผลลัพธ์การค้นหา (%1)</translation>
</message>
<message>
<source>No Results</source>
@@ -1499,7 +1979,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>File has changed</source>
- <translation>ไฟล์เปลี่ยนไปแล้ว</translation>
+ <translation>ไฟล์เปลี่ยนแปลงไปแล้ว</translation>
</message>
<message>
<source>The database file has changed. Do you want to load the changes?</source>
@@ -1507,7 +1987,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Merge Request</source>
- <translation>คำร้องเพื่อผสาน</translation>
+ <translation>ผสานคำร้อง</translation>
</message>
<message>
<source>The database file has changed and you have unsaved changes.
@@ -1517,7 +1997,7 @@ Do you want to merge your changes?</source>
</message>
<message>
<source>Empty recycle bin?</source>
- <translation>ล้างถังขยะหรือไม่</translation>
+ <translation>ล้างถังขยะ</translation>
</message>
<message>
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
@@ -1525,19 +2005,15 @@ Do you want to merge your changes?</source>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>คุณต้องการจะลบ %n รายการอย่างถาวรหรือไม่</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>ลบรายการหรือไม่</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>ย้ายรายการไปยังถังขยะหรือไม่</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>ไฟล์เปิดแล้วอยู่ในโหมดอ่านอย่างเดียว</translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1545,13 +2021,13 @@ Do you want to merge your changes?</source>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation>กำลังอยู่ในระหว่างแก้ไขรายการ คุณต้องการจะยกเลิกการแก้ไขและล็อคตอนนี้จริงหรือไม่</translation>
+ <translation>กำลังอยู่ในระหว่างแก้ไขรายการ คุณต้องการจะยกเลิกและล็อคตอนนี้จริงหรือไม่</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
- <translation>&quot;%1&quot; ถูกแก้ไขแล้ว
-บันทึกการเปลี่ยนแปลงหรือไม่</translation>
+ <translation>&quot;%1&quot; ถูกแก้ไข
+บันทึกการเปลี่ยนแปลง?</translation>
</message>
<message>
<source>Database was modified.
@@ -1561,7 +2037,7 @@ Save changes?</source>
</message>
<message>
<source>Save changes?</source>
- <translation>บันทึกการเปลี่ยนแปลง?</translation>
+ <translation>บันทึกความเปลี่ยนแปลง?</translation>
</message>
<message>
<source>Could not open the new database file while attempting to autoreload.
@@ -1576,16 +2052,10 @@ Error: %1</source>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
- <translation>KeePassXC ไม่สามารถบันทึกฐานข้อมูลแล้วหลายครั้ง สิ่งนี้อาจทำให้บริการเชื่อมโยงไฟล์ล็อคไฟล์ที่ถูกบันทึกไว้แล้ว
+ <translation>KeePassXC ไม่สามารถบันทึกฐานข้อมูลแล้วหลายครั้ง สิ่งนี้อาจทำให้บริการเชื่อมโยงไฟล์ล็อคไฟล์ที่ถูกบัยทึกไว้แล้ว
ปิดการบันทึกแบบปลอดภัยและลองอีกครั้งหรือไม่</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>การเขียนฐานข้อมูลล้มเหลว
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>รหัสผ่าน</translation>
</message>
@@ -1599,11 +2069,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Replace references to entry?</source>
- <translation>เปลี่ยนแหล่งอ้างอิงของรายการหรือไม่</translation>
+ <translation>แทนที่การอ้างอิงของรายการหรือไม่</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>รายการ &quot;%1&quot; มี %2 แหล่งอ้างอิง คุณต้องการจะเขียนทับแหล่งอ้างอิงด้วยค่า หรือข้ามรายการนี้ หรือต้องการลบหรือไม่</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1615,7 +2085,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation>คุณต้องการย้ายกลุ่ม &quot;%1&quot; ไปถังขยะจริงหรือไม่</translation>
+ <translation>คุณต้องการย้ายกลุ่ม &quot;%1&quot;  ไปถังขยะจริงหรือไม่</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
@@ -1629,6 +2099,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation>กลุ่มที่ใช้ร่วมกัน</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>เขียนฐานข้อมูลล้มเหลว %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1662,7 +2140,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>n/a</source>
- <translation>n/a</translation>
+ <translation>ไม่มีข้อมูล</translation>
</message>
<message>
<source>(encrypted)</source>
@@ -1674,11 +2152,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>File too large to be a private key</source>
- <translation>ไฟล์ใหญ่เกินกว่าจะเป็นกุญแจส่วนตัว</translation>
+ <translation>แฟ้มใหญ่เกินกว่าจะเป็นกุญแจส่วนตัว</translation>
</message>
<message>
<source>Failed to open private key</source>
- <translation>ล้มเหลวระหว่างการเปิดกุญแจส่วนตัว</translation>
+ <translation>ผิดพลาดระหว่างการเปิดกุญแจส่วนตัว</translation>
</message>
<message>
<source>Entry history</source>
@@ -1710,11 +2188,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n สัปดาห์</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n เดือน</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1742,12 +2220,24 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n ปี</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>ยืนยันการนำออก</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>การทำงานร่วมกับเบราว์เซอร์</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1787,6 +2277,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>สีพื้นหลัง</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1816,12 +2342,83 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Window title:</source>
- <translation>หัวเรื่องของหน้าต่าง</translation>
+ <translation>หัวเรื่องของหน้าต่าง:</translation>
</message>
<message>
<source>Use a specific sequence for this association:</source>
<translation>ใช้ลำดับเฉพาะในการเชื่อมโยง</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>ทั่วไป</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>เพิ่ม</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>ลบ</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1841,6 +2438,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>ลบทั้งหมด</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1850,15 +2467,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Password:</source>
- <translation>รหัสผ่าน</translation>
+ <translation>รหัสผ่าน:</translation>
</message>
<message>
<source>Repeat:</source>
- <translation>ทำซ้ำ</translation>
+ <translation>ทำซ้ำ:</translation>
</message>
<message>
<source>Title:</source>
- <translation>หัวเรื่อง</translation>
+ <translation>หัวเรื่อง:</translation>
</message>
<message>
<source>Notes</source>
@@ -1874,12 +2491,68 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Username:</source>
- <translation>ชื่อผู้ใช้งาน</translation>
+ <translation>ชื่อผู้ใช้:</translation>
</message>
<message>
<source>Expires</source>
<translation>หมดอายุ</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1889,7 +2562,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Remove key from agent after</source>
- <translation>ลบกุญแจออกจากตัวแทน</translation>
+ <translation>ลบกุญแจออกหลังจาก agent</translation>
</message>
<message>
<source> seconds</source>
@@ -1901,7 +2574,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
- <translation>ลบกุญแจออกจากตัวแทน เมือฐานข้อมูลถูกปิดหรือล๊อค</translation>
+ <translation>ลบกุญแจออกจาก agent เมือฐานข้อมูลถูกปิดหรือล๊อค</translation>
</message>
<message>
<source>Public key</source>
@@ -1909,11 +2582,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation>เพิ่มกุญแจไปยังตัวยแทน เมื่อฐานข้อมูลถูกเปิดออกหรือถูกปลดล๊อด</translation>
+ <translation>เพิ่มกุญแจไปยังAgent เมื่อฐานข้อมูลถูกเปิดออกหรือถูกปลดล๊อด</translation>
</message>
<message>
<source>Comment</source>
- <translation>ข้อคิดเห็น</translation>
+ <translation>ความเห็น</translation>
</message>
<message>
<source>Decrypt</source>
@@ -1925,7 +2598,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Copy to clipboard</source>
- <translation>คัดลอกไปยังคลิปบอร์ด</translation>
+ <translation>คัดลอกไปยังคลิปบอร์ด:</translation>
</message>
<message>
<source>Private key</source>
@@ -1938,7 +2611,7 @@ Disable safe saves and try again?</source>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>เรียกดู...</translation>
+ <translation>ดู...</translation>
</message>
<message>
<source>Attachment</source>
@@ -1956,6 +2629,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>จำเป็นต้องยืนยันผู้ใช้เมื่อมีการใช้กุญแจ</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1989,7 +2678,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Inherit from parent group (%1)</source>
- <translation>รับช่วงจากกลุ่มหลัก (%1)</translation>
+ <translation>รับช่วงจากกลุ่มหลัก</translation>
+ </message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>รายการมีการเปลี่ยนแปลงที่ไม่ถูกบันทึก</translation>
</message>
</context>
<context>
@@ -2012,75 +2705,105 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Password:</source>
- <translation>รหัสผ่าน</translation>
+ <translation>รหัสผ่าน:</translation>
</message>
<message>
<source>Inactive</source>
<translation>ไม่มีการใช้งาน</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>นำเข้าจากพาท</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>ที่จัดเก็บที่ไม่ได้เซ็นไว้KeeShare</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>นำออกจากพาท</translation>
+ <source>KeeShare signed container</source>
+ <translation>ที่จัดเก็บที่เซ็นไว้ของKeeShare</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>เชื่อมต่อกับพาท</translation>
+ <source>Select import source</source>
+ <translation>เลือกนำเข้าฐานข้อมูล</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>รุ่น KeePassXC ของคุณไม่รับรองประเภทของตัวจัดเก็บที่แบ่งปันไว้ กรุณาใช้ %1</translation>
+ <source>Select export target</source>
+ <translation>เลือกเป้าหมายที่นำออก</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>ปิดการใช้งานการแบ่งปันฐานข้อมูล</translation>
+ <source>Select import/export file</source>
+ <translation>เลือกแฟ้มนำเข้า/นำออก</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>ปิดการใช้งานการนำฐานข้อมูลออก</translation>
+ <source>Clear</source>
+ <translation>ล้าง</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>ปิดการใช้งานการนำฐานข้อมูลเข้า</translation>
+ <source>Import</source>
+ <translation>นำเข้า</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>ที่จัดเก็บที่ไม่ได้เซ็นไว้ของKeeShare</translation>
+ <source>Export</source>
+ <translation>นำออก</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>ที่จัดเก็บที่เซ็นไว้ของKeeShare</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>เลือกนำฐานข้อมูลที่นำเข้า</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>เลือกเป้าหมายที่นำออก</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>เลือกแฟ้มนำเข้า/นำออก</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>ล้าง</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>อ้างอิงการส่งออกที่จัดเก็บ %1แล้ว</translation>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>นำเข้าที่จัดเก็บ %1 แล้ว</translation>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>นำเข้าและนำออกที่จัดเก็บ %1 จากกลุ่มต่างๆ</translation>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2113,6 +2836,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>ตั้งค่าลำดับ Auto-Type เริ่มต้น</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2138,7 +2889,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>ไม่สามารถดึงข้อมูล favicon ได้</translation>
+ <translation>ไม่สามารถดึง favicon ได้</translation>
</message>
<message>
<source>Images</source>
@@ -2149,28 +2900,16 @@ Disable safe saves and try again?</source>
<translation>ทุกแฟ้ม</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>มีไอคอนที่กำหนดเองอยู่แล้ว</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>ยืนยันการลบ</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>ดาวน์โหลดไอคอนที่กำหนดเองสำเร็จ</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>คำแนะนำ: คุณสามารถใช้ DuckDuckGo แสดงแทนได้ที่ เครื่องมือ&gt;การตั้งค่า&gt;ความปลอดภัย </translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>เลือกรูปภาพ</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>การโหลดไอคอน %1 ของ %1 ประสบความสำเร็จ</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2178,34 +2917,70 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation><numerusform>%n ไอคอนมีอยู่แล้วในฐานข้อมูล</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation><numerusform>ไอคอนต่อไปนี้ล้มเหลว</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>ไอคอนนี้ถูกใช้โดย %n เอ็นทรี และจะถูกแทนที่ด้วยไอคอนตั้งต้น คุณแน่ใจหรือไม่ว่าคุณต้องการลบไอคอน</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetProperties</name>
<message>
<source>Created:</source>
- <translation>สร้าง</translation>
+ <translation>สร้าง:</translation>
</message>
<message>
<source>Modified:</source>
- <translation>แก้ไข</translation>
+ <translation>แก้ไข:</translation>
</message>
<message>
<source>Accessed:</source>
- <translation>เข้าถึง</translation>
+ <translation>เข้าถึง:</translation>
</message>
<message>
<source>Uuid:</source>
- <translation>Uuid</translation>
+ <translation>Uuid:</translation>
</message>
<message>
<source>Plugin Data</source>
@@ -2223,7 +2998,7 @@ Disable safe saves and try again?</source>
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
<translation>คุณต้องการลบข้อมูลโปรแกรมเสริมที่เลือกไว้หรือไม่
-การกระทำนี้อาจจะกระทบโปรแกรมเสริมให้ทำงานผิดพลาด</translation>
+การกระทำนี้อาจจะกระทบโปรแกรมเสริมให้ไม่ทำงาน</translation>
</message>
<message>
<source>Key</source>
@@ -2233,12 +3008,36 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>ค่า</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
<message>
<source>%1 - Clone</source>
- <translation>%1 -ลอกแบบ</translation>
+ <translation>ลอกแบบ</translation>
</message>
</context>
<context>
@@ -2256,7 +3055,7 @@ This may cause the affected plugins to malfunction.</source>
<name>EntryAttachmentsWidget</name>
<message>
<source>Form</source>
- <translation>รูปแบบ</translation>
+ <translation>จาก</translation>
</message>
<message>
<source>Add</source>
@@ -2280,7 +3079,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>คุณแน่ใจหรือไม่ว่าคุณต้องการลบไฟล์แนบ</numerusform></translation>
+ <translation><numerusform>คุณแน่ใจหรือว่าคุณต้องการลบแฟ้มแนบ %n </numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2325,7 +3124,28 @@ This may cause the affected plugins to malfunction.</source>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>ไม่สามารถเปิดไฟล์</numerusform></translation>
+ <translation><numerusform>ไม่สามารถเปิดแฟ้ม
+%1</numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>แฟ้มแนบ</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2359,7 +3179,7 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Ref: </source>
<comment>Reference abbreviation</comment>
- <translation>อ้างอิง</translation>
+ <translation>อ้างอิง:</translation>
</message>
<message>
<source>Group</source>
@@ -2395,11 +3215,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Created</source>
- <translation>ถูกสร้าง</translation>
+ <translation>สร้าง</translation>
</message>
<message>
<source>Modified</source>
- <translation>แก้ไข</translation>
+ <translation>แก้ไข้</translation>
</message>
<message>
<source>Accessed</source>
@@ -2421,10 +3241,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>สร้างโทเคน TOTP</translation>
- </message>
- <message>
<source>Close</source>
<translation>ปิด</translation>
</message>
@@ -2509,6 +3325,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>แบ่งปัน</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>ขั้นสูง</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2542,22 +3366,44 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>ถังขยะ</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
- <translation>(ที่ว่าง)</translation>
+ <translation>(ที่วาง)</translation>
</message>
</context>
<context>
<name>HostInstaller</name>
<message>
<source>KeePassXC: Cannot save file!</source>
- <translation>KeePassXC: ไม่สามารถบันทึกแฟ้ม</translation>
+ <translation>KeePassXC: ไม่สามารถบันทึกแฟ้ม!</translation>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
@@ -2565,6 +3411,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>ยกเลิก</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>ปิด</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>สถานะ</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>โอเค</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2579,17 +3477,13 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx3Reader</name>
<message>
<source>Unable to calculate master key</source>
- <translation>ไม่สามารถคำนวญกุญแจมาสเตอร์ได้</translation>
+ <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
<translation>ไม่สามารถส่งออก รหัสสอบถาม-รหัสตอบกลับ</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>รหัสผิดหรือแฟ้มฐานข้อมูลเสียหาย</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>ฐานข้อมูลส่วนหัวหายไป</translation>
</message>
@@ -2599,15 +3493,20 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid header id size</source>
- <translation>ขนาดบัญชีส่วนหัวไม่ถูกต้อง</translation>
+ <translation>ขนาด ID ส่วนหัวไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid header field length</source>
- <translation>ความยาวของฟิลด์ส่วนหัวไม่ถูกต้อง</translation>
+ <translation>ความยาวฟิลด์ส่วนหัวไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid header data length</source>
- <translation>ความยาวของข้อมูลส่วนหัวไม่ถูกต้อง</translation>
+ <translation>ความยาวข้อมูลส่วนหัวไม่ถูกต้อง</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2629,7 +3528,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>ไม่สามารถคำนวญกุญแจมาสเตอร์ได้</translation>
+ <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation>
</message>
<message>
<source>Invalid header checksum size</source>
@@ -2640,10 +3539,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>หัวข้อ SHA256 ไม่ตรงกัน</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>กุญแจผิดหรือไฟล์ฐานข้อมูลเสียหาย (HMAC ไม่ตรงกัน)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>การเข้ารหัสที่ไม่รู้จัก</translation>
</message>
@@ -2661,7 +3556,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Failed to open buffer for KDF parameters in header</source>
- <translation>ไม่สามารถเปิดบัฟเฟอร์สำหรับพารามิเตอร์ KDF ในส่วนต้น</translation>
+ <translation>การเปิดบัพเพอร์สำหรับพารามิเตอร์ในส่วนหัวล้มเหลว</translation>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
@@ -2686,27 +3581,27 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Unsupported KeePass variant map version.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>ไม่รองรับ KeePass รุ่น variant map</translation>
+ <translation>ไม่สนับKeePass รุ่นแผนที่ที่แตกต่าง </translation>
</message>
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>ความยาวชื่อรายการ variant map ไม่ถูกต้อง</translation>
+ <translation>ความยาวชื่อรายการ variant map ไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation> ข้อมูลชื่อรายการ variant map ไม่ถูกต้อง</translation>
+ <translation>ชื่อข้อมูล variant map ไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid variant map entry value length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>ความยาวรายการ variant map ไม่ถูกต้อง</translation>
+ <translation>ใส่ความยาวรายการ variant map ไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid variant map entry value data</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>ข้อมูลรายการเริ่มต้น variant map ไม่ถูกต้อง</translation>
+ <translation>ข้อมูลรายการ variant map ไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid variant map Bool entry value length</source>
@@ -2743,6 +3638,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>ขนาดชนิดของเขตข้อมูล variant map ไม่ถูกต้อง</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2762,7 +3666,8 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>ล้มเหลวในการลำดับแผนที่แปรผันพารามิเตอร์ KDF </translation>
+ <translation>ล้มเหลวในการลำดับแผนที่แปรผันพารามิเตอร์ KDF
+ </translation>
</message>
</context>
<context>
@@ -2793,11 +3698,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Invalid start bytes size</source>
- <translation>ขนาดของไบต์เริ่มต้นไม่ถูกต้อง</translation>
+ <translation>ขนาดเริ่มต้นไบต์ไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid random stream id size</source>
- <translation>ขนาด ID สตรีมแบบสุ่มไม่ถูกต้อง</translation>
+ <translation>ขนาด ID สตรีมแบบสุ่มไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid inner random stream cipher</source>
@@ -2846,7 +3751,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>ไอคอน uuid หรือ ข้อมูล หายไป</translation>
+ <translation>ไอคอน uuid หรือ ไอคอนข้อมูล หายไป</translation>
</message>
<message>
<source>Missing custom data key or value</source>
@@ -2902,11 +3807,11 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>History element with different uuid</source>
- <translation>ประวัติของส่วนประกอบที่ uuid ต่างกัน</translation>
+ <translation>ประวัติขององค์ประกอบที่ uuid ต่างกัน</translation>
</message>
<message>
<source>Duplicate custom attribute found</source>
- <translation>ค้นพบคัดลอกคุณสมบัติที่กำหนดเอง</translation>
+ <translation>พบสำเนาคุณสมบัติที่กำหนดเอง</translation>
</message>
<message>
<source>Entry string key or value missing</source>
@@ -2967,13 +3872,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>นำเข้าฐานข้อมูล KeePass1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3016,7 +3921,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid number of transform rounds</source>
- <translation>การแปลงจำนวนรอบของการเปลี่ยนแปลงไม่ถูกต้อง</translation>
+ <translation>จำนวนรอบของการเปลี่ยนแปลงไม่ถูกต้อง</translation>
</message>
<message>
<source>Unable to construct group tree</source>
@@ -3028,11 +3933,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>ไม่สามารถคำนวญกุญแจมาสเตอร์ได้</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>รหัสผิดหรือแฟ้มฐานข้อมูลเสียหาย</translation>
+ <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation>
</message>
<message>
<source>Key transformation failed</source>
@@ -3040,31 +3941,31 @@ Line %2, column %3</source>
</message>
<message>
<source>Invalid group field type number</source>
- <translation>กรุ๊ปตัวเลขฟิลด์ไทป์ไม่ถูกต้อง</translation>
+ <translation>กลุ่มฟิลด์ประเภทตัวเลขไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid group field size</source>
- <translation>ขนาดกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
+ <translation>กลุ่มฟิลด์ขนาดไม่ถูกต้อง</translation>
</message>
<message>
<source>Read group field data doesn&apos;t match size</source>
- <translation>ข้อมูลการอ่านกรุ๊ปฟิลด์ฟิลด์จับคู่ไม่ได้ขนาด</translation>
+ <translation>กลุ่มการอ่านข้อมูลฟิลด์จับคู่ไม่ได้ขนาด</translation>
</message>
<message>
<source>Incorrect group id field size</source>
- <translation>ขนาดกรุ๊ปไอดีฟิลด์ไม่ถูกต้อง</translation>
+ <translation>ขนาดกลุ่มตัวเลขขนาดไม่ถูกต้อง</translation>
</message>
<message>
<source>Incorrect group creation time field size</source>
- <translation>เวลาการสร้างกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
+ <translation>ขนาดเวลาการสร้างกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
</message>
<message>
<source>Incorrect group modification time field size</source>
- <translation>การแก้ไขเวลากรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
+ <translation>ขนาดการแก้ไขเวลากรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
</message>
<message>
<source>Incorrect group access time field size</source>
- <translation>เวลาการเข้าถึงกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
+ <translation>ขนาดเวลาการเข้าถึงกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
</message>
<message>
<source>Incorrect group expiry time field size</source>
@@ -3076,7 +3977,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Incorrect group level field size</source>
- <translation>ขนาดเลเวลกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
+ <translation>ขนาดของระดับกรุ๊ปฟิลด์ไม่ถูกต้อง</translation>
</message>
<message>
<source>Invalid group field type</source>
@@ -3088,7 +3989,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Missing entry field type number</source>
- <translation>ตัวเลขเอ็นทรีฟิลด์ไทป์หายไป</translation>
+ <translation>ตัวเลขนำเข้าฟิลด์ไทป์หายไป</translation>
</message>
<message>
<source>Invalid entry field size</source>
@@ -3096,7 +3997,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Read entry field data doesn&apos;t match size</source>
- <translation>ขนาดการอ่านข้อมูลเอ็นทรีฟิลด์ไม่เหมาะสมกับขนาด</translation>
+ <translation>ขนาดการอ่านข้อมูลเอ็นทรีฟิล์ดไม่เหมาะสมกับขนาด</translation>
</message>
<message>
<source>Invalid entry uuid field size</source>
@@ -3130,40 +4031,57 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>ไม่สามารถที่จะหาตำแหน่งเนื้อหาได้</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>ไม่สามารถแบ่งปันได้</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>นำเข้ามาจาก</translation>
+ <source>Imported from %1</source>
+ <translation>นำเข้า จาก 1%</translation>
</message>
<message>
- <source>Export to</source>
- <translation>นำออกไปที่</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>เชื่อมต่อกับ</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>ไม่สามารถแบ่งปัน %1</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>นำเข้ามาจากส่วนแบ่ง %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>นำออกไปที่ส่วนแบ่ง %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>เชื่อมต่อกับส่วนแบ่ง %1</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3202,16 +4120,12 @@ Line %2, column %3</source>
<message>
<source>%1 set, click to change or remove</source>
<comment>Change or remove a key component</comment>
- <translation>ตั้งค่า %1 คลิกเพื่อเปลี่ยนแปลงหรือยกเลิก</translation>
+ <translation>ตั้งค่า %1 คลิกเพื่อเปลี่ยนแปลงหรือยลบออก</translation>
</message>
</context>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>ดู</translation>
- </message>
- <message>
<source>Generate</source>
<translation>สร้าง</translation>
</message>
@@ -3225,15 +4139,16 @@ Line %2, column %3</source>
</message>
<message>
<source>Legacy key file format</source>
- <translation>นามสกุลไฟล์ของแฟ้มกุญแจ</translation>
+ <translation>นามสกุลไฟล์แบบดั้งเดิมของแฟ้มกุญแจ</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please go to the master key settings and generate a new key file.</source>
- <translation>คุณกำลังใช้งานนามสกุลไฟล์ของแฟ้มกุญแจที่
-อาจไม่รับรองในอนาคต
+ <translation>คุณกำลังใช้งานนามสกุลไฟล์แบบดั้งเดิมของแฟ้มกุญแจที่
+อาจ
+ไม่รองรับในอนาคต
กรุณาไปที่การตั้งค่ากุญแจมาสเตอร์และสร้างแฟ้มกุญแจใหม่</translation>
</message>
<message>
@@ -3260,12 +4175,49 @@ Message: %2</source>
</message>
<message>
<source>Unable to create key file: %1</source>
- <translation>ไม่สามารถสร้างแฟ้มกุญแจ %1</translation>
+ <translation>รายการ (&amp;E)</translation>
</message>
<message>
<source>Select a key file</source>
<translation>เลือกแฟ้มกุญแจ</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>เรียกดู...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3354,10 +4306,6 @@ Message: %2</source>
<translation>การตั้งค่า (&amp;S)</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>ตัวสร้างรหัสผ่าน</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>ล็อกฐานข้อมูล (&amp;L)</translation>
</message>
@@ -3367,7 +4315,7 @@ Message: %2</source>
</message>
<message>
<source>Copy title to clipboard</source>
- <translation>คัดลอกหัวข้อไปยังคลิปบอร์ด</translation>
+ <translation>คัดหัวข้อไปยังคลิปบอร์ด</translation>
</message>
<message>
<source>&amp;URL</source>
@@ -3399,7 +4347,7 @@ Message: %2</source>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
- <translation>ล้างถังรีไซเคิล</translation>
+ <translation>เทถังรีไซเคิลทิ้ง (&amp;M)</translation>
</message>
<message>
<source>Clear history</source>
@@ -3435,7 +4383,7 @@ This version is not meant for production use.</source>
</message>
<message>
<source>&amp;Donate</source>
- <translation>บริจาค</translation>
+ <translation>ึ&amp;บริจาค</translation>
</message>
<message>
<source>Report a &amp;bug</source>
@@ -3461,19 +4409,19 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;New database...</source>
- <translation>ฐานข้อมูลใหม่</translation>
+ <translation>ข้อมูลใหม่</translation>
</message>
<message>
<source>Create a new database</source>
- <translation>สร้างฐานข้อมูลใหม่</translation>
+ <translation>สร้าง{ฐานข้อมูลใหม่</translation>
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation>รวมฐานข้อมูล</translation>
+ <translation>ผสานจากฐานข้อมูล</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
- <translation>รวมฐานข้อมูลKDBXอีกชุด</translation>
+ <translation>ผสานจากฐานข้อมูลKDBXอีกอัน</translation>
</message>
<message>
<source>&amp;New entry</source>
@@ -3485,11 +4433,11 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;Edit entry</source>
- <translation>แก้ไขรายการ</translation>
+ <translation>แก้ไข้รายการ</translation>
</message>
<message>
<source>View or edit entry</source>
- <translation>ดู หรือ แก้ไขรายการ</translation>
+ <translation>ดูหรือแก้ไข้รายการ</translation>
</message>
<message>
<source>&amp;New group</source>
@@ -3501,7 +4449,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Change master &amp;key...</source>
- <translation>เปลี่ยนแปลงกุญแจมาสเตอร์</translation>
+ <translation>เปลี่ยนกุญแจมาสเตอร์</translation>
</message>
<message>
<source>&amp;Database settings...</source>
@@ -3521,11 +4469,12 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation>ฐานข้อมูล KeePass1</translation>
+ <translation>ฐานข้อมูล KeePass1
+</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
- <translation>นำเข้า ฐานข้อมูล KeePass1...</translation>
+ <translation>นำเข้าฐานข้อมูล KeePass 1</translation>
</message>
<message>
<source>CSV file...</source>
@@ -3537,43 +4486,104 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Show TOTP...</source>
- <translation>แสดง TOTP</translation>
+ <translation>โชว์ TOTP</translation>
</message>
<message>
<source>Show TOTP QR Code...</source>
<translation>แสดง TOTP QR Code</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>คลิ๊กเพื่ออัพเดต</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>แบ่งปัน รายการ</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
- <translation>หมายเหตุ คุณกำลังใช้งาน KeePassXC รุ่นก่อนวางจำหน่าย คาดว่าข้อบกพร่องบางอย่างและปัญหาเล็กน้อย รุ่นนี้ไม่ได้มีไว้สำหรับการใช้งานจริง</translation>
+ <translation>หมายเหตุ: คุณกำลังใช้งาน KeePassXC รุ่นก่อนวางจำหน่าย! คาดว่าข้อบกพร่องบางอย่างและปัญหาเล็กน้อย รุ่นนี้ไม่ได้มีไว้สำหรับการใช้งานจริง</translation>
</message>
<message>
<source>Check for updates on startup?</source>
- <translation>ตรวจสอบการอัปเดทเมื่อเริ่มโปรแกรม</translation>
+ <translation>คลิ๊กเพื่ออัพเดตบน Startup</translation>
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation>คุณต้องการให้ KeePassXC ตรวจสอบเพื่ออัปเดตคลิกที่ปุ่มเปิด</translation>
+ <translation>คุณต้องการให้ KeePassXC ตรวจสอบการอัปเดตเมื่อเริ่มต้นหรือไม่?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
- <translation>คุณสามารถตรวจสอบการอัปเดตได้ด้วยตนเองจากเมนูแอปพลิเคชัน</translation>
+ <translation>คุณสามารถตรวจสอบการอัปเดตได้ด้วยตนเองจากเมนูแอปพลิเคชัน
+</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>ดาวน์โหลด favicon</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
- <translation>กำลังสร้างส่วนที่หายไป %1 [%2]</translation>
+ <translation>กำลังสร้างส่วนที่หายไป %1 [%2]</translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
@@ -3585,7 +4595,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation>รวมข้อมูลที่เก่ากว่าเข้ากับฐานข้อมูล &quot;% 1&quot;</translation>
+ <translation>รายการที่เก่ากว่าผสานจากฐานข้อมูล &quot;% 1&quot;</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
@@ -3601,7 +4611,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation>การนำรายการแหล่งข้อมูลเก่ามาใช้ใหม่ที่ด้านบนของเป้าหมายใหม่กว่า% 1 [% 2]</translation>
+ <translation>Reapplying older source entry on top of newer target %1 [%2]</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
@@ -3609,15 +4619,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation>เชื่อมต่อจากฐานข้อมูลเดิม %1 [%2]</translation>
+ <translation>เชื่อมต่อจากฐานข้อมูลเก่า %1 [%2]</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation>ลบข้อมูลลูก %1 [%2]</translation>
+ <translation>ลบส่วนเด็ก %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation>ลบข้อมูลกำพร้า %1 [%2]</translation>
+ <translation>ลบส่วนกำพร้า %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
@@ -3625,7 +4635,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Adding missing icon %1</source>
- <translation>เพิ่มไอคอนขาดหายไป % 1</translation>
+ <translation>กำลังเพิ่มไอคอนขาดหายไป % 1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3671,7 +4689,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
- <translation>ที่นี่คุณสามารถปรับการตั้งค่าการเข้ารหัสฐานข้อมูล ไม่ต้องกังวลคุณสามารถเปลี่ยนได้ในภายหลังในการตั้งค่าฐานข้อมูล</translation>
+ <translation>ที่นี่คุณสามารถปรับการตั้งค่าการเข้ารหัสฐานข้อมูล ไม่ต้องกังวลคุณสามารถเปลี่ยนได้ในภายหลังในการตั้งค่า ฐานข้อมูล</translation>
</message>
</context>
<context>
@@ -3682,7 +4700,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>A master key known only to you protects your database.</source>
- <translation>กุญแจมาสเตอร์ ที่คุณรู้จักเท่านั้นที่คุณจะปกป้อง ฐานข้อมูล </translation>
+ <translation>กุญแจหลักที่คุณรู้จักเท่านั้นที่คุณจะปกป้อง ฐานข้อมูล </translation>
</message>
</context>
<context>
@@ -3693,14 +4711,80 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
- <translation>กรุณากรอกชื่อที่แสดง และคำอธิบายเพิ่มเติมสำหรับ ฐานข้อมูล ใหม่ของคุณ</translation>
+ <translation>กรุณากรอกชื่อที่แสดง และคำอธิบายเพิ่มเติมสำหรับ ฐานข้อมูล ใหม่ของคุณ:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
- <translation>แฟ้มกุญแจ ไม่ถูกต้อง คาดว่าจะมี กุญแจ OpenSSH</translation>
+ <translation>แฟ้มกุญแจไม่ถูกต้อง คาดว่าจะมี กุญแจ OpenSSH</translation>
</message>
<message>
<source>PEM boundary mismatch</source>
@@ -3712,15 +4796,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Key file way too small.</source>
- <translation>แฟ้มกุญแจ มีขนาดเล็กมาก</translation>
+ <translation>แฟ้มกุญแจมีขนาดเล็กมาก</translation>
</message>
<message>
<source>Key file magic header id invalid</source>
- <translation>รหัสหัวไฟล์กุญแจเมจิกไม่ถูกต้อง</translation>
+ <translation>รหัสหัวแฟ้มกุญแจเมจิกไม่ถูกต้อง</translation>
</message>
<message>
<source>Found zero keys</source>
- <translation>ไมพบกุญแจ</translation>
+ <translation>พบกุญแจศูนย์</translation>
</message>
<message>
<source>Failed to read public key.</source>
@@ -3740,23 +4824,23 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
- <translation>จำเป็นต้องใช้วลีรหัสผ่านเพื่อถอดรหัสผ่านกุญแจนี้</translation>
+ <translation>จำเป็นต้องใช้วลีรหัสผ่านเพืื่อถอดรหัสผ่านกุญแจนี้</translation>
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation>การสร้างกุญแจล้มเหลว ไฟล์กุญแจมีปัญหาหรือไม่</translation>
+ <translation>การสร้างกุญแจล้มเหลว ไฟล์กุญแจมีปัญหาหรือป่าว</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
- <translation>การถอดรหัสลับล้มเหลว ใส่วลีรหัสผ่านผิดหรือไม่</translation>
+ <translation>การถอดรหัสลับล้มเหลว ใส่วลีรหัสผ่านผิดหรือป่าว</translation>
</message>
<message>
<source>Unexpected EOF while reading public key</source>
- <translation>เกิด EOF ที่ไม่คาดคิดขณะอ่านกุญแจสาธารณะ</translation>
+ <translation>เกิด EOF อย่างไม่คาดคิดขณะอ่านกุญแจสาธารณะ</translation>
</message>
<message>
<source>Unexpected EOF while reading private key</source>
- <translation>เกิด EOF ที่ไม่คาดคิดขณะอ่านกุญแจส่วนตัว</translation>
+ <translation>เกิด EOF อย่างไม่คาดคิดขณะอ่านกุญแจส่วนตัว</translation>
</message>
<message>
<source>Can&apos;t write public key as it is empty</source>
@@ -3764,7 +4848,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unexpected EOF when writing public key</source>
- <translation>เกิด EOF ที่ไม่คาดคิดขณะเขียนกุญแจสาธารณะ</translation>
+ <translation>เกิด EOF อย่างไม่คาดคิดขณะเขียนกุญแจสาธารณะ</translation>
</message>
<message>
<source>Can&apos;t write private key as it is empty</source>
@@ -3772,7 +4856,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unexpected EOF when writing private key</source>
- <translation>เกิด EOF ที่ไม่คาดคิดขณะเขียนกุญแจส่วนตัว</translation>
+ <translation>เกิด EOF อย่างไม่คาดคิดขณะเขียนกุญแจส่วนตัว</translation>
</message>
<message>
<source>Unsupported key type: %1</source>
@@ -3780,7 +4864,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unknown cipher: %1</source>
- <translation>การเข้ารหัสที่ไม่รู้จัก: %1</translation>
+ <translation>การเข้ารหัสไม่รู้จัก: %1</translation>
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
@@ -3792,14 +4876,25 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unknown key type: %1</source>
- <translation>ประเภทกุญแจที่ไม่รู้จัก: %1</translation>
+ <translation>KDF ที่ไม่รู้จัก: %1</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
- <translation>กรอกรหัสผ่าน</translation>
+ <translation>ป้อนรหัสผ่าน:</translation>
</message>
<message>
<source>Confirm password:</source>
@@ -3811,7 +4906,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
- <translation>&lt;p&gt;รหัสผ่านเป็นวิธีพื้นฐานในการปกป้องฐานข้อมูลของคุณ&lt;/p&gt;&lt;p&gt;รหัสผ่านที่ดีควรยาวและมีเอกลักษณ์ KeePassXC สร้างรหัสผ่านให้คุณได้&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;รหัสผ่านเป็นวิธีพื้นฐานในการปกป้องฐานข้อมูลของคุณ&lt;/p&gt;&lt;p&gt;รหัสผ่านที่ดีควรยาวและแตกต่าง KeePassXC สร้างรหัสผ่านให้คุณได้&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
@@ -3821,6 +4916,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>สร้างรหัสผ่านหลัก</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3830,7 +4941,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Password:</source>
- <translation>รหัสผ่าน</translation>
+ <translation>รหัสผ่าน:</translation>
</message>
<message>
<source>strength</source>
@@ -3850,22 +4961,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>ชนิดอักขระ</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>อักษรตัวพิมพ์ใหญ่</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>อักษรตัวพิมพ์เล็ก</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>ตัวเลข</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>อักขระพิเศษ</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Extended ASCII
</translation>
@@ -3880,7 +4979,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&amp;Length:</source>
- <translation>ความยาว (&amp;L)</translation>
+ <translation>ความยาว (&amp;L):</translation>
</message>
<message>
<source>Passphrase</source>
@@ -3888,11 +4987,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Wordlist:</source>
- <translation>รายการคำ</translation>
+ <translation>รายการคำ:</translation>
</message>
<message>
<source>Word Separator:</source>
- <translation>ตัวแบ่งคำ</translation>
+ <translation>ตัวแบ่งคำ:</translation>
</message>
<message>
<source>Copy</source>
@@ -3936,29 +5035,21 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>ExtendedASCII</source>
- <translation>ExtendedASCII</translation>
+ <translation>ASCII เพิ่มเติม</translation>
</message>
<message>
<source>Switch to advanced mode</source>
- <translation>เปลี่ยนเป็นโหมดใช้งานขั้นสูง</translation>
+ <translation>เปลี่ยนเป็นโหมดขั้นสูง</translation>
</message>
<message>
<source>Advanced</source>
<translation>ขั้นสูง</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>ตัวอักษรตัวพิมพ์ใหญ่ A ถึง F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>ตัวอักษรตัวพิมพ์เล็ก A ถึง F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3991,18 +5082,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>คณิตศาสตร์</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>ขีดคั่นตรงกลาง</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4016,7 +5099,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Switch to simple mode</source>
- <translation>สลับเป็นโหมดง่าย</translation>
+ <translation>สลับเป็นโหมดง่าย ๆ</translation>
</message>
<message>
<source>Simple</source>
@@ -4028,15 +5111,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Do not include:</source>
- <translation>ไม่รวม</translation>
+ <translation>ไม่รวม:</translation>
</message>
<message>
<source>Add non-hex letters to &quot;do not include&quot; list</source>
- <translation>เพิ่มตัวอักขระที่ไม่ใช่เลขฐานสิบหกในรายการ &quot;ห้ามรวม&quot;</translation>
+ <translation>เพิ่มตัวอักษรที่ไม่ใช่ฐานหกเหลี่ยมในรายการ &quot;ห้ามรวม&quot;</translation>
</message>
<message>
<source>Hex</source>
- <translation>เลขฐานสิบหก</translation>
+ <translation>เครื่องหมายหกเหลี่ยม</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
@@ -4044,12 +5127,80 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Word Co&amp;unt:</source>
- <translation>คำ Co&amp;unt คือ</translation>
+ <translation>คำ Co&amp;unt:</translation>
</message>
<message>
<source>Regenerate</source>
<translation>สร้างใหม่</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4057,12 +5208,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>เลือก</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4099,6 +5247,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>ผสาน</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4108,11 +5260,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Database hash not available</source>
- <translation>ฐานข้อมูล hash ไม่พร้อมใช้งาน</translation>
+ <translation>ฐานข้อมูลhash ไม่พร้อมใช้งาน</translation>
</message>
<message>
<source>Client public key not received</source>
- <translation>ไม่ได้รับกุญแจสาธารณะของผู้รับบริการ</translation>
+ <translation>Client public key not receivedไม่ได้รับกุญแจสาธารณะของผู้รับบริการ</translation>
</message>
<message>
<source>Cannot decrypt message</source>
@@ -4124,7 +5276,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>KeePassXC association failed, try again</source>
- <translation>การเชื่อมโยง KeePassXC ล้มเหลว ลองอีกครั้ง</translation>
+ <translation>การเชื่อมโยง KeePassXC ล้มเหลว, ลองอีกครั้ง</translation>
</message>
<message>
<source>Encryption key is not recognized</source>
@@ -4132,7 +5284,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Incorrect action</source>
- <translation>การดำเนินการที่ไม่ถูกต้อง</translation>
+ <translation>การกระทำที่ไม่ถูกต้อง</translation>
</message>
<message>
<source>Empty message received</source>
@@ -4140,7 +5292,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>No URL provided</source>
- <translation>ไม่ได้ระบุ URL</translation>
+ <translation>ไม่มี URL ให้มา</translation>
</message>
<message>
<source>No logins found</source>
@@ -4148,7 +5300,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unknown error</source>
- <translation>ความผิดพลาดที่ไม่อาจระบุได้</translation>
+ <translation>ความผิดพลาดที่ไม่รู้จัก</translation>
</message>
<message>
<source>Add a new entry to a database.</source>
@@ -4191,10 +5343,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>สร้างรหัสผ่านสำหรับรายการ</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>ความยาวสำหรับรหัสผ่านที่สร้างขึ้น</translation>
- </message>
- <message>
<source>length</source>
<translation>ความยาว</translation>
</message>
@@ -4213,7 +5361,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
- <translation>ใกล้หมดเวลาก่อนที่จะล้างคลิปบอร์ด</translation>
+ <translation>หมดเวลานับเป็นวินาทีก่อนที่จะล้างคลิปบอร์ด</translation>
</message>
<message>
<source>Edit an entry.</source>
@@ -4225,11 +5373,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>title</source>
- <translation>หัวข้อ</translation>
+ <translation>หัวเรื่อง</translation>
</message>
<message>
<source>Path of the entry to edit.</source>
- <translation>เส้นทางของรายการที่จะแก้ไข</translation>
+ <translation>เส้นทางของรายการเพื่อไปแก้ไข</translation>
</message>
<message>
<source>Estimate the entropy of a password.</source>
@@ -4244,18 +5392,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>วิเคราะห์รหัสผ่านชั้นสูง</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>แตกไฟล์และพิมพ์เนื้อหาของฐานข้อมูล</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>เส้นทางของฐานข้อมูลที่จะสกัดเนื้อหา</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>กรอกรหัสผ่านเพื่อปลดล็อค %1</translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4281,7 +5417,7 @@ Available commands:
</message>
<message>
<source>List database entries.</source>
- <translation>แสดงรายการฐานข้อมูล</translation>
+ <translation>แจงรายการฐานข้อมูล</translation>
</message>
<message>
<source>Path of the group to list. Default is /</source>
@@ -4293,15 +5429,11 @@ Available commands:
</message>
<message>
<source>Search term.</source>
- <translation>คำที่ใช้ค้นหา</translation>
+ <translation>คำค้น</translation>
</message>
<message>
<source>Merge two databases.</source>
- <translation>ผสานสองฐานข้อมูลเข้าด้วยกัน</translation>
- </message>
- <message>
- <source>Path of the database to merge into.</source>
- <translation>เส้นทางของฐานข้อมูลที่จะผสานเข้าไป</translation>
+ <translation>ผสานสองฐานข้อมูล</translation>
</message>
<message>
<source>Path of the database to merge from.</source>
@@ -4309,7 +5441,7 @@ Available commands:
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation>ใช้ข้อมูลประจำตัวชุดเดียวกันเพื่อเข้าระบบสำหรับไฟล์ฐานข้อมูลทั้งคู่</translation>
+ <translation>ใช้ข้อมูลประจำตัวเพื่อเข้าระบบเดียวกันสำหรับไฟล์ฐานข้อมูลทั้งคู่</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
@@ -4321,7 +5453,7 @@ Available commands:
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
- <translation>ชื่อของคุณสมบัติที่จะแสดง ตัวเลือกนี้สามารถถูกระบุได้มากกว่าหนึ่งครั้ง โดยคุณสมบัติถูกแสดงบรรทัดอันหนึ่งอันตามลำดับ ถ้าไม่มีคุณสมบัติใดถูกระบุ คุณสมบัติเริ่มต้นจะถูกเลือกแทน</translation>
+ <translation>ชื่อของคุณสมบัติที่จะแสดง ตัวเลือกนี้สามารถถูกระบุได้มากกว่าหนึ่งครั้ง โดยคุณสมบัติถูกแสดงบรรทัดอะหนึ่งอันตามลำดับ ถ้าไม่มีคุณสมบัติใดถูกระบุ คุณสมบัติเริ่มต้นจะถูกเลือกแทน</translation>
</message>
<message>
<source>attribute</source>
@@ -4345,7 +5477,7 @@ Available commands:
</message>
<message>
<source>missing closing quote</source>
- <translation>เครื่องหมายปิดคำพูดหายไป</translation>
+ <translation>ไม่มีเครื่องหมายคำพูดปิด</translation>
</message>
<message>
<source>Group</source>
@@ -4353,7 +5485,7 @@ Available commands:
</message>
<message>
<source>Title</source>
- <translation>หัวข้อ</translation>
+ <translation>หัวเรื่อง</translation>
</message>
<message>
<source>Username</source>
@@ -4369,21 +5501,17 @@ Available commands:
</message>
<message>
<source>Last Modified</source>
- <translation>ถูกแก้ไขล่าสุด</translation>
+ <translation>แก้ไขล่าสุด</translation>
</message>
<message>
<source>Created</source>
- <translation>ถูกสร้าง</translation>
+ <translation>สร้าง</translation>
</message>
<message>
<source>Browser Integration</source>
<translation>การทำงานร่วมกับเบราว์เซอร์</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] การตอบกลับของการตรวจสอบ - Slot %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>กด</translation>
</message>
@@ -4407,27 +5535,23 @@ Available commands:
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
<translation>รายการคำสำหรับการสร้าง diceware
-[ค่าเริ่มต้น: EFF ภาษาอังกฤษ]</translation>
+[ค่าเริ่มต้น: EFF English]</translation>
</message>
<message>
<source>Generate a new random password.</source>
<translation>สร้างรหัสผ่านใหม่แบบสุ่ม</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>ค่าไม่ถูกต้องสำหรับความยาวของรหัสผ่าน %1</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>ไม่สามารถสร้างรายการด้วยเส้นทาง %1</translation>
</message>
<message>
<source>Enter password for new entry: </source>
- <translation>ใส่รหัสผ่านสำหรับรายการใหม่</translation>
+ <translation>ใส่รหัสผ่านสำหรับรายการใหม่:</translation>
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation>การเขียนฐานข้อมูลล้มเหลว %1</translation>
+ <translation>การเขียนฐานข้อมูลล้มเหลว %1 </translation>
</message>
<message>
<source>Successfully added entry %1.</source>
@@ -4439,7 +5563,7 @@ Available commands:
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation>ค่าหมดเวลาไม่ถูกต้อง %1</translation>
+ <translation>ค่า timeout ไม่ถูกต้อง %1</translation>
</message>
<message>
<source>Entry %1 not found.</source>
@@ -4459,7 +5583,7 @@ Available commands:
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation><numerusform>ล้างข้อมูลคลิปบอร์ดใน %1 วินาที</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
@@ -4475,10 +5599,6 @@ Available commands:
<translation>การนับจำนวน</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>ค่าความยาวรหัสผ่านไม่ถูกต้อง %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>ไม่สามารถหารายการสำหรับเส้นทาง %1</translation>
</message>
@@ -4488,11 +5608,11 @@ Available commands:
</message>
<message>
<source>Enter new password for entry: </source>
- <translation>ใส่รหัสผ่านใหม่สำหรับรายการ</translation>
+ <translation>ใส่รหัสผ่านใหม่สำหรับรายการ:</translation>
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation>เขียนฐานข้อมูลล้มเหลว %1</translation>
+ <translation>เขียนฐานข้อมูลล้มเหลว: %1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
@@ -4516,11 +5636,11 @@ Available commands:
</message>
<message>
<source>Type: Bruteforce</source>
- <translation>ชนิด บรู๊ทฟอร์ส</translation>
+ <translation>ชนิด: บรู๊ทฟอร์ส</translation>
</message>
<message>
<source>Type: Dictionary</source>
- <translation>ชนิด ไดเรคทอรี</translation>
+ <translation>ชนิด: พจนานุกรม</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
@@ -4528,7 +5648,7 @@ Available commands:
</message>
<message>
<source>Type: User Words</source>
- <translation>ชนิด: User Words</translation>
+ <translation>พิมพ์: User Words</translation>
</message>
<message>
<source>Type: User+Leet</source>
@@ -4603,24 +5723,6 @@ Available commands:
<translation>การโหลดไฟล์กุญแจล้มเหลว %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>ไม่มีไฟล์ %1 </translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>ไม่สามารถเปิดไฟล์ %1</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>เกิดความล้มเหลวขณะอ่านฐานข้อมูล: %1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>เกิดความล้มเหลวขณะแจงส่วนฐานข้อมูล: %1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>ความยาวของรหัสผ่านที่สร้างแล้ว</translation>
</message>
@@ -4633,10 +5735,6 @@ Available commands:
<translation>ใช้ตัวพิมพ์ใหญ่</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>ใช้ตัวเลข</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>ใช้อักขระพิเศษ</translation>
</message>
@@ -4671,15 +5769,15 @@ Available commands:
<message>
<source>Error reading merge file:
%1</source>
- <translation>การอ่านไฟล์ที่รวมกันล้มเหลวคือ %1</translation>
+ <translation>การอ่านไฟล์ที่รวมกันล้มเหลว: %1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation>ไม่สามารถบันทึกฐานข้อมูลไปยังไฟล์คือ %1</translation>
+ <translation>ไม่สามารถบันทึกฐานข้อมูลไปยังไฟล์ : %1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation>ไม่สามารถบันทึกฐานข้อมูลไปยังไฟล์คือ %1</translation>
+ <translation>ไม่สามารถบันทึกฐานข้อมูลไปยังไฟล์ : %1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
@@ -4699,7 +5797,7 @@ Available commands:
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation>ไม่มีโปรแกรมกำหนดสำหรับการจัดการคลิปบอร์ด</translation>
+ <translation>ไม่มีโปรแกรมกำหนดการดำเนินการคลิปบอร์ด</translation>
</message>
<message>
<source>Unable to start program %1</source>
@@ -4769,31 +5867,23 @@ Available commands:
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation>ไม่มีการตั้งค่ากุญแจ ยกเลิกการสร้างฐานข้อมูล</translation>
+ <translation>ไม่มีการตั้งค่ากุญแจ การยกเลิกการสร้างฐานข้อมูล</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation>การบันทึกฐานข้อมูลล้มเหลว % 1</translation>
+ <translation>การบันทึกฐานข้อมูลล้มเหลว:% 1</translation>
</message>
<message>
<source>Successfully created new database.</source>
<translation>การสร้างฐานข้อมูลใหม่ประสบความสำเร็จ</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>ใส่รหัสผ่านเพื่อเข้ารหัสลับฐานข้อมูล (กด Enter เพื่อเว้นว่างไว้)</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>การสร้างกุญแจไฟล์ %1 ล้มเหลว: %2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation>การโหลดกุญแจไฟล์ % 1 ล้มเหลว:% 2</translation>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>ลบรายการออกจากฐานข้อมูล</translation>
+ <translation>การโหลด KeyFile% 1 ล้มเหลว:% 2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4801,11 +5891,11 @@ Available commands:
</message>
<message>
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
- <translation>ไฟล์ single-instance lock ที่มีอยู่ไม่ถูกต้อง เปิด instance ใหม่</translation>
+ <translation>Existing single-instance lock file ที่มีอยู่ไม่ถูกต้อง. เปิด instance ใหม่</translation>
</message>
<message>
<source>The lock file could not be created. Single-instance mode disabled.</source>
- <translation>ไม่สามารถสร้าง lock file ได้ โหมด Single-instance ถูกปิดใช้งาน</translation>
+ <translation>ไม่สามารถสร้าง lock file ได้. โหมด Single-instance ถูกปิดใช้งาน.</translation>
</message>
<message>
<source>KeePassXC - cross-platform password manager</source>
@@ -4825,15 +5915,15 @@ Available commands:
</message>
<message>
<source>read password of the database from stdin</source>
- <translation>อ่านรหัสผ่านของฐานข้อมูลจาก stdin</translation>
+ <translation>อ่านรหัสผ่านของฐานข้อมูลจาก stdin</translation>
</message>
<message>
<source>Parent window handle</source>
- <translation>จัดการหน้าต่างหลัก</translation>
+ <translation>หมายเลขอ้างอิงหน้าต่างหลัก</translation>
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
- <translation>อีกอินสแตนซ์ของ KeePassXC กำลังทำงานอยู่</translation>
+ <translation>อีกตัวอย่างหนึ่งของ KeePassXC กำลังทำงานอยู่</translation>
</message>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
@@ -4845,45 +5935,369 @@ Available commands:
</message>
<message>
<source>Database password: </source>
- <translation>รหัสผ่านฐานข้อมูล</translation>
+ <translation>รหัสผ่านฐานข้อมูล:</translation>
</message>
<message>
<source>Cannot create new group</source>
<translation>ไม่สามารถสร้างกลุ่มใหม่ได้</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>การปรับปรุง: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>การจัดจำหน่าย: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>ระบบปฏิบัติการ: %1
+สถาปัตยกรรม CPU: %2
+เคอร์เนล: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Auto-Type</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>ส่วนขยายที่เปิดใช้:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>ฐานข้อมูลไม่ถูกเปลี่ยนแปลงโดยการดำเนินการผสาน</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </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>
- <translation>เกิดข้อผิดพลาดในการเขียนไปยังอุปกรณ์ที่รองรับ</translation>
+ <translation>เกิดข้อผิดพลาดในการเขียนไปยังอุปกรณ์ที่รองรับ:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
- <translation>เกิดข้อผิดพลาดในการเปิดอุปกรณ์อ้างอิง</translation>
+ <translation>เกิดข้อผิดพลาดในการเปิดอุปกรณ์อ้างอิง:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
- <translation>เกิดข้อผิดพลาดในการอ่านอุปกรณ์อ้างอิง</translation>
+ <translation>เกิดข้อผิดพลาดในการอ่านอุปกรณ์อ้างอิง:</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
- <translation>ข้อผิดพลาด zlib ภายในเมื่อคลายการบีบอัด</translation>
+ <translation>ข้อผิดพลาด zlib ภายในเมื่อคลายการบีบอัด:</translation>
</message>
</context>
<context>
<name>QtIOCompressor::open</name>
<message>
<source>The gzip format not supported in this version of zlib.</source>
- <translation>รูปแบบ gzip ไม่รองรับ zlib เวอร์ชั่นนี้</translation>
+ <translation>รูปแบบ gzip ไม่รองรับ zlib รุ่นนี้</translation>
</message>
<message>
<source>Internal zlib error: </source>
- <translation>ความผิดพลาดภายในของ zlib</translation>
+ <translation>ความผิดพลาดภายในของ zlib: </translation>
</message>
</context>
<context>
@@ -4906,7 +6320,7 @@ Available commands:
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
- <translation>ตัวแทนปฏิเสธตัวตนนี้ เหตุผลที่เป็นไปได้คือ</translation>
+ <translation>ตัวแทนปฏิเสธตัวตนนี้ เหตุผลที่เป็นไปได้ได้แก่</translation>
</message>
<message>
<source>The key has already been added.</source>
@@ -4945,7 +6359,7 @@ Available commands:
</message>
<message>
<source>match term exactly</source>
- <translation>การจับคู่คำสอดคล้องกัน</translation>
+ <translation>การจับคู่คำสอดคล้อง</translation>
</message>
<message>
<source>use regex in term</source>
@@ -4988,7 +6402,7 @@ Available commands:
</message>
<message>
<source>Limit search to selected group</source>
- <translation>จำกัดการค้นไว้สำหรับเฉพาะกลุ่มที่เลือก</translation>
+ <translation>จำกัดการค้นไว้เฉพาะในกลุ่มที่เลือก</translation>
</message>
<message>
<source>Search Help</source>
@@ -5005,6 +6419,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>ทั่วไป</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>กลุ่ม</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>การตั้งค่าฐานข้อมูล</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>ปลดล็อกฐานข้อมูล</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>ล็อกฐานข้อมูล</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5036,7 +6537,7 @@ Available commands:
</message>
<message>
<source>Key:</source>
- <translation>กุญแจ</translation>
+ <translation>กุญแจ:</translation>
</message>
<message>
<source>Generate</source>
@@ -5109,7 +6610,7 @@ Available commands:
</message>
<message>
<source>All files</source>
- <translation>ทุกไฟล์</translation>
+ <translation>ทุกแฟ้ม</translation>
</message>
<message>
<source>Select path</source>
@@ -5117,7 +6618,7 @@ Available commands:
</message>
<message>
<source>Exporting changed certificate</source>
- <translation>นำออกใบรับรองที่เปลี่ยนแปลงแล้ว</translation>
+ <translation>นำใบรับรองที่เปลี่ยนแปลงแล้วออก</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
@@ -5127,9 +6628,100 @@ Available commands:
<source>Signer:</source>
<translation>ผู้ลงชื่อ</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>กุญแจ</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>ไม่สามารถเขียนทับที่จัดเก็บ ที่แบ่งปันไว้ และเซ็นแล้ว- ไม่อนุญาตการนำออก</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>ไม่สามารถเขียนที่จัดเก็บที่ส่งออกได้ (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>ไม่สามารถฝังลายเซ็น ไม่สามารถเปิดไฟล์เพือเขียน (%1) </translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>ไม่สามารถฝังลายเซ็น ไม่สามารถเขียนไฟล์ (%1) </translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>ไม่สามารถฝังฐานข้อมูล ไม่สามารถเปิดไฟล์เพื่อทำการเขียน (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>ไม่สามารถฝังฐานข้อมูล ไม่สามารถเขียนไฟล์ได้ (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>ไม่รองรับการเขียนทับการแชร์ที่จัดเก็บที่ไม่ได้ลงชื่อ - ป้องกันการส่งออก</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>ไม่สามารถนำออกที่จัดเก็บได้</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>เกิดข้อผิดพลาดในการส่งออกที่ไม่คาดคิด</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>นำเข้าจากที่จัดเก็บโดยไม่มีลายเซ็น</translation>
@@ -5143,6 +6735,10 @@ Available commands:
<translation>นำเข้าที่จัดเก็บด้วยใบรับรอง</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>คุณเชื่อถือ %1 การพิมพ์ลายนิ้วมือ %2 จาก%3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>ไม่ใช่เวลานี้</translation>
</message>
@@ -5159,18 +6755,6 @@ Available commands:
<translation>เวลานี้</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>นำเข้า 1% ล้มเหลว 2%</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>นำเข้าจาก 1% สำเร็จ 2%</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>นำเข้า จาก 1%</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>ไม่รองรับที่จัดเก็บแบ่งปันที่เซ็นไว้ - ไม่อนุญาตการนำเข้า</translation>
</message>
@@ -5210,25 +6794,20 @@ Available commands:
<source>Unknown share container type</source>
<translation>การแบ่งปันที่จัดเก็บจากแหล่งที่ไม่รู้จัก</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>ไม่สามารถเขียนทับที่จัดเก็บ ที่แบ่งปันไว้ และเซ็นแล้ว- ไม่อนุญาตการนำออก</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>ไม่สามารถเขียนที่จัดเก็บที่ส่งออกได้ (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>ไม่รองรับการเขียนทับการแชร์ที่จัดเก็บที่ไม่ได้ลงชื่อ - ป้องกันการส่งออก</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>นำเข้า 1% ล้มเหลว 2%</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>ไม่สามารถนำออกที่จัดเก็บได้</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>นำเข้าจาก 1% สำเร็จ 2%</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>เกิดข้อผิดพลาดในการส่งออกที่ไม่คาดคิด</translation>
+ <source>Imported from %1</source>
+ <translation>นำเข้า จาก 1%</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5243,10 +6822,6 @@ Available commands:
<translation>นำออก %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>คุณเชื่อถือ %1 การพิมพ์ลายนิ้วมือ %2 จาก%3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>นำเข้าจากแหล่งพาทหลายแห่งไปยัง %1 ใน %2</translation>
</message>
@@ -5254,22 +6829,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>การนำเป้าหมายพาทออกขัดแย้งกัน %1 ใน %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>ไม่สามารถฝังลายเซ็น ไม่สามารถเปิดไฟล์เพือเขียน (%1) </translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>ไม่สามารถฝังลายเซ็น ไม่สามารถเขียนไฟล์ (%1) </translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>ไม่สามารถฝังฐานข้อมูล ไม่สามารถเปิดไฟล์เพื่อทำการเขียน (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>ไม่สามารถฝังฐานข้อมูล ไม่สามารถเขียนไฟล์ได้ (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5287,7 +6846,7 @@ Available commands:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>หมดอายุภายใน &lt;b&gt;%n&lt;/b&gt; วินาที</numerusform></translation>
+ <translation type="unfinished"><numerusform></numerusform></translation>
</message>
</context>
<context>
@@ -5307,7 +6866,7 @@ Available commands:
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation>กำลังปิดภายใน %1 วินาที</translation>
+ <translation>ปิดใน %1 วินาที</translation>
</message>
</context>
<context>
@@ -5317,10 +6876,6 @@ Available commands:
<translation>ติดตั้ง TOTP</translation>
</message>
<message>
- <source>Key:</source>
- <translation>กุญแจ</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>การตั้งค่าโทเค็น RFC 6238 ตั้งต้น</translation>
</message>
@@ -5338,28 +6893,57 @@ Available commands:
</message>
<message>
<source>Time step:</source>
- <translation>ขั้นเวลา</translation>
+ <translation>ขั้นเวลา:</translation>
</message>
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>วินาที</translation>
+ <translation>วิ</translation>
</message>
<message>
<source>Code size:</source>
- <translation>ขนาดรหัส</translation>
+ <translation>ขนาดรหัส:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 หลัก</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>เจ็ดหลัก</translation>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 หลัก</translation>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>อัลกอริทึม:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5378,7 +6962,7 @@ Available commands:
</message>
<message>
<source>Update Error!</source>
- <translation>การอัปเดทผิดพลาด</translation>
+ <translation>อัปเดทข้อผิดพลาด!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
@@ -5394,7 +6978,7 @@ Available commands:
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation>KeePassXC เวอร์ชั่นใหม่พร้อมใช้แล้ว</translation>
+ <translation>KeePassXC รุ่นใหม่มีให้ใช้แล้ว!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
@@ -5406,11 +6990,11 @@ Available commands:
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation> คุณอัปเดตแล้ว</translation>
+ <translation> คุณอัปเดตแล้ว!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation>KeePassXC %1 เป็นรุ่นใหม่ล่าสุดที่พร้อมใช้งานแล้ว</translation>
+ <translation>KeePassXC %1 เป็นรุ่นใหม่ล่าสุดที่มีให้ใช้</translation>
</message>
</context>
<context>
@@ -5441,7 +7025,15 @@ Available commands:
</message>
<message>
<source>Welcome to KeePassXC %1</source>
- <translation>ยินดีต้อนรับสู่ KeePassXC %1</translation>
+ <translation>ยินดีต้อนรับสู่ KeePassXC</translation>
+ </message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5460,11 +7052,19 @@ Available commands:
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation>ไม่พบ YubiKey โปรดตรวจสอบว่าได้ทำการเสียบเรียบร้อย</translation>
+ <translation>ตรวจสอบ YubiKey ไม่เจอ โปรดทำให้แน่ใจว่ามีโปรแกรมเสริม</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
- <translation>ไม่ได้เสียบ YubiKey </translation>
+ <translation>ไม่มีการแทรก YubiKey </translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_tr.ts b/share/translations/keepassx_tr.ts
index 18b248c6f..95acad850 100644
--- a/share/translations/keepassx_tr.ts
+++ b/share/translations/keepassx_tr.ts
@@ -19,7 +19,7 @@
</message>
<message>
<source>Contributors</source>
- <translation>Katkıcılar</translation>
+ <translation>Katkıda Bulunanlar</translation>
</message>
<message>
<source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source>
@@ -50,7 +50,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>SSH İstemcisini etkinleştir (yeniden başlatma gerektirir)</translation>
+ <translation>SSH İstemcisini etkinleştir (yeniden başlatma gerekli)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@@ -73,7 +73,7 @@
</message>
<message>
<source>Access error for config file %1</source>
- <translation>Yapılandırma dosyası erişim hatası %1</translation>
+ <translation>%1 yapılandırma dosyası için erişim hatası</translation>
</message>
<message>
<source>Icon only</source>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>Takip tipi</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>KeePassXC &apos;nin yalnızca tek bir örneğini başlat</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Geçmiş veritabanlarını hatırla</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Son anahtar dosyalarını ve güvenlik aygıtlarını anımsa</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Başlangıçta önceki veritabanları yükle</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Uygulama başlangıcında pencereyi simge durumuna küçült</translation>
</message>
@@ -140,11 +136,11 @@
</message>
<message>
<source>Automatically save after every change</source>
- <translation>Her değişiklik sonrası kendiliğinden kaydet</translation>
+ <translation>Her değişiklik sonrası otomatik kaydet</translation>
</message>
<message>
<source>Automatically save on exit</source>
- <translation>Çıkışta kendiliğinden kaydet</translation>
+ <translation>Çıkışta otomatik kaydet</translation>
</message>
<message>
<source>Don&apos;t mark database as modified for non-data changes (e.g., expanding groups)</source>
@@ -163,10 +159,6 @@
<translation>Girdi oluşturmada küme simgesini kullan</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Panoya kopyalarken simge durumuna küçült</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Girdi önizleme panelini gizle</translation>
</message>
@@ -195,10 +187,6 @@
<translation>Simge durumuna küçültüldüğünde pencereyi sistem tepsisine gizle</translation>
</message>
<message>
- <source>Language</source>
- <translation>Dil</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Oto-Yazım</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Oto-Yazım başlangıç gecikmesi</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Uygulama başlangıcında güncellemeleri kontrol et</translation>
+ <source>Movable toolbar</source>
+ <translation>Hareketli araç çubuğu</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Güncellemeleri kontrol ederken ön sürümleri dahil et</translation>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Hareketli araç çubuğu</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>Düğme tipi:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>Dil:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Küçült</translation>
</message>
<message>
- <source>Button style</source>
- <translation>Düğme tipi</translation>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>sn</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -261,7 +330,7 @@
<message>
<source> sec</source>
<comment>Seconds</comment>
- <translation>san</translation>
+ <translation>sn</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -281,11 +350,11 @@
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
- <translation>Oturum kilitlendiğinde veya kapak kapandığında veritabanlarını kilitle</translation>
+ <translation>Oturum kilitlendiğinde veya kapak kapatıldığında veritabanlarını kilitle</translation>
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>Oturum kilitlendiğinde veya kapak kapandığında TouchID&apos;yi unut</translation>
+ <translation>Oturum kilitlendiğinde veya kapak kapatıldığında TouchID&apos;yi unut</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@@ -309,7 +378,7 @@
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
- <translation>Önizleme giriş panelinde parolaları gizle</translation>
+ <translation>Girdi önizleme panelinde parolaları gizle</translation>
</message>
<message>
<source>Hide entry notes by default</source>
@@ -320,8 +389,29 @@
<translation>Gizlilik</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Web site simgelerini indirmek için DuckDuckGo&apos;yu yedek olarak kullan</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>dak</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>&amp;Kullanıcı adını kopyala</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>&amp;Parolayı kopyala</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -397,7 +498,11 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation>Oto-Yazım için girdi seçiniz:</translation>
+ <translation>Oto-Yazım için girdi seçin:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>Ara...</translation>
</message>
</context>
<context>
@@ -408,7 +513,7 @@
</message>
<message>
<source>Remember this decision</source>
- <translation>Bu kararı anımsa</translation>
+ <translation>Bu kararı hatırla</translation>
</message>
<message>
<source>Allow</source>
@@ -422,7 +527,15 @@
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
<translation>%1, şu öge(ler) için parolalara erişim izni istedi.
-Lütfen erişime izin vermek istediklerinizi seçin.</translation>
+Lütfen erişime izin vermek isteyip istemediğinizi belirtin.</translation>
+ </message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -454,11 +567,7 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>Bu KeePassXC-Tarayıcı ile veritabanlarınıza erişmek için gereklidir.</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>KeePassXC tarayıcı entegrasyonunu etkinleştir</translation>
+ <translation>Bu, KeePassXC-Tarayıcı ile veritabanlarınıza erişmek için gereklidir.</translation>
</message>
<message>
<source>General</source>
@@ -466,7 +575,7 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>Enable integration for these browsers:</source>
- <translation>Bu tarayıcılar için entegrasyonu etkinleştir:</translation>
+ <translation>Bu tarayıcılar için tümleştirmeyi etkinleştirin:</translation>
</message>
<message>
<source>&amp;Google Chrome</source>
@@ -503,7 +612,7 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>Tüm alan adı için tüm girdilerin yerine belirli bir URL için yalnızca en iyi eşleşmeyi döndürür.</translation>
+ <translation>Yalnızca tüm alan adı için tüm girdiler yerine belirli bir URL için en iyi eşleşenleri döndürür.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
@@ -534,21 +643,17 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
<translation>Kimlik bilgilerini &amp;güncellemeden önce asla sorma</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Yalnızca seçilen veritabanı istemciyle bağlanmış olmalıdır.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Kimlik bilgilerini eşleştirmek için tüm açılan &amp;veritabanlarında ara</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
- <translation>Dizge alanlarını kendiliğinden oluşturma ve güncelleme desteklenmiyor.</translation>
+ <translation>Dizi alanlarını otomatik oluşturma veya güncelleme desteklenmiyor.</translation>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>&quot;KPH: &quot; ile başlayan gelişmiş dizge alanları &amp;döndür</translation>
+ <translation>&quot;KPH: &quot; ile başlayan gelişmiş dizi alanları &amp;döndür</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
@@ -556,7 +661,7 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>Başlangıçta yerel mesajlaşma &amp;amp;manifesto dosyalarını güncelle</translation>
+ <translation>Başlangıçta yerel mesajlaşma &amp;manifesto dosyalarını güncelle</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -593,10 +698,6 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
<translation>&amp;Tor Tarayıcı</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Uyarı&lt;/b&gt;, keepassxc-proxy uygulaması bulunamadı!&lt;br /&gt;Lütfen KeePassXC kurulum dizinini kontrol edin veya gelişmiş seçeneklerde özel yolu onaylayın.&lt;br /&gt;Tarayıcı bütünleşmesi, proxy uygulaması olmadan ÇALIŞMAYACAKTIR.&lt;br /&gt;Beklenen Yol:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Yürütülebilir Dosyalar</translation>
</message>
@@ -621,6 +722,50 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>Tarayıcı bütünleşmesinin çalışması için KeePassXC-Tarayıcı gereklidir. &lt;br /&gt;%1 ve %2 için indirin. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -644,7 +789,7 @@ onu tanımlamak için benzersiz bir isim ver ve kabul et.</translation>
</message>
<message>
<source>KeePassXC: Overwrite existing key?</source>
- <translation>KeePassXC: Var olan anahtarın üstüne yaz?</translation>
+ <translation>KeePassXC: Mevcut anahtarın üzerine yazılsın mı?</translation>
</message>
<message>
<source>A shared encryption key with the name &quot;%1&quot; already exists.
@@ -654,7 +799,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>KeePassXC: Update Entry</source>
- <translation>KeePassXC: Girdi Güncelle</translation>
+ <translation>KeePassXC: Giriş Güncelleme</translation>
</message>
<message>
<source>Do you want to update the information in %1 - %2?</source>
@@ -692,7 +837,7 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation>KeePassXC: Eski tarayıcı entegrasyon ayarları tespit edildi</translation>
+ <translation>KeePassXC: Eski tarayıcı tümleştirme ayarları algılandı</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
@@ -714,12 +859,16 @@ Would you like to migrate your existing settings now?</source>
Bu, mevcut tarayıcı bağlantılarınızı korumak için gereklidir.
Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Bu uyarıyı bir daha gösterme</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
<message>
<source>Clone Options</source>
- <translation>Klonlama Ayarları</translation>
+ <translation>Klonlama Seçenekleri</translation>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
@@ -731,7 +880,7 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
<message>
<source>Copy history</source>
- <translation>Kopyalama Geçmişi</translation>
+ <translation>Geçmişi kopyala</translation>
</message>
</context>
<context>
@@ -758,11 +907,11 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
<message>
<source>Text is qualified by</source>
- <translation>Şu tarafından metin yetkilendirildi</translation>
+ <translation>tarafından metin yetkili</translation>
</message>
<message>
<source>Fields are separated by</source>
- <translation>Şu tarafından alanlar bölümlendi</translation>
+ <translation>tarafından alanlar ayrıldı</translation>
</message>
<message>
<source>Comments start with</source>
@@ -770,11 +919,7 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
<message>
<source>First record has field names</source>
- <translation>İlk kayıt alan adlarını içerir</translation>
- </message>
- <message>
- <source>Number of headers line to discard</source>
- <translation>Vazgeçilecek başlık satırı adedi</translation>
+ <translation>İlk kaydın alan adları var</translation>
</message>
<message>
<source>Consider &apos;\&apos; an escape character</source>
@@ -782,15 +927,15 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
<message>
<source>Preview</source>
- <translation>Ön izle</translation>
+ <translation>Ön izleme</translation>
</message>
<message>
<source>Column layout</source>
- <translation>Kolon dizimi</translation>
+ <translation>Sütun düzeni</translation>
</message>
<message>
<source>Not present in CSV file</source>
- <translation>CSV içerisinde mevcut değil</translation>
+ <translation>CSV dosyasında mevcut değil</translation>
</message>
<message>
<source>Imported from CSV file</source>
@@ -798,7 +943,7 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
<message>
<source>Original data: </source>
- <translation>Özgün veri:</translation>
+ <translation>Orijinal veri:</translation>
</message>
<message>
<source>Error</source>
@@ -818,7 +963,7 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n daha fazla ileti atlandı]</numerusform><numerusform>[%n daha fazla ileti atlandı]</numerusform></translation>
+ <translation><numerusform>[%n daha fazla mesaj atlandı]</numerusform><numerusform>[%n daha fazla mesaj atlandı]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -826,6 +971,22 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
<translation>CSV içe aktarma: yazarken hatalar var:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -867,10 +1028,6 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
<translation>Veritabanını okurken hata oluştu: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Kaydedilemedi, veritabanında dosya adı yok.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Dosya salt okunur kipinde açıldığı için yazılamıyor.</translation>
</message>
@@ -878,6 +1035,27 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Anahtar dönüştürülmedi. Bu bir hatadır, lütfen geliştiricilere bildirin!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Geri Dönüşüm Kutusu</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1067,14 @@ Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Ana anahtar gir</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Anahtar Dosyası:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Parola:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Gözat</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Yenile</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Karşılaştırma Yanıtı:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Eski anahtar dosya biçimi</translation>
</message>
@@ -943,20 +1105,96 @@ Lütfen yeni bir anahtar dosyası oluşturmayı düşünün.</translation>
<translation>Anahtar dosyası seç</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>Hızlı kilit açma için TouchID</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Veritabanı açılamadı:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Anahtar dosyası açılamıyor:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Gözat...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Temizle</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>Dosya seç...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -990,7 +1228,7 @@ Lütfen yeni bir anahtar dosyası oluşturmayı düşünün.</translation>
</message>
<message>
<source>Browser Integration</source>
- <translation>Tarayıcı Tümleşmesi</translation>
+ <translation>Tarayıcı Bütünleşmesi</translation>
</message>
</context>
<context>
@@ -1009,7 +1247,7 @@ Lütfen yeni bir anahtar dosyası oluşturmayı düşünün.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation>KeePassHTTP niteliklerini &amp;özel verilere taşı</translation>
+ <translation>KeePassHTTP özniteliklerini KeePassXC-Tarayıcı &amp;özel verisine taşıyın</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1074,8 +1312,8 @@ Bu işlem, tarayıcı eklentisi bağlantısını engelleyebilir.</translation>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation>%n girişindeki izinler kaldırıldı.
-Girişlere erişim izinleri iptal edilecek.</translation>
+ <translation>Gerçekten her girdideki tüm siteye özgü ayarları unutmak istiyor musunuz?
+Girdilere erişim izinleri iptal edilecek.</translation>
</message>
<message>
<source>Removing stored permissions…</source>
@@ -1091,7 +1329,7 @@ Girişlere erişim izinleri iptal edilecek.</translation>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>%n girişindeki izinler başarıyla kaldırıldı.</numerusform><numerusform>%n girişindeki izinler başarıyla kaldırıldı.</numerusform></translation>
+ <translation><numerusform>%n girişindeki izinler başarıyla kaldırıldı.</numerusform><numerusform>%n girdiden izinler başarıyla kaldırıldı.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1099,7 +1337,7 @@ Girişlere erişim izinleri iptal edilecek.</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
- <translation>Etkin veritabanı, izinleri olan bir girdi içermiyor.</translation>
+ <translation>Etkin veritabanı izinleri olan bir girdi içermiyor.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
@@ -1111,6 +1349,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Tüm eski tarayıcı bütünleşme verilerini gerçekten en son standarda taşımak istiyor musunuz?
Tarayıcı eklentisiyle uyumluluğu korumak için bu gereklidir.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1236,12 +1482,12 @@ Eğer bu sayı ile devam ederseniz, veritabanınız çok kolay çözülerek kır
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform>MB</numerusform><numerusform>MB</numerusform></translation>
+ <translation><numerusform>Mıb</numerusform><numerusform>MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>iş parçacığı</numerusform><numerusform>iş parçacığı</numerusform></translation>
+ <translation><numerusform>iş parçacığı</numerusform><numerusform>iş parçacıkları</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1251,7 +1497,58 @@ Eğer bu sayı ile devam ederseniz, veritabanınız çok kolay çözülerek kır
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
+ <translation><numerusform>%1 s</numerusform><numerusform>%1 sn</numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>Veritabanı biçimi</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Bellek kullanımı</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1270,7 +1567,7 @@ Eğer bu sayı ile devam ederseniz, veritabanınız çok kolay çözülerek kır
</message>
<message>
<source>Default username:</source>
- <translation>Öntanımlı kullanıcı adı:</translation>
+ <translation>Varsayılan kullanıcı adı:</translation>
</message>
<message>
<source>History Settings</source>
@@ -1300,6 +1597,39 @@ Eğer bu sayı ile devam ederseniz, veritabanınız çok kolay çözülerek kır
<source>Enable &amp;compression (recommended)</source>
<translation>&amp;Sıkıştırmayı etkinleştir (önerilir)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1349,7 +1679,7 @@ Eğer bu sayı ile devam ederseniz, veritabanınız çok kolay çözülerek kır
</message>
<message>
<source>No password set</source>
- <translation>Şifre ayarlanmadı</translation>
+ <translation>Parola ayarlanmadı</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
@@ -1367,6 +1697,10 @@ Parola olmadan devam etmek istediğinize emin misiniz?</translation>
<source>Failed to change master key</source>
<translation>Ana anahtar değiştirilemedi</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1712,129 @@ Parola olmadan devam etmek istediğinize emin misiniz?</translation>
<source>Description:</source>
<translation>Açıklama:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>İstatistikler</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Adı</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Değer</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>evet</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1411,7 +1868,7 @@ Parola olmadan devam etmek istediğinize emin misiniz?</translation>
</message>
<message>
<source>Export database to CSV file</source>
- <translation>Veritabanını CSV dosyasına dışa aktar</translation>
+ <translation>Veritabanını CSV dosyasına aktar</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
@@ -1428,10 +1885,6 @@ This is definitely a bug, please report it to the developers.</source>
Bu kesinlikle bir hatadır, lütfen geliştiricilere bildirin.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Veritabanı dosyası mevcut değil veya erişilebilir değil.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>CSV dosyası seç</translation>
</message>
@@ -1454,6 +1907,30 @@ Bu kesinlikle bir hatadır, lütfen geliştiricilere bildirin.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Salt okunur]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1463,15 +1940,15 @@ Bu kesinlikle bir hatadır, lütfen geliştiricilere bildirin.</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
- <translation>&quot;%1&quot; girdisini tümüyle silmek istediğinize emin misiniz?</translation>
+ <translation>&quot;%1&quot; girdisini gerçekten tamamen silmek istiyor musunuz?</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
- <translation>&quot;%1&quot; girdisini geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</translation>
+ <translation>&quot;%1&quot; girdisini gerçeten geri dönüşüm kutusuna taşımak istiyor musunuz?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>%n girdiyi geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</numerusform><numerusform>%n girdiyi geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</numerusform></translation>
+ <translation><numerusform>%n girdiyi geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</numerusform><numerusform>%n girdiyi gerçekten geri dönüşüm kutusuna taşımak istiyor musunuz?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1483,11 +1960,11 @@ Bu kesinlikle bir hatadır, lütfen geliştiricilere bildirin.</translation>
</message>
<message>
<source>Remember my choice</source>
- <translation>Seçimimi anımsa</translation>
+ <translation>Seçimimi hatırla</translation>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
- <translation>&quot;%1&quot; kümesini tümüyle silmek istediğinize emin misiniz?</translation>
+ <translation>&quot;%1&quot; grubunu gerçekten tamamen silmek istiyor musunuz?</translation>
</message>
<message>
<source>No current database.</source>
@@ -1533,7 +2010,7 @@ Değişikliklerinizi birleştirmek ister misiniz?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>%n girişlerini gerçekten kalıcı olarak silmek istiyor musunuz?</numerusform><numerusform>%n girişlerini gerçekten kalıcı olarak silmek istiyor musunuz?</numerusform></translation>
+ <translation><numerusform>%1 girdiyi tümüyle silmek istediğinize emin misiniz?</numerusform><numerusform>%1 girdiyi tümüyle silmek istediğinize emin misiniz?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
@@ -1544,16 +2021,12 @@ Değişikliklerinizi birleştirmek ister misiniz?</translation>
<translation><numerusform>Girdiyi geri dönüşüm kutusuna taşı?</numerusform><numerusform>Girdiyi geri dönüşüm kutusuna taşı?</numerusform></translation>
</message>
<message>
- <source>File opened in read only mode.</source>
- <translation>Dosya salt okunur modda açıldı.</translation>
- </message>
- <message>
<source>Lock Database?</source>
<translation>Veritabanını Kilitle?</translation>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation>Bir girişi düzenliyorsunuz. Değişiklikleri iptal et ve yine de kilitle?</translation>
+ <translation>Bir girdiyi düzenliyorsunuz. Yine de değişiklikleri iptal et ve kilitle?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1588,12 +2061,6 @@ Disable safe saves and try again?</source>
Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Veritabanına yazma başarısız
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Parolalar</translation>
</message>
@@ -1623,7 +2090,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation>&quot;%1&quot; kümesini geri dönüşüm kutusuna taşımak istiyor musunuz?</translation>
+ <translation>&quot;%1&quot; kümesini gerçekten geri dönüşüm kutusuna taşımak istiyor musunuz?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
@@ -1637,12 +2104,20 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Shared group...</source>
<translation>Paylaşılan küme...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Veritabanını yazma başarısız oldu: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
<message>
<source>Entry</source>
- <translation>Girdi</translation>
+ <translation>Giriş</translation>
</message>
<message>
<source>Advanced</source>
@@ -1666,7 +2141,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>SSH Agent</source>
- <translation>SSH İstemcisi</translation>
+ <translation>SSH İstemci</translation>
</message>
<message>
<source>n/a</source>
@@ -1682,7 +2157,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>File too large to be a private key</source>
- <translation>Dosya özel anahtar olmak için çok büyük</translation>
+ <translation>Dosya bir özel anahtar olmak için çok büyük</translation>
</message>
<message>
<source>Failed to open private key</source>
@@ -1690,15 +2165,15 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Entry history</source>
- <translation>Girdi geçmişi</translation>
+ <translation>Giriş geçmişi</translation>
</message>
<message>
<source>Add entry</source>
- <translation>Girdi ekle</translation>
+ <translation>Giriş ekle</translation>
</message>
<message>
<source>Edit entry</source>
- <translation>Girdiyi düzenle</translation>
+ <translation>Girişi düzenle</translation>
</message>
<message>
<source>Different passwords supplied.</source>
@@ -1710,7 +2185,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Are you sure you want to remove this attribute?</source>
- <translation>Bu özniteliği silmek istediğinizden emin misiniz?</translation>
+ <translation>Bu özniteliği kaldırmak istediğinizden emin misiniz?</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -1756,6 +2231,18 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Confirm Removal</source>
<translation>Kaldırmayı Onayla</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Tarayıcı Bütünleşmesi</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1785,7 +2272,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Attachments</source>
- <translation>Ekler</translation>
+ <translation>Dosya ekleri</translation>
</message>
<message>
<source>Foreground Color:</source>
@@ -1795,20 +2282,56 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Background Color:</source>
<translation>Arka Plan Rengi:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
- <translation>Bu girdi için Oto-Yazımı etkinleştir</translation>
+ <translation>Bu giriş için Oto-Yazımı etkinleştir</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation>Öntanımlı Oto-Yazım dizilişini &amp;kümeden devral</translation>
+ <translation>&amp;Kümeden öntanımlı Oto-Yazım sırasını devral</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
- <translation>Özel Oto-Yazım dizilişi k&amp;ullan:</translation>
+ <translation>Özel Oto-Yazım sırası k&amp;ullan:</translation>
</message>
<message>
<source>Window Associations</source>
@@ -1830,6 +2353,77 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Use a specific sequence for this association:</source>
<translation>Bu ilişki için belirli bir sıra kullan:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Genel</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Ekle</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Kaldır</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2443,26 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Delete all</source>
<translation>Tümünü sil</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1886,7 +2500,63 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Expires</source>
- <translation>Biter</translation>
+ <translation>Geçersiz</translation>
+ </message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1897,7 +2567,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Remove key from agent after</source>
- <translation>Anahtarı istemciden sonra kaldır</translation>
+ <translation>Sonra vekilden anahtarı kaldır</translation>
</message>
<message>
<source> seconds</source>
@@ -1909,15 +2579,15 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
- <translation>Veritabanı kapalı/kilitliyken istemciden anahtarı kaldır</translation>
+ <translation>Veritabanı kapalı/kilitliyken vekilden anahtarı kaldır</translation>
</message>
<message>
<source>Public key</source>
- <translation>Açık anahtar</translation>
+ <translation>Genel anahtar</translation>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation>Veritabanı kapalı/kilitliyken istemciye anahtar ekle</translation>
+ <translation>Veritabanı kapalı/kilitliyken vekile anahtar ekle</translation>
</message>
<message>
<source>Comment</source>
@@ -1950,19 +2620,35 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Attachment</source>
- <translation>Dosya Eki</translation>
+ <translation>Dosya eki</translation>
</message>
<message>
<source>Add to agent</source>
- <translation>İstemciye ekle</translation>
+ <translation>Vekile ekle</translation>
</message>
<message>
<source>Remove from agent</source>
- <translation>İstemciden kaldır</translation>
+ <translation>Vekilden kaldır</translation>
</message>
<message>
<source>Require user confirmation when this key is used</source>
- <translation>Bu tuş kullanıldığında kullanıcı onayı iste</translation>
+ <translation>Bu anahtar kullanıldığında kullanıcı onayı iste</translation>
+ </message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1989,16 +2675,20 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Enable</source>
- <translation>Etkinleştir</translation>
+ <translation>Etkin</translation>
</message>
<message>
<source>Disable</source>
- <translation>Devre dışı bırak</translation>
+ <translation>Devre dışı</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
<translation>Üst kümeden devral (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Girdi kaydedilmemiş değişikliklere sahip</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,75 +2717,105 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<translation>Etkisiz</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Yoldan içe aktar</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare imzalanmamış kapsayıcı</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare imzalanmış kapsayıcı</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Yola aktar</translation>
+ <source>Select import source</source>
+ <translation>İçe aktarım kaynağını seç</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Yol ile eşitle</translation>
+ <source>Select export target</source>
+ <translation>Dışa aktarma hedefini seç</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>KeePassXC sürümünüz kapsayıcı tür paylaşımını desteklemez. Lütfen %1 kullanın.</translation>
+ <source>Select import/export file</source>
+ <translation>Aktarma dosyasını seç içe/dışa</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Veritabanı paylaşımı devre dışı</translation>
+ <source>Clear</source>
+ <translation>Temizle</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Veritabanı dışa aktarımı devre dışı</translation>
+ <source>Import</source>
+ <translation>İçe aktar</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Veritabanı içe aktarımı devre dışı</translation>
+ <source>Export</source>
+ <translation>Dışa aktar</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>KeeShare imzalanmamış kapsayıcı</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>KeeShare imzalanmış kapsayıcı</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>İçe aktarım kaynağını seç</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Dışa aktarma hedefini seç</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Aktarma dosyasını seç içe/dışa</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Temizle</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>%1 dışa aktarma kapsayıcı zaten referans alındı.</translation>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>%1 içe aktarma kapsayıcı zaten içe aktarıldı</translation>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>%1 kapsayıcı, farklı kümelere göre içe ve dışa aktarıldı.</translation>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
<message>
<source>Name</source>
- <translation>Ad</translation>
+ <translation>Adı</translation>
</message>
<message>
<source>Notes</source>
@@ -2103,7 +2823,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Expires</source>
- <translation>Biter</translation>
+ <translation>Geçersiz</translation>
</message>
<message>
<source>Search</source>
@@ -2121,6 +2841,34 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Set default Auto-Type se&amp;quence</source>
<translation>Öntanımlı Oto-Yazım &amp;dizilişi belirle</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2130,7 +2878,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Use custo&amp;m icon</source>
- <translation>Öze&amp;l simge kullan</translation>
+ <translation>Özel si&amp;mge kullan</translation>
</message>
<message>
<source>Add custom icon</source>
@@ -2146,7 +2894,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>Simge alınamadı.</translation>
+ <translation>Site simgesi alınamadı.</translation>
</message>
<message>
<source>Images</source>
@@ -2157,22 +2905,10 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<translation>Tüm dosyalar</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Özel simge zaten var</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Silmeyi Onayla</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Özel simge başarıyla indirildi</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>İpucu: DuckDuckGo&apos;yu bir geri dönüş olarak etkinleştirebilirsiniz. Araçlar/Ayarlar/Güvenlik</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Resim Seç</translation>
</message>
@@ -2194,7 +2930,43 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Bu simge %n girişi tarafından kullanılır ve öntanımlı simge ile değiştirilir. Silmek istediğinize emin misiniz?</numerusform><numerusform>Bu simge %n girişi tarafından kullanılır ve öntanımlı simge ile değiştirilir. Silmek istediğinize emin misiniz?</numerusform></translation>
+ <translation><numerusform>Bu simge %n girdi tarafından kullanılıyor ve öntanımlı simge tarafından değiştirilecek. Silmek istediğinize emin misiniz?</numerusform><numerusform>Bu simge %n girdi tarafından kullanılıyor ve öntanımlı simge tarafından değiştirilecek. Silmek istediğinize emin misiniz?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2231,7 +3003,6 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
<translation>Seçilen eklenti verilerini gerçekten silmek istiyor musunuz?
-
Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
@@ -2242,6 +3013,30 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<source>Value</source>
<translation>Değer</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2254,7 +3049,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<name>EntryAttachmentsModel</name>
<message>
<source>Name</source>
- <translation>Ad</translation>
+ <translation>Adı</translation>
</message>
<message>
<source>Size</source>
@@ -2289,7 +3084,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>%n eki kaldırmak istediğinize emin misiniz?</numerusform><numerusform>%n eki kaldırmak istediğinize emin misiniz?</numerusform></translation>
+ <translation><numerusform>%n dosya eklerini kaldırmak istediğinizden emin misiniz?</numerusform><numerusform>%n dosya ekini kaldırmak istediğinizden emin misiniz?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2335,15 +3130,35 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<source>Unable to open file(s):
%1</source>
<translation><numerusform>Dosyalar açılamıyor:
-%1</numerusform><numerusform>Dosyalar açılamıyor:
+%1</numerusform><numerusform>Dosya(lar) açılamıyor:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Dosya ekleri</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
<message>
<source>Name</source>
- <translation>Ad</translation>
+ <translation>Adı</translation>
</message>
</context>
<context>
@@ -2402,7 +3217,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Expires</source>
- <translation>Biter</translation>
+ <translation>Geçersiz</translation>
</message>
<message>
<source>Created</source>
@@ -2418,7 +3233,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Attachments</source>
- <translation>Ekler</translation>
+ <translation>Dosya ekleri</translation>
</message>
<message>
<source>Yes</source>
@@ -2432,10 +3247,6 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>TOTP Jetonu Oluştur</translation>
- </message>
- <message>
<source>Close</source>
<translation>Kapat</translation>
</message>
@@ -2453,7 +3264,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Expiration</source>
- <translation>Süre bitimi</translation>
+ <translation>Geçerlilik</translation>
</message>
<message>
<source>URL</source>
@@ -2520,6 +3331,14 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<source>Share</source>
<translation>Paylaş</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Gelişmiş</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2553,11 +3372,33 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Geri Dönüşüm Kutusu</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2576,6 +3417,58 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>İptal</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Kapat</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Durum</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Tamam</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2597,16 +3490,12 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<translation>challenge-response açılamıyor.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Yanlış anahtar veya veritabanı dosyası bozuk.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>eksik veritabanı başlıkları</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation>Başlık sağlama ile eşleşmiyor</translation>
+ <translation>Başlık, karma ile eşleşmiyor</translation>
</message>
<message>
<source>Invalid header id size</source>
@@ -2620,12 +3509,17 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<source>Invalid header data length</source>
<translation>Geçersiz başlık veri genişliği</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>challenge-response açılamıyor.</translation>
+ <translation>Karşılama yanıtı açılamıyor.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2651,10 +3545,6 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<translation>Başlık SHA256 verisi uyuşmuyor</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Yanlış anahtar veya veritabanı dosyası bozuk. (HMAC uyuşmuyor)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Bilinmeyen şifre</translation>
</message>
@@ -2702,7 +3592,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<message>
<source>Invalid variant map entry name length</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
- <translation>Geçersiz değişken harita giriş adı uzunluğu</translation>
+ <translation>Geçersiz değişken harita girdi adı uzunluğu</translation>
</message>
<message>
<source>Invalid variant map entry name data</source>
@@ -2754,6 +3644,15 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Geçersiz değişken harita alan tipi boyutu</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2773,7 +3672,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<message>
<source>Failed to serialize KDF parameters variant map</source>
<extracomment>Translation comment: variant map = data structure for storing meta data</extracomment>
- <translation>KDF parametreleri değişken haritası serileştirme başarısız</translation>
+ <translation>KDF parametreleri değişken harita serileştirme başarısız</translation>
</message>
</context>
<context>
@@ -2796,15 +3695,15 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Geçersiz dönüşüm çekirdek boyutu</translation>
+ <translation>Geçersiz dönüşüm çekirdeği boyutu</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
- <translation>Geçersiz dönüşüm tur boyutu</translation>
+ <translation>Geçersiz dönüşüm turu boyutu</translation>
</message>
<message>
<source>Invalid start bytes size</source>
- <translation>Geçersiz başlangıç bayt boyutu</translation>
+ <translation>Geçersiz başlangıç baytı boyutu</translation>
</message>
<message>
<source>Invalid random stream id size</source>
@@ -2857,7 +3756,7 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski Kee
</message>
<message>
<source>Missing icon uuid or data</source>
- <translation>Simge UUID&apos;si veya verisi eksik</translation>
+ <translation>Simge UUID veya verisi eksik</translation>
</message>
<message>
<source>Missing custom data key or value</source>
@@ -2873,15 +3772,15 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski Kee
</message>
<message>
<source>Invalid group icon number</source>
- <translation>Geçersiz küme simge numarası</translation>
+ <translation>Geçersiz küme simgesi numarası</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
- <translation>Geçersiz Oto-Yazım Etkin değeri</translation>
+ <translation>Geçersiz Oto-Yazım Etkinleştirme değeri</translation>
</message>
<message>
<source>Invalid EnableSearching value</source>
- <translation>Geçersiz Arama Etkin değeri</translation>
+ <translation>Geçersiz Arama Etkinleşirme değeri</translation>
</message>
<message>
<source>No group uuid found</source>
@@ -2901,11 +3800,11 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski Kee
</message>
<message>
<source>Invalid entry icon number</source>
- <translation>Geçersiz simge numarası girdisi</translation>
+ <translation>Geçersiz girdi simgesi numarası</translation>
</message>
<message>
<source>History element in history entry</source>
- <translation>Geçmiş girdisinde geçmiş element</translation>
+ <translation>Geçmiş girdisinde geçmiş öğesi</translation>
</message>
<message>
<source>No entry uuid found</source>
@@ -2929,7 +3828,7 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski Kee
</message>
<message>
<source>Entry binary key or value missing</source>
- <translation>Giriş ikili anahtar veya değeri eksik</translation>
+ <translation>Girdi ikili anahtari veya değeri eksik</translation>
</message>
<message>
<source>Auto-type association window or sequence missing</source>
@@ -2949,7 +3848,7 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski Kee
</message>
<message>
<source>Invalid color rgb part</source>
- <translation>Geçersiz renk RGB parçası</translation>
+ <translation>Geçersiz renk RGB bölümü</translation>
</message>
<message>
<source>Invalid number value</source>
@@ -2962,7 +3861,7 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski Kee
<message>
<source>Unable to decompress binary</source>
<extracomment>Translator meant is a binary data inside an entry</extracomment>
- <translation>İkili dosya sıkıştırmasını açma başarısız</translation>
+ <translation>İkili sıkıştırma açılamıyor</translation>
</message>
<message>
<source>XML error:
@@ -2976,13 +3875,13 @@ Satır %2, sütun %3</translation>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>KeePass1 veritabanı içe aktar</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Veritabanı açılamıyor.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3013,15 +3912,15 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Invalid number of entries</source>
- <translation>Geçersiz giriş numarası</translation>
+ <translation>Geçersiz girdi sayısı</translation>
</message>
<message>
<source>Invalid content hash size</source>
- <translation>Geçersiz içerik karma boyutu</translation>
+ <translation>Geçersiz içerik karması boyutu</translation>
</message>
<message>
<source>Invalid transform seed size</source>
- <translation>Geçersiz dönüşüm çekirdek boyutu</translation>
+ <translation>Geçersiz dönüşüm çekirdeği boyutu</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
@@ -3040,10 +3939,6 @@ Satır %2, sütun %3</translation>
<translation>Ana anahtar hesaplanamıyor</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Yanlış anahtar veya veritabanı dosyası bozuk.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Anahtar dönüştürme başarısız</translation>
</message>
@@ -3109,7 +4004,7 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Invalid entry uuid field size</source>
- <translation>Geçersiz Evrensel Benzersiz Tanımlayıcı alan boyutu girişi</translation>
+ <translation>Geçersiz giriş UUID alan boyutu</translation>
</message>
<message>
<source>Invalid entry group id field size</source>
@@ -3117,7 +4012,7 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Invalid entry icon field size</source>
- <translation>Geçersiz giriş simgesi alan boyutu</translation>
+ <translation>Geçersiz giriş simge alanı boyutu</translation>
</message>
<message>
<source>Invalid entry creation time field size</source>
@@ -3129,50 +4024,67 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Invalid entry expiry time field size</source>
- <translation>Geçersiz giriş süre sonu alan boyutu</translation>
+ <translation>Geçersiz giriş zaman aşımı alan boyutu</translation>
</message>
<message>
<source>Invalid entry field type</source>
- <translation>Geçersiz girdi alanı tipi</translation>
+ <translation>Geçersiz giriş alan tipi</translation>
</message>
<message>
<source>unable to seek to content position</source>
<translation>içerik konumuna ulaşılamıyor</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Engelli paylaşım</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>Şuradan içe aktar</translation>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Dışa aktar</translation>
+ <source>Imported from %1</source>
+ <translation>%1 den içe aktarıldı</translation>
+ </message>
+ <message>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Şununla eşitle</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Paylaşım devre dışı %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>%1 paylaşımından içe aktar</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>%1 paylaşımına aktar</translation>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>%1 paylaşımına eşitle</translation>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3217,10 +4129,6 @@ Satır %2, sütun %3</translation>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Gözat</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Oluştur</translation>
</message>
@@ -3258,7 +4166,7 @@ Message: %2</source>
</message>
<message>
<source>All files</source>
- <translation>Tüm dosyalar</translation>
+ <translation>Bütün dosyalar</translation>
</message>
<message>
<source>Create Key File...</source>
@@ -3276,6 +4184,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>Bir anahtar dosyası seç</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Gözat...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3285,7 +4230,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Recent databases</source>
- <translation>&amp;Son veritabanları</translation>
+ <translation>&amp;Geçmiş veritabanları</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -3313,7 +4258,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Open database...</source>
- <translation>&amp;Veritabanı aç...</translation>
+ <translation>Veri&amp;tabanı aç...</translation>
</message>
<message>
<source>&amp;Save database</source>
@@ -3364,12 +4309,8 @@ Message: %2</source>
<translation>&amp;Ayarlar</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Parola oluşturucu</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
- <translation>Veritabanlarını &amp;kilitle</translation>
+ <translation>Veritabanlarını kilit&amp;le</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -3405,7 +4346,7 @@ Message: %2</source>
</message>
<message>
<source>Copy &amp;TOTP</source>
- <translation>&amp;ZTSP&apos;yi kopyala</translation>
+ <translation>&amp;TOTP&apos;yi kopyala</translation>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
@@ -3439,9 +4380,9 @@ Message: %2</source>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation>UYARI: KeePassXC&apos;nin kararsız inşasını kullanıyorsunuz!
-Yüksek bozulma tehlikesi bulunmaktadır, veri tabanlarınızın yedeğini alın.
-Bu sürüm, üretimde kullanıma uygun değildir.</translation>
+ <translation>UYARI: Kararsız bir KeePassXC yapısı kullanıyorsunuz!
+Yüksek bozulma tehlikesi bulunmaktadır, veritabanlarınızın bir yedeğini alın.
+Bu sürüm, üretim kullanımı için uygun değildir.</translation>
</message>
<message>
<source>&amp;Donate</source>
@@ -3479,7 +4420,7 @@ Keepassxc indirme sayfasında mevcut Appımage kullanmanızı öneririz.</transl
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation>Veritabanından &amp;birleştir...</translation>
+ <translation>Veritabanından &amp;birleştir ...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
@@ -3554,14 +4495,6 @@ Keepassxc indirme sayfasında mevcut Appımage kullanmanızı öneririz.</transl
<translation>TOTP QR Kodunu Göster...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Güncellemeleri kontrol et...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Girişi paylaş</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>NOT: KeePassXC&apos;nin yayın öncesi bir sürümünü kullanıyorsunuz!
@@ -3579,6 +4512,74 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<source>You can always check for updates manually from the application menu.</source>
<translation>Güncellemeleri her zaman elle uygulama menüsünden kontrol edebilirsiniz.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Simge indir</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3596,7 +4597,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation>eski giriş &quot;%1&quot; veritabanıyla birleştirildi</translation>
+ <translation>eski giriş &quot;%1&quot; veritabanından birleştirildi</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
@@ -3638,6 +4639,14 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<source>Adding missing icon %1</source>
<translation>Eksik simge ekle %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3671,7 +4680,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>Simple Settings</source>
- <translation>Basit Ayarlar</translation>
+ <translation>Temel Ayarlar</translation>
</message>
</context>
<context>
@@ -3708,6 +4717,72 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3743,7 +4818,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>No private key payload to decrypt</source>
- <translation>Şifresini çözmek için yüklü özel anahtar yok</translation>
+ <translation>Şifre çözmek için yüklü özel anahtar yok</translation>
</message>
<message>
<source>Trying to run KDF without cipher</source>
@@ -3795,7 +4870,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
- <translation>Cipher IV, MD5 kdf için çok kısa</translation>
+ <translation>Şifre IV, MD5 anahtar türetme işlevi için çok kısa</translation>
</message>
<message>
<source>Unknown KDF: %1</source>
@@ -3807,6 +4882,17 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3832,6 +4918,22 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<source>Generate master password</source>
<translation>Ana parola oluştur</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3861,22 +4963,10 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<translation>Karakter Türleri</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Büyük Harfler</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Küçük Harfler</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Rakamlar</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Özel Karakterler</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Genişletilmiş ASCII</translation>
</message>
@@ -3957,18 +5047,10 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<translation>Gelişmiş</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>A&apos;dan F&apos;ye Büyük Harfler</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>A&apos;dan F&apos;ye Küçük Harfler</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4001,18 +5083,10 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Matematiksel</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Tire</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4060,6 +5134,74 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<source>Regenerate</source>
<translation>Yeniden oluştur</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4067,12 +5209,9 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Seç</translation>
+ <source>Statistics</source>
+ <translation>İstatistikler</translation>
</message>
</context>
<context>
@@ -4109,6 +5248,10 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<source>Merge</source>
<translation>Birleştir</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4162,7 +5305,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>Add a new entry to a database.</source>
- <translation>Veritabanına yeni girdi ekle.</translation>
+ <translation>Veritabanına yeni bir girdi ekle.</translation>
</message>
<message>
<source>Path of the database.</source>
@@ -4201,10 +5344,6 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<translation>Girdi için parola oluştur.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Oluşturulan parola için uzunluk.</translation>
- </message>
- <message>
<source>length</source>
<translation>uzunluk</translation>
</message>
@@ -4254,18 +5393,6 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
<translation>Parola üzerinde gelişmiş inceleme gerçekleştir.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Veritabanının içeriğini çıkar ve yazdır.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Veritabanının çıkarılacağı yol.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>%1 kilidini kaldırmak için parola yerleştir: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4310,10 +5437,6 @@ Kullanılabilir komutlar:
<translation>İki veritabanını birleştir.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Veritabanının nereye birleştirileceği.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Veritabanının nereden birleştirileceği.</translation>
</message>
@@ -4347,11 +5470,11 @@ Kullanılabilir komutlar:
</message>
<message>
<source>error reading from device</source>
- <translation>aygıttan okurken hata</translation>
+ <translation>aygıttan okuma hatası</translation>
</message>
<message>
<source>malformed string</source>
- <translation>kusurlu dizge</translation>
+ <translation>hatalı biçimlendirilmiş dizi</translation>
</message>
<message>
<source>missing closing quote</source>
@@ -4387,11 +5510,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Browser Integration</source>
- <translation>Tarayıcı Tümleşmesi</translation>
- </message>
- <message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] Karşılaştırma Yanıtı - Yuva %2 - %3</translation>
+ <translation>Tarayıcı Bütünleşmesi</translation>
</message>
<message>
<source>Press</source>
@@ -4403,7 +5522,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>SSH Agent</source>
- <translation>SSH İstemcisi</translation>
+ <translation>SSH İstemci</translation>
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
@@ -4421,11 +5540,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Generate a new random password.</source>
- <translation>Yeni bir karışık parola oluştur.</translation>
- </message>
- <message>
- <source>Invalid value for password length %1.</source>
- <translation>%1 parola uzunluğu için geçersiz değer.</translation>
+ <translation>Yeni bir rasgele parola oluştur.</translation>
</message>
<message>
<source>Could not create entry with path %1.</source>
@@ -4461,11 +5576,11 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation>Girişin mevcut TOTP&apos;si panoya kopyalandı!</translation>
+ <translation>Girdinin mevcut TOTP&apos;si panoya kopyalandı!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation>Giriş parolası panoya kopyalandı!</translation>
+ <translation>Girdi parolası panoya kopyalandı!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
@@ -4485,10 +5600,6 @@ Kullanılabilir komutlar:
<translation>sayım</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Parola uzunluğu için geçersiz değer: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Giriş yolu bulunamadı %1.</translation>
</message>
@@ -4498,7 +5609,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Enter new password for entry: </source>
- <translation>Girdi için yeni parola gir: </translation>
+ <translation>Girdi için yeni parola girin: </translation>
</message>
<message>
<source>Writing the database failed: %1</source>
@@ -4613,26 +5724,6 @@ Kullanılabilir komutlar:
<translation>Anahtar dosyası yüklenemedi %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>%1 dosyası mevcut değil.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>%1 dosyası açılamıyor.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Veritabanını okurken hata
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Veritabanını ayrıştırırken hata oluştu
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Oluşturulan parolanın uzunluğu</translation>
</message>
@@ -4645,10 +5736,6 @@ Kullanılabilir komutlar:
<translation>Büyük harfli karakterler kullan</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Sayıları kullan</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Özel karakterler kullan</translation>
</message>
@@ -4762,7 +5849,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Message encryption failed.</source>
- <translation>İleti şifreleme başarısız.</translation>
+ <translation>Mesaj şifreleme başarısız.</translation>
</message>
<message>
<source>No groups found</source>
@@ -4793,10 +5880,6 @@ Kullanılabilir komutlar:
<translation>Yeni veritabanı başarıyla oluşturuldu.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Veritabanını şifrelemek için parola ekle (Boş bırakmak için Enter tuşuna bas):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>%1 AnahtarDosyası oluşturulamadı: %2</translation>
</message>
@@ -4805,10 +5888,6 @@ Kullanılabilir komutlar:
<translation>%1 AnahtarDosyası yüklenemedi:%2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Veritabanından bir girdi kaldır.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Kaldırılacak girdinin yolu.</translation>
</message>
@@ -4864,12 +5943,336 @@ Kullanılabilir komutlar:
<source>Cannot create new group</source>
<translation>Yeni küme oluşturulamıyor</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Sürüm %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Yapı: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Düzeltme: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Dağıtım: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>İşletim sistemi: %1
+MİB mimarisi: %2
+Çekirdek: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Oto-Yazım</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (imzalı ve imzasız paylaşım)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (sadece imzalanmış paylaşım)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (sadece imzasız paylaşım)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Yok</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Etkin eklentiler:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Veritabanı birleştirme işlemi tarafından değiştirilmedi.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
- <translation>Sıkıştırılırken iç zlib hatası:</translation>
+ <translation>Sıkıştırmada dahili zlib hatası:</translation>
</message>
<message>
<source>Error writing to underlying device: </source>
@@ -4885,7 +6288,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Internal zlib error when decompressing: </source>
- <translation>Sıkıştırma açılırken iç zlib hatası:</translation>
+ <translation>Sıkıştırma açılırken dahili zlib hatası:</translation>
</message>
</context>
<context>
@@ -4896,7 +6299,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Internal zlib error: </source>
- <translation>zlib iç hatası:</translation>
+ <translation>Dahili zlib hatası:</translation>
</message>
</context>
<context>
@@ -5001,7 +6404,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Limit search to selected group</source>
- <translation>Aramayı seçilen kümeye sınırla</translation>
+ <translation>Seçilen gruba aramayı sınırla</translation>
</message>
<message>
<source>Search Help</source>
@@ -5018,6 +6421,93 @@ Kullanılabilir komutlar:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Genel</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Küme</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Veritabanı ayarları</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Veritabanı kilidini kaldır</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Veritabanını kilitle</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Yok</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5122,7 +6612,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>All files</source>
- <translation>Tüm dosyalar</translation>
+ <translation>Bütün dosyalar</translation>
</message>
<message>
<source>Select path</source>
@@ -5140,9 +6630,100 @@ Kullanılabilir komutlar:
<source>Signer:</source>
<translation>İmzalayan:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Anahtar</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>İmzalanmış paylaşım kapsayıcısının üzerine yazma desteklenmiyor -dışa aktarma engellendi</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Dışa aktarma kapsayıcısı (%1) yazılamadı</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>İmza gömülemedi: Yazılacak dosya açılamadı (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>İmza gömülemedi: Dosya yazılamadı (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Veritabanı gömülemedi: Yazılacak dosya açılamadı (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Veritabanı gömülemedi: dosya yazılamadı (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>İmzalanmamış paylaşım kapsayıcısının üzerine yazma desteklenmiyor -dışa aktarma engellendi</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Dışa aktarma kapsayıcısı yazılamadı</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Beklenmeyen dışa aktarma hatası oluştu</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>İmzayı kapsayıcıdan içeri aktar</translation>
@@ -5156,6 +6737,10 @@ Kullanılabilir komutlar:
<translation>Sertifikayı kapsayıcıdan içe aktar</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>%3&apos;ten %2 parmak izi ile %1&apos;e güvenmek ister misiniz? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Bu sefer değil</translation>
</message>
@@ -5172,18 +6757,6 @@ Kullanılabilir komutlar:
<translation>Sadece bu seferlik</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>% 1&apos;den içe aktarma başarısız (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>%1&apos;den içe aktarma başarılı (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>%1 den içe aktarıldı</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>İmzalı paylaşım kapsayıcısı desteklenmiyor -içeri alma engellendi</translation>
</message>
@@ -5223,25 +6796,20 @@ Kullanılabilir komutlar:
<source>Unknown share container type</source>
<translation>Bilinmeyen kapsayıcı paylaşım türü</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>İmzalanmış paylaşım kapsayıcısının üzerine yazma desteklenmiyor -dışa aktarma engellendi</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Dışa aktarma kapsayıcısı (%1) yazılamadı</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>İmzalanmamış paylaşım kapsayıcısının üzerine yazma desteklenmiyor -dışa aktarma engellendi</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>% 1&apos;den içe aktarma başarısız (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Dışa aktarma kapsayıcısı yazılamadı</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>%1&apos;den içe aktarma başarılı (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Beklenmeyen dışa aktarma hatası oluştu</translation>
+ <source>Imported from %1</source>
+ <translation>%1 den içe aktarıldı</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5256,10 +6824,6 @@ Kullanılabilir komutlar:
<translation>%1&apos;e aktar</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>%3&apos;ten %2 parmak izi ile %1&apos;e güvenmek ister misiniz? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>%2 içinde %1&apos;e çoklu içe aktarma kaynak yolu</translation>
</message>
@@ -5267,28 +6831,12 @@ Kullanılabilir komutlar:
<source>Conflicting export target path %1 in %2</source>
<translation>Çakışan aktarma hedef yolu %1 %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>İmza gömülemedi: Yazılacak dosya açılamadı (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>İmza gömülemedi: Dosya yazılamadı (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Veritabanı gömülemedi: Yazılacak dosya açılamadı (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Veritabanı gömülemedi: dosya yazılamadı (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
<message>
<source>Timed Password</source>
- <translation>Zamanlı Parola</translation>
+ <translation>Süreli Parola</translation>
</message>
<message>
<source>000000</source>
@@ -5330,10 +6878,6 @@ Kullanılabilir komutlar:
<translation>TOTP Kurulum</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Anahtar:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Öntanımlı RFC 6238 anahtar ayarları</translation>
</message>
@@ -5363,16 +6907,45 @@ Kullanılabilir komutlar:
<translation>Kod boyutu:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 hane</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Algoritma:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7 hane</translation>
+ <source> digits</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 hane</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5430,7 +7003,7 @@ Kullanılabilir komutlar:
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
- <translation>Parolalarınızı KeePassXC veritabanında güvenle depolamaya başlayın</translation>
+ <translation>Parolalarınızı bir KeePassXC veritabanında güvenle depolamaya başlayın</translation>
</message>
<message>
<source>Create new database</source>
@@ -5456,6 +7029,14 @@ Kullanılabilir komutlar:
<source>Welcome to KeePassXC %1</source>
<translation>KeePassXC&apos;ye hoş geldin %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5465,11 +7046,11 @@ Kullanılabilir komutlar:
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation>YubiKey Karşılama Yanıtı</translation>
+ <translation>YubiKey Challenge-Response</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Eğer bir &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt; sahibiyseniz ek güvenlik için kullanabilirsiniz.&lt;/p&gt;&lt;p&gt;YubiKey yuvalarından birinin programlanması gerekir &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Karşılama-Yanıtı&lt;/a&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Eğer bir &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt; sahibiyseniz ek güvenlik için kullanabilirsiniz.&lt;/p&gt;&lt;p&gt;YubiKey yuvalarından birinin programlanması gerekir &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
@@ -5479,5 +7060,13 @@ Kullanılabilir komutlar:
<source>No YubiKey inserted.</source>
<translation>YubiKey eklenmedi.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_uk.ts b/share/translations/keepassx_uk.ts
index bcc711b13..4dda6ee85 100644
--- a/share/translations/keepassx_uk.ts
+++ b/share/translations/keepassx_uk.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
- <translation>Повідомляйте про вади на &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
+ <translation>Повідомляйте про проблеми на &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
@@ -27,7 +27,7 @@
</message>
<message>
<source>Debug Info</source>
- <translation>Зневаджувальна інформація</translation>
+ <translation>Інформація щодо зневадження</translation>
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
@@ -61,7 +61,7 @@
<name>ApplicationSettingsWidget</name>
<message>
<source>Application Settings</source>
- <translation>Налаштування програми</translation>
+ <translation>Налаштування застосунку</translation>
</message>
<message>
<source>General</source>
@@ -95,12 +95,20 @@
<source>Follow style</source>
<translation>Наслідувати стиль</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
<message>
<source>Basic Settings</source>
- <translation>Основні налаштування</translation>
+ <translation>Базове налаштування</translation>
</message>
<message>
<source>Startup</source>
@@ -111,18 +119,6 @@
<translation>Запускати лише один примірник KeePassXC</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>Пам’ятати останні сховища</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>Пам&apos;ятати останні файли ключів та апаратні ключі</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>Завантажувати попереднє сховище під час запуску</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>Згортати вікно після запуску застосунку</translation>
</message>
@@ -163,16 +159,12 @@
<translation>Використовувати для нових записів значок групи</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>Згортати після копіювання до кишені</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>Сховати панель передперегляду запису</translation>
</message>
<message>
<source>General</source>
- <translation>Загальні</translation>
+ <translation>Загальне</translation>
</message>
<message>
<source>Hide toolbar (icons)</source>
@@ -195,10 +187,6 @@
<translation>Після згортання ховати вікно в системний лоток</translation>
</message>
<message>
- <source>Language</source>
- <translation>Мова</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>Автозаповнення</translation>
</message>
@@ -232,20 +220,101 @@
<translation>Затримка початку автозаповнення</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>Перевіряти наявність оновлень під час запуску застосунку</translation>
+ <source>Movable toolbar</source>
+ <translation>Рухома панель інструментів</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>Пропонувати попередні випуски для оновлення</translation>
+ <source>Remember previously used databases</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>Рухома панель інструментів</translation>
+ <source>Load previously open databases on startup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remember database key files and security dongles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> сек</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Button style</source>
- <translation>Стиль кнопок</translation>
+ <source>Global auto-type shortcut</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>Приватність</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>Використовувати DuckDuckGo як запасний варіант при завантаженні значків веб-сторінок</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> хвилин</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>Скопі&amp;ювати ім&apos;я користувача</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>Скопіювати пароль</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -399,6 +500,10 @@
<source>Select entry to Auto-Type:</source>
<translation>Виберіть запис для автозаповнення:</translation>
</message>
+ <message>
+ <source>Search...</source>
+ <translation>Знайти...</translation>
+ </message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 запитує доступ до паролів у таких записах.
Оберіть, чи бажаєте Ви дозволити доступ.</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -457,16 +570,12 @@ Please select the correct database for saving credentials.</source>
<translation>Це необхідно для надання KeePassXC-Переглядачу доступу до Ваших сховищ</translation>
</message>
<message>
- <source>Enable KeepassXC browser integration</source>
- <translation>Сполучити KeePassXC з переглядачами</translation>
- </message>
- <message>
<source>General</source>
- <translation>Загальні</translation>
+ <translation>Загальне</translation>
</message>
<message>
<source>Enable integration for these browsers:</source>
- <translation>Сполучити з такими переглядачами:</translation>
+ <translation>Увімкнути сполучення з такими переглядачами:</translation>
</message>
<message>
<source>&amp;Google Chrome</source>
@@ -503,7 +612,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>Показувати лише найкращі збіги для певного URL замість усіх записів для всієї області. </translation>
+ <translation>Показувати лише найкращі збіги для певного URL замість усіх записів для всієї області.</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
@@ -534,10 +643,6 @@ Please select the correct database for saving credentials.</source>
<translation>Ніколи не запитувати перед оновленням реєстраційних даних</translation>
</message>
<message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>Тільки вибране сховище має бути під&apos;єднаним через клієнта.</translation>
- </message>
- <message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Шукати збіги з реєстраційними даними у всіх відкритих сховищах</translation>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>Переглядач &amp;Tor</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;Попередження:&lt;/b&gt; застосунок keepassxc-proxy не знайдено!&lt;br /&gt;Будь ласка, перевірте наявність застосунку в директорії встановлення KeePassXC або підтвердьте власний шлях у розширених налаштуваннях.&lt;br /&gt;Сполучення з переглядачем &lt;b&gt;не працюватими&lt;/b&gt; без посередницького застосунку.&lt;br /&gt;Очікуваний шлях: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>Виконувані файли</translation>
</message>
@@ -621,6 +722,50 @@ Please select the correct database for saving credentials.</source>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>Для сполучення з переглядачем необхідний KeePassXC-Browser. &lt;br /&gt;Завантажте його для %1 та %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -710,10 +855,14 @@ Do you want to create this group?
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation>Ваші параметри KeePassXC-Переглядача мають бути переміщені до параметрів сховища.
+ <translation>Ваші параметри KeePassXC-Переглядача мають бути переміщени до параметрів сховища.
Це необхідно для підтримання сполучень з Вашим поточним переглядачем.
Бажаєте перемістити параметри зараз?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>Більше не показувати це попередження</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -773,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Перший запис має назви полів</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>Кількість рядків заголовка, які треба пропустити</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>Використовувати &apos;\&apos; для захисту символів</translation>
</message>
@@ -826,6 +971,22 @@ Would you like to migrate your existing settings now?</source>
<translation>Імпорт CSV: помилки записувача:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -844,7 +1005,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n рядок</numerusform><numerusform>%n рядки</numerusform><numerusform>%n рядків</numerusform><numerusform>%n рядків</numerusform></translation>
+ <translation><numerusform>%n рядок</numerusform><numerusform>%n рядка</numerusform><numerusform>%n рядків</numerusform><numerusform>%n рядків</numerusform></translation>
</message>
</context>
<context>
@@ -867,10 +1028,6 @@ Would you like to migrate your existing settings now?</source>
<translation>Помилка читання сховища: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>Не вдалося зберегти, для сховища не вказане ім&apos;я файлу.</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>Неможливо записати файл, оскільки він відкритий у режимі читання.</translation>
</message>
@@ -878,6 +1035,27 @@ Would you like to migrate your existing settings now?</source>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>Ключ не перетворено через ваду в програмі. Будь ласка, повідомте про це розробникам!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>Смітник</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -889,30 +1067,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>Введіть головний ключ</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>Файл-ключ:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>Пароль:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>Огляд</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>Оновити</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>Виклик-відповідь:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>Застарілий формат файла-ключа</translation>
</message>
@@ -943,20 +1105,96 @@ Please consider generating a new key file.</source>
<translation>Оберіть файл-ключ</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID для швидкого розблокування</translation>
+ <source>Failed to open key file: %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>Неможливо відкрити сховище:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>Не вдається відкрити файл ключа:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Переглянути...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Очистити</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -974,7 +1212,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>General</source>
- <translation>Загальні</translation>
+ <translation>Загальне</translation>
</message>
<message>
<source>Security</source>
@@ -1065,7 +1303,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>Успішно видалено %n ключ шифрування з параметрів KeePassXC.</numerusform><numerusform>Успішно видалено %n ключі шифрування з параметрів KeePassXC.</numerusform><numerusform>Успішно видалено %n ключів шифрування з параметрів KeePassXC.</numerusform><numerusform>Успішно видалено %n ключів шифрування з параметрів KeePassXC.</numerusform></translation>
+ <translation><numerusform>Успішно видалено %n ключ шифрування з параметрів KeePassXC.</numerusform><numerusform>Успішно видалено %n ключа шифрування з параметрів KeePassXC.</numerusform><numerusform>Успішно видалено %n ключів шифрування з параметрів KeePassXC.</numerusform><numerusform>Успішно видалено %n ключів шифрування з параметрів KeePassXC.</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1091,7 +1329,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>Успішно видалено дозволи з %n запису.</numerusform><numerusform>Успішно видалено дозволи з %n записів.</numerusform><numerusform>Успішно видалено дозволи з %n записів.</numerusform><numerusform>Успішно видалено дозволи з %n записів.</numerusform></translation>
+ <translation><numerusform>Успішно видалено дозволи для %n запису.</numerusform><numerusform>Успішно видалено дозволи для %n записів.</numerusform><numerusform>Успішно видалено дозволи для %n записів.</numerusform><numerusform>Успішно видалено дозволи для %n записів.</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1111,6 +1349,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Ви дійсно бажаєте оновити застаріле налаштування сполучення з переглядачами згідно з найновішими стандартами?
Це необхідно для підтримання сумісності з модулем переглядача.</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1236,12 +1482,12 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform></translation>
+ <translation><numerusform> МіБ</numerusform><numerusform> МіБ</numerusform><numerusform> МіБ</numerusform><numerusform> МіБ</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>потік</numerusform><numerusform>потоки</numerusform><numerusform>потоків</numerusform><numerusform>потоків</numerusform></translation>
+ <translation><numerusform>потік</numerusform><numerusform>потоків</numerusform><numerusform>потоків</numerusform><numerusform>потоків</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1251,7 +1497,58 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 мс</numerusform><numerusform>%1 мс</numerusform><numerusform>%1 мс</numerusform><numerusform>%1 с</numerusform></translation>
+ <translation><numerusform>%1 с</numerusform><numerusform>%1 с</numerusform><numerusform>%1 с</numerusform><numerusform>%1 с</numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1286,7 +1583,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source> MiB</source>
- <translation> МіБ</translation>
+ <translation>МіБ</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1300,6 +1597,39 @@ If you keep this number, your database may be too easy to crack!</source>
<source>Enable &amp;compression (recommended)</source>
<translation>Увімкнути стиснення (рекомендовано)</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetKeeShare</name>
@@ -1367,6 +1697,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>Зміна головного ключа зазнала невдачі</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1378,6 +1712,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>Опис:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Назва</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Значення</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1428,10 +1885,6 @@ This is definitely a bug, please report it to the developers.</source>
Це певно є вадою програми, будь ласка, повідомте про це розробникам.</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>Файл сховища не існує або недоступний.</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>Вибрати файл CSV</translation>
</message>
@@ -1454,6 +1907,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [лише читання]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1541,11 +2018,7 @@ Do you want to merge your changes?</source>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>Перемістити запис у смітник?</numerusform><numerusform>Перемістити записи в смітник?</numerusform><numerusform>Перемістити записи в смітник?</numerusform><numerusform>Перемістити записи в смітник?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>Файл відкритий лише для читання.</translation>
+ <translation><numerusform>Перемістити запис в смітник?</numerusform><numerusform>Перемістити записи в смітник?</numerusform><numerusform>Перемістити записи в смітник?</numerusform><numerusform>Перемістити записи в смітник?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1588,12 +2061,6 @@ Disable safe saves and try again?</source>
Вимкнути безпечне збереження і спробувати знов?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>Записати сховище не вдалося.
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>Паролі</translation>
</message>
@@ -1637,6 +2104,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation>Спільна група...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>Записати сховище не вдалося: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1646,7 +2121,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Advanced</source>
- <translation>Розширені</translation>
+ <translation>Розширене</translation>
</message>
<message>
<source>Icon</source>
@@ -1718,11 +2193,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n тиждень</numerusform><numerusform>%n тижня</numerusform><numerusform>%n тижнів</numerusform><numerusform>%n тижнів</numerusform></translation>
+ <translation><numerusform>%n тиждень</numerusform><numerusform>%n тижні</numerusform><numerusform>%n тижнів</numerusform><numerusform>%n тижнів</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
- <translation><numerusform>%n місяць</numerusform><numerusform>%n місяця</numerusform><numerusform>%n місяців</numerusform><numerusform>%n місяців</numerusform></translation>
+ <translation><numerusform>%n місяць</numerusform><numerusform>%n місяці</numerusform><numerusform>%n місяців</numerusform><numerusform>%n місяців</numerusform></translation>
</message>
<message>
<source>Apply generated password?</source>
@@ -1756,6 +2231,18 @@ Disable safe saves and try again?</source>
<source>Confirm Removal</source>
<translation>Схваліть видалення</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>Сполучення з переглядачем</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1795,6 +2282,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>Колір тла:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1830,6 +2353,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation>Використовувати певну послідовність для цієї прив&apos;язки:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Загальні</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Додати</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Видалити</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Змінити</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1849,6 +2443,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>Видалити всі</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1888,6 +2502,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>Знечинюється</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1964,6 +2634,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>Запитувати підтвердження для використання цього ключа</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1999,6 +2685,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>Успадкувати від батьківської групи (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>Запис має незбережені зміни</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2027,68 +2717,98 @@ Disable safe saves and try again?</source>
<translation>Неактивна</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>Імпортувати зі шляху</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>Непідписана оболонка KeeShare</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>Експортувати за шляхом</translation>
+ <source>KeeShare signed container</source>
+ <translation>Підписана оболонка KeeShare</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>Узгодити за шляхом</translation>
+ <source>Select import source</source>
+ <translation>Вибрати джерело імпорту</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>Ваша версія KeePassXC не підтримує спільне використання типу Вашої оболонки. Будь ласка, використайте %1.</translation>
+ <source>Select export target</source>
+ <translation>Вибрати ціль експорту</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>Спільне користування сховищами вимкнено</translation>
+ <source>Select import/export file</source>
+ <translation>Вибрати файл імпорту/експорту</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>Експорт сховищ вимкнено</translation>
+ <source>Clear</source>
+ <translation>Очистити</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>Імпорт сховищ вимкнено</translation>
+ <source>Import</source>
+ <translation>Імпорт</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>Непідписана оболонка KeeShare</translation>
+ <source>Export</source>
+ <translation>Експорт</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>Підписана оболонка KeeShare</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>Вибрати джерело імпорту</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>Вибрати ціль експорту</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>Вибрати файл імпорту/експорту</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>Очистити</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>На експортну оболонку %1 вже існує посилання.</translation>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>Оболонку %1 вже імпортовано.</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>Оболонку %1 імпортують та експортують різні групи.</translation>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2121,6 +2841,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>Встановити типову &amp;послідовність автозаповнення</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2157,22 +2905,10 @@ Disable safe saves and try again?</source>
<translation>Всі файли</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>Свій значок вже існує</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>Схвалити видалення</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>Користувацький занчок успішно завантажено</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>Порада: Ви можете ввімкнути DuckDuckGo як запасний варіант у Інструменти&gt;Налаштування&gt;Безпека</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>Вибрати зображення</translation>
</message>
@@ -2194,7 +2930,43 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation><numerusform>Цей значок використовує %n запис і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform><numerusform>Цей значок використовують %n записи і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform><numerusform>Цей значок використовують %n записів і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform><numerusform>Цей значок використовують %n записів і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform></translation>
+ <translation><numerusform>Цей значок використовують %n запис і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform><numerusform>Цей значок використовують %n записи і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform><numerusform>Цей значок використовують %n записів і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform><numerusform>Цей значок використовують %n записів і його буде замінено на типовий значок. Ви дійсно хочете видалити його?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2241,6 +3013,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>Значення</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2339,6 +3135,26 @@ This may cause the affected plugins to malfunction.</source>
%1</numerusform><numerusform>Неможливо відкрити файли:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>Вкладення</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2433,16 +3249,12 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>Створити позначку ТОП</translation>
- </message>
- <message>
<source>Close</source>
<translation>Закрити</translation>
</message>
<message>
<source>General</source>
- <translation>Загальні</translation>
+ <translation>Загальне</translation>
</message>
<message>
<source>Username</source>
@@ -2521,6 +3333,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>Спільне використання</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Розширене</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2554,11 +3374,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>Смітник</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2577,6 +3419,58 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Скасувати</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрити</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Стан</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Гаразд</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
@@ -2598,10 +3492,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>Неможливо видати виклик-відповідь.</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Неправильний ключ або пошкоджене сховище.</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>відсутні заголовки сховища</translation>
</message>
@@ -2621,6 +3511,11 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>Хибна довжина даних заголовка</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2652,10 +3547,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>Невідповідність заголовку SHA256</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>Неправильний ключ або пошкоджене сховище. (невідповідність HMAC)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>Невідомий шифр</translation>
</message>
@@ -2755,6 +3646,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Хибний розмір типу поля в структурі метаданих</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2977,13 +3877,13 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>Імпортувати сховище KeePass 1</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>Неможливо відкрити сховище.</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -3041,10 +3941,6 @@ Line %2, column %3</source>
<translation>Неможливо обчислити головний ключ</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>Неправильний ключ або пошкоджене сховище.</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>Перетворення ключа зазнало невдачі</translation>
</message>
@@ -3140,40 +4036,57 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>неможливо знайти позицію вмісту</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>Вимкнуте спільне користування</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from %1</source>
+ <translation>Імпортовано з %1</translation>
</message>
<message>
- <source>Import from</source>
- <translation>Імпортувати з</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>Експортувати до</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with</source>
- <translation>Узгодити з</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>Вимкнутий спільний ресурс %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>Імпортувати зі спільного ресурсу %1</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>Експортувати до спільного ресурсу %1</translation>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>Узгодити зі спільним ресурсом %1</translation>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3218,10 +4131,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>Огляд</translation>
- </message>
- <message>
<source>Generate</source>
<translation>Створити</translation>
</message>
@@ -3277,6 +4186,43 @@ Message: %2</source>
<source>Select a key file</source>
<translation>Обрати файл-ключ</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Переглянути...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3365,10 +4311,6 @@ Message: %2</source>
<translation>Нала&amp;штування</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>Генератор паролів</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>Замкнути сховища</translation>
</message>
@@ -3554,14 +4496,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation>Показати QR-код ТОП...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>Перевірити наявність оновлень...</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>Спільне використання запису</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>&lt;b&gt;Примітка&lt;/b&gt;: Ви використовуєте попередній випуск KeePassXC!
@@ -3579,6 +4513,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>Ви завжди можете перевірити наявність оновлень з меню застосунку.</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>Завантажити фавікон</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3638,6 +4640,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>Додавання відсутнього значка %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3708,6 +4718,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3807,6 +4883,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3832,6 +4919,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>Створити головний пароль</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3861,22 +4964,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Види символів</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>Великі літери</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>Малі літери</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>Цифри</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>Спеціальні символи</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>Розширені ASCII</translation>
</message>
@@ -3906,7 +4997,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Copy</source>
- <translation>Скопіювати</translation>
+ <translation>Cкопіювати</translation>
</message>
<message>
<source>Accept</source>
@@ -3954,21 +5045,13 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Advanced</source>
- <translation>Розширені</translation>
- </message>
- <message>
- <source>Upper Case Letters A to F</source>
- <translation>Великі літери від A до F</translation>
+ <translation>Розширене</translation>
</message>
<message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>Маленькі літери від A до F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -4001,18 +5084,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>Мат. символи</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>Риски</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4060,6 +5135,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Regenerate</source>
<translation>Оновити</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>Копіювати пароль</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4067,12 +5210,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>Вибрати</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4109,6 +5249,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>Об&apos;єднати</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4201,10 +5345,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Створити пароль для запису.</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>Довжина створюваного пароля.</translation>
- </message>
- <message>
<source>length</source>
<translation>довжина</translation>
</message>
@@ -4219,7 +5359,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
<message>
<source>Path of the entry to clip.</source>
<comment>clip = copy to clipboard</comment>
- <translation>Шлях до запису, що підлягає копіюванню.</translation>
+ <translation>Шлях до запису, який треба скопіювати.</translation>
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
@@ -4254,18 +5394,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>Виконати поглиблений аналіз пароля.</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>Видобути і надрукувати вміст сховища.</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>Шлях до сховища для видобування.</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>Введіть пароль для розблокування %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4310,10 +5438,6 @@ Available commands:
<translation>Об&apos;єднати два сховища.</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>Шлях до сховища, з яким об&apos;єднати.</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>Шлях до сховища, яке підлягає об&apos;єднанню.</translation>
</message>
@@ -4390,10 +5514,6 @@ Available commands:
<translation>Сполучення з переглядачем</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] виклик-відповідь – гніздо %2 – %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>Натиснути</translation>
</message>
@@ -4424,10 +5544,6 @@ Available commands:
<translation>Створити новий випадковий пароль.</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>Неправильне значення довжини пароля %1.</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>Неможливо створити запис із шляхом %1.</translation>
</message>
@@ -4485,10 +5601,6 @@ Available commands:
<translation>кількість</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>Хибне значення довжини пароля: %1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>Неможливо знайти запис із шляхом %1.</translation>
</message>
@@ -4613,26 +5725,6 @@ Available commands:
<translation>Завантаження файла ключа зазнало невдачі %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>Файл %1 не існує.</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>Неможливо відкрити файл %1.</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>Помилка читання сховища:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>Помилка синтаксичного аналізу сховища:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>Довжина створюваного пароля</translation>
</message>
@@ -4645,10 +5737,6 @@ Available commands:
<translation>Використовувати великі літери</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>Використовувати цифри.</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>Використовувати спеціальні символи</translation>
</message>
@@ -4793,10 +5881,6 @@ Available commands:
<translation>Нове сховище успішно створено.</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>Введіть пароль для шифрування сховища (натисніть Ввід аби залишити пустим): </translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>Створення файла ключа %1 зазнало невдачі: %2</translation>
</message>
@@ -4805,10 +5889,6 @@ Available commands:
<translation>Завантаження файла ключа %1 зазнало невдачі: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>Видалити запис зі сховища.</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>Шлях до запису, що підлягає видаленню.</translation>
</message>
@@ -4864,6 +5944,330 @@ Available commands:
<source>Cannot create new group</source>
<translation>Неможливо створити нову групу</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>Версія %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>Тип збірки: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>Ревізія: %1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>Дистрибутив: %1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>Операційна система: %1
+Архітектура ЦП: %2
+Ядро: %3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>Автозаповнення</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (підписане і непідписане спільне використання)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (тільки підписане спільне використання)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (тільки непідписане спільне використання)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Відсутні</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>Увімкнені розширення:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>Об&apos;єднання не змінило сховище.</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5018,6 +6422,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Загальні</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>Група</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>Налаштування сховища</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>Розблокувати сховище</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>Заблокувати сховище</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Відсутні</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5140,9 +6631,100 @@ Available commands:
<source>Signer:</source>
<translation>Підписувач:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Ключ</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>Перезаписування підписаної спільної оболонки не підтримане – експортування відвернуте</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>Неможливо записати експортну оболонку (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>Неможливо вкласти підпис: неможливо відкрити файл для запису (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>Неможливо вкласти підпис: неможливо записати файл (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>Неможливо вкласти сховище: неможливо відкрити файл для запису (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>Неможливо вкласти сховище: неможливо записати файл (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>Перезаписування непідписаної спільної оболонки не підтримане – експортування відвернуте</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>Неможливо записати експортну оболонку</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>Неочікувана помилка під час експортування</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>Імпортування з оболонки без підпису</translation>
@@ -5156,6 +6738,10 @@ Available commands:
<translation>Імпортування з оболонки, що має сертифікат</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>Довірити %1, що має відбиток %2 з %3? {1 ?} {2 ?}</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>Не зараз</translation>
</message>
@@ -5172,18 +6758,6 @@ Available commands:
<translation>Тільки зараз</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>Імпортування з %1 зазнало невдачі (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>Успішно імпортовано з %1 (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>Імпортовано з %1</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>Підтримання підписаних спільних оболонок відсутнє - імпортування відвернуте</translation>
</message>
@@ -5223,25 +6797,20 @@ Available commands:
<source>Unknown share container type</source>
<translation>Невідомий тип спільної оболонки</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>Перезаписування підписаної спільної оболонки не підтримане – експортування відвернуте</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>Неможливо записати експортну оболонку (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>Перезаписування непідписаної спільної оболонки не підтримане – експортування відвернуте</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>Імпортування з %1 зазнало невдачі (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>Неможливо записати експортну оболонку</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>Успішно імпортовано з %1 (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>Неочікувана помилка під час експортування</translation>
+ <source>Imported from %1</source>
+ <translation>Імпортовано з %1</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5256,10 +6825,6 @@ Available commands:
<translation>Експортування %1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>Довірити %1, що має відбиток %2 з %3? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>Шлях до %1 має декілька джерел імпорту в %2.</translation>
</message>
@@ -5267,22 +6832,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>Суперечливий шлях для експорту %1 у %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>Неможливо вкласти підпис: неможливо відкрити файл для запису (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>Неможливо вкласти підпис: неможливо записати файл (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>Неможливо вкласти сховище: неможливо відкрити файл для запису (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>Неможливо вкласти сховище: неможливо записати файл (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5330,10 +6879,6 @@ Available commands:
<translation>Налаштування ТОП</translation>
</message>
<message>
- <source>Key:</source>
- <translation>Ключ:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>Типове налаштування позначки RFC 6238</translation>
</message>
@@ -5363,16 +6908,45 @@ Available commands:
<translation>Розмір кодування:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 цифр</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>Алгоритм:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7 цифр</translation>
+ <source> digits</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 цифр</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5456,6 +7030,14 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>Ласкаво просимо до KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
@@ -5479,5 +7061,13 @@ Available commands:
<source>No YubiKey inserted.</source>
<translation>YubiKey не підключений.</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_zh_CN.ts b/share/translations/keepassx_zh_CN.ts
index e9ed56c45..1711f3983 100644
--- a/share/translations/keepassx_zh_CN.ts
+++ b/share/translations/keepassx_zh_CN.ts
@@ -43,18 +43,18 @@
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
- <translation>KeePassXC 团队特别感谢 debfx 开发了最初版 KeePassX</translation>
+ <translation>KeePassXC 团队特别感谢 debfx 开发了最初版 KeePassX。</translation>
</message>
</context>
<context>
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>启用 SSH 代理(需要重启)</translation>
+ <translation>启用 SSH 代理(需要重启)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
- <translation>使用OpenSSH for Windows而不是Pageant</translation>
+ <translation>使用 OpenSSH for Windows 而不是 Pageant</translation>
</message>
</context>
<context>
@@ -95,6 +95,14 @@
<source>Follow style</source>
<translation>跟随风格</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>重新设置?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>您确定要将所有常规和安全设置重置为默认设置吗?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -111,18 +119,6 @@
<translation>只启动一个 KeePassXC 实例</translation>
</message>
<message>
- <source>Remember last databases</source>
- <translation>记住最近的数据库</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>记住上次的密钥文件和安全模块</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>在启动时加载最近的数据库</translation>
- </message>
- <message>
<source>Minimize window at application startup</source>
<translation>在应用程序启动时窗口最小化</translation>
</message>
@@ -163,10 +159,6 @@
<translation>新增项目时使用群组图标</translation>
</message>
<message>
- <source>Minimize when copying to clipboard</source>
- <translation>复制到剪贴板后最小化</translation>
- </message>
- <message>
<source>Hide the entry preview panel</source>
<translation>在预览面板中隐藏条目</translation>
</message>
@@ -195,10 +187,6 @@
<translation>将窗口最小化至任务栏</translation>
</message>
<message>
- <source>Language</source>
- <translation>语言</translation>
- </message>
- <message>
<source>Auto-Type</source>
<translation>自动输入</translation>
</message>
@@ -232,20 +220,101 @@
<translation>启用输入时延迟</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>在应用程序启动时检查更新</translation>
+ <source>Movable toolbar</source>
+ <translation>可移动工具栏</translation>
+ </message>
+ <message>
+ <source>Remember previously used databases</source>
+ <translation>记住以前使用的数据库</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>检查更新时包括预发布</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>启动时加载以前打开的数据库</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>可移动工具栏</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>记住数据库密钥文件和安全加密狗</translation>
</message>
<message>
- <source>Button style</source>
- <translation>按钮样式</translation>
+ <source>Check for updates at application startup once per week</source>
+ <translation>每周在应用程序启动时检查更新</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>检查更新时包含Beta版本</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>按钮样式:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>语言:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(重新启动程序激活)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>解锁数据库后最小化窗口</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>打开URL时最小化</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>复制到剪贴板时隐藏窗口</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>最小化</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>放到背景</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>网站图标下载超时:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>网站图标下载超时</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation>秒</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>工具栏按钮样式</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>对记录使用等宽字体</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>语言选择</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>重置为默认值</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>全局自动键入快捷方式</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>自动输入字符输入延迟毫秒</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -320,8 +389,29 @@
<translation>隐私</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>使用 DuckDuckGo 作为下载网站图标的备选</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation>分</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>复制用户名(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>复制 &amp;密码</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -397,7 +498,11 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation>选择自动输入的项目</translation>
+ <translation>选择自动输入的项目:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>搜索……</translation>
</message>
</context>
<context>
@@ -424,6 +529,14 @@ Please select whether you want to allow access.</source>
<translation>%1 请求获取这些条目的密码。
请选择是否允许。</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>允许访问</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>拒绝访问</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
@@ -454,11 +567,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>需要使用 KeePassXC-Browser 浏览器扩展功能访问你的数据库。</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>启用 KeepassXC 浏览器集成</translation>
+ <translation>需要使用 KeePassXC-Browser 浏览器扩展功能访问你的数据库</translation>
</message>
<message>
<source>General</source>
@@ -487,15 +596,15 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Show a &amp;notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>当请求凭据时显示通知</translation>
+ <translation>当请求凭据时显示通知(&amp;N)</translation>
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
- <translation>数据库锁定时请求解锁(Q)</translation>
+ <translation>数据库锁定时请求解锁(&amp;nQ)</translation>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>只返回具有相同形式的条目。 ( http://, https://,... ) </translation>
+ <translation>只返回具有相同形式的条目。 ( http://, https://,... )。</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
@@ -507,17 +616,17 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
- <translation>只返回最匹配的凭据</translation>
+ <translation>&amp;只返回最匹配的凭据</translation>
</message>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>根据名称排列匹配的凭据</translation>
+ <translation>根据名称排列匹配的凭据(&amp;M)</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>根据用户名排列匹配的凭据</translation>
+ <translation>根据用户名排列匹配的凭据(&amp;U)</translation>
</message>
<message>
<source>Advanced</source>
@@ -526,21 +635,17 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>读取凭据时不再询问</translation>
+ <translation>读取凭据时不再询问(&amp;A)</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>更新凭据时不再询问</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>只有选定的数据库必须与一个客户端连接。</translation>
+ <translation>更新凭据时不再询问(&amp;U)</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>在所有打开的的数据库中搜索相符的凭据</translation>
+ <translation>在所有打开的的数据库中搜索相符的凭据(&amp;h)</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
@@ -548,7 +653,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>返回以“KPH:”开头的高级字符串字段(R)</translation>
+ <translation>返回以“KPH:”开头的高级字符串字段(&amp;R)</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
@@ -556,7 +661,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>启动时更新 native messaging 的 manifest 文件</translation>
+ <translation>启动时更新和本机消息传递清单文件(&amp;N)</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -564,7 +669,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Use a &amp;proxy application between KeePassXC and browser extension</source>
- <translation>在 KeePassXC 与浏览器扩展之间使用代理程序</translation>
+ <translation>在 KeePassXC 与浏览器扩展之间使用代理程序(&amp;P)</translation>
</message>
<message>
<source>Use a custom proxy location if you installed a proxy manually.</source>
@@ -573,7 +678,7 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Use a &amp;custom proxy location</source>
<comment>Meant is the proxy for KeePassXC-Browser</comment>
- <translation>设置自定义代理路径</translation>
+ <translation>设置自定义代理路径(&amp;C)</translation>
</message>
<message>
<source>Browse...</source>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>&amp;Tor浏览器</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;警告&lt;/b&gt;,找不到keepassxc 代理应用程序!&lt;br /&gt;请检查KeePassXC安装目录或确认高级选项中的自定义路径。&lt;br /&gt;如果没有代理应用程序,浏览器集成将无法工作.&lt;br /&gt; 可执行路径:</translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>可执行文件</translation>
</message>
@@ -607,7 +708,7 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation>不要请求 http 和基本身份验证的许可</translation>
+ <translation>不要请求 http 和基本身份验证的许可(&amp;B)</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
@@ -621,6 +722,50 @@ Please select the correct database for saving credentials.</source>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>浏览器集成需要KeePassXC-Browser才能工作。&lt;br /&gt;下载%1 和 %2. %3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -675,7 +820,7 @@ Do you want to overwrite it?</source>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation>成功转换了 %1 个条目的属性(s)
+ <translation>成功转换了 %1 个条目的属性。
将 %2 个密钥移动到自定义数据。</translation>
</message>
<message numerus="yes">
@@ -713,6 +858,10 @@ Would you like to migrate your existing settings now?</source>
这是保持当前浏览器连接所必需的。
是否要立即迁移现有设置?</translation>
</message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>不再显示此警告</translation>
+ </message>
</context>
<context>
<name>CloneDialog</name>
@@ -757,25 +906,21 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Text is qualified by</source>
- <translation>文本由此通过验证:</translation>
+ <translation>文本由此通过验证</translation>
</message>
<message>
<source>Fields are separated by</source>
- <translation>字段分隔:</translation>
+ <translation>字段分隔</translation>
</message>
<message>
<source>Comments start with</source>
- <translation>评论以此开头:</translation>
+ <translation>评论以此开头</translation>
</message>
<message>
<source>First record has field names</source>
<translation>第一条记录包含字段名称</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>将丢弃的起始行数</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>将 \ 作为转义字符</translation>
</message>
@@ -813,11 +958,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation>在 CSV 文件中检测到错误(s)!</translation>
+ <translation>在 CSV 文件中检测到错误!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation><numerusform>[%n 信息(s) 被跳过]</numerusform></translation>
+ <translation><numerusform>[%n 跳过更多消息]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@@ -825,6 +970,22 @@ Would you like to migrate your existing settings now?</source>
<translation>CSV 导入: 编辑器错误:
%1</translation>
</message>
+ <message>
+ <source>Text qualification</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV 导入预览</translation>
+ </message>
</context>
<context>
<name>CsvParserModel</name>
@@ -839,11 +1000,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
- <translation><numerusform>%n 字节(s)</numerusform></translation>
+ <translation><numerusform>%n 字节</numerusform></translation>
</message>
<message numerus="yes">
<source>%n row(s)</source>
- <translation><numerusform>%n 行(s)</numerusform></translation>
+ <translation><numerusform>%n 行</numerusform></translation>
</message>
</context>
<context>
@@ -866,10 +1027,6 @@ Would you like to migrate your existing settings now?</source>
<translation>读取数据库时出错: %1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>无法保存,数据库没有文件名。</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>文件无法写入,因为它以只读模式打开。</translation>
</message>
@@ -877,6 +1034,27 @@ Would you like to migrate your existing settings now?</source>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation>密钥未转换。这是一个bug,请报告给开发者!</translation>
</message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>回收站</translation>
+ </message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@@ -888,30 +1066,14 @@ Would you like to migrate your existing settings now?</source>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>输入主密码</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>密钥文件:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>密码:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>浏览</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>刷新</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>挑战应答:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
<translation>旧式密钥文件格式</translation>
</message>
@@ -941,20 +1103,96 @@ Please consider generating a new key file.</source>
<translation>选择密钥文件</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation>TouchID 快速解锁</translation>
+ <source>Failed to open key file: %1</source>
+ <translation>无法打开密钥文件:%1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation>无法打开数据库:
-%1</translation>
+ <source>Select slot...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation>无法打开密钥文件:
-%1</translation>
+ <source>Unlock KeePassXC Database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>浏览...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>清除</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>清除密钥文件</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -999,15 +1237,15 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>&amp;Disconnect all browsers</source>
- <translation>断开与所有浏览器的关联</translation>
+ <translation>断开与所有浏览器的关联(&amp;D)</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation>取消条目上所有特定于站点的设置</translation>
+ <translation>取消条目上所有特定于站点的设置(&amp;E)</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation>将KeePassHTTP属性移动到KeePassXC-Browser和自定义数据</translation>
+ <translation>将KeePassHTTP属性移动到KeePassXC-Browser和自定义数据(&amp;C)</translation>
</message>
<message>
<source>Stored keys</source>
@@ -1063,7 +1301,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation><numerusform>已成功从KeePassXC设置中删除了 %n 个加密密钥(s)。</numerusform></translation>
+ <translation><numerusform>已成功从keepassxc设置中删除 %n 个加密密钥。</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
@@ -1089,7 +1327,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation><numerusform>已成功从 %n 个条目(s)中删除权限。</numerusform></translation>
+ <translation><numerusform>已成功从 %n 个条目中删除权限。</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1109,6 +1347,14 @@ This is necessary to maintain compatibility with the browser plugin.</source>
<translation>您确定要将所有旧版浏览器集成数据移至最新标准吗?
这对于保持与浏览器插件的兼容性是必要的。</translation>
</message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetEncryption</name>
@@ -1239,17 +1485,68 @@ If you keep this number, your database may be too easy to crack!</source>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>线程(s)</numerusform></translation>
+ <translation><numerusform> thread(s)</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
<comment>milliseconds</comment>
- <translation><numerusform>%1 毫秒</numerusform></translation>
+ <translation><numerusform>%1 ms</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 s</source>
<comment>seconds</comment>
- <translation><numerusform>%1 秒</numerusform></translation>
+ <translation><numerusform>%1 s</numerusform></translation>
+ </message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1284,7 +1581,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source> MiB</source>
- <translation>MiB</translation>
+ <translation> MiB</translation>
</message>
<message>
<source>Use recycle bin</source>
@@ -1296,7 +1593,40 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Enable &amp;compression (recommended)</source>
- <translation>启用压缩 (推荐)</translation>
+ <translation>启用压缩(推荐)(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1365,6 +1695,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>无法更改主密钥</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1376,6 +1710,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>描述:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>no</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1413,7 +1870,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Writing the CSV file failed.</source>
- <translation>写入 CSV 文件失败</translation>
+ <translation>写入 CSV 文件失败。</translation>
</message>
<message>
<source>Database creation error</source>
@@ -1426,10 +1883,6 @@ This is definitely a bug, please report it to the developers.</source>
这是一个错误,请向开发人员报告。</translation>
</message>
<message>
- <source>The database file does not exist or is not accessible.</source>
- <translation>数据库文件不存在或无法访问。</translation>
- </message>
- <message>
<source>Select CSV file</source>
<translation>选择CSV文件</translation>
</message>
@@ -1452,6 +1905,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [只读]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1469,7 +1946,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
- <translation><numerusform>你确定要将 %n 个项目移到垃圾桶?</numerusform></translation>
+ <translation><numerusform>您是否想将 %n 个条目移动到回收站吗?</numerusform></translation>
</message>
<message>
<source>Execute command?</source>
@@ -1531,19 +2008,15 @@ Do you want to merge your changes?</source>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation><numerusform>你真的想删除 %n 个条目(s)吗?</numerusform></translation>
+ <translation><numerusform>你真的想删除 %n 个条目吗?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation><numerusform>删除项目(s)?</numerusform></translation>
+ <translation><numerusform>删除条目?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation><numerusform>移动项目(s)到回收站?</numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>文件在只读模式下打开。</translation>
+ <translation><numerusform>将条目移至回收站?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1586,12 +2059,6 @@ Disable safe saves and try again?</source>
禁用安全保存并重试?</translation>
</message>
<message>
- <source>Writing the database failed.
-%1</source>
- <translation>写入数据库失败
-%1</translation>
- </message>
- <message>
<source>Passwords</source>
<translation>密码</translation>
</message>
@@ -1609,7 +2076,7 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation><numerusform>条目&quot;%1&quot;具有 %2 引用。是否要用值覆盖引用、跳过此项或是否无论如何删除引用?</numerusform></translation>
+ <translation><numerusform>条目 &quot;%1&quot; 具有 %2 个引用。 是否要使用值覆盖引用,跳过此条目或删除?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1635,6 +2102,14 @@ Disable safe saves and try again?</source>
<source>Shared group...</source>
<translation>共享群组...</translation>
</message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>写入数据库失败: %1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -1680,7 +2155,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>File too large to be a private key</source>
- <translation>作为一个私钥来说,这个文件太大了。</translation>
+ <translation>文件太大而不能作为私钥</translation>
</message>
<message>
<source>Failed to open private key</source>
@@ -1700,7 +2175,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Different passwords supplied.</source>
- <translation>密码不一致</translation>
+ <translation>密码不一致。</translation>
</message>
<message>
<source>New attribute</source>
@@ -1748,12 +2223,24 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n 年(s)</numerusform></translation>
+ <translation><numerusform>%n 年</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
<translation>确认删除</translation>
</message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>浏览器集成</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;empty URL&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -1793,6 +2280,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>背景色:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1802,11 +2325,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
- <translation>从父群组继承默认的自动输入顺序(G)</translation>
+ <translation>从父&amp;群组继承默认的自动输入顺序</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
- <translation>使用自定义自动输入顺序(U)</translation>
+ <translation>&amp;使用自定义自动输入顺序:</translation>
</message>
<message>
<source>Window Associations</source>
@@ -1828,6 +2351,77 @@ Disable safe saves and try again?</source>
<source>Use a specific sequence for this association:</source>
<translation>使用特定序列进行此关联:</translation>
</message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>常规</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>添加</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>移除</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>编辑</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@@ -1847,6 +2441,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>全部删除</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1886,6 +2500,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>过期</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1962,6 +2632,22 @@ Disable safe saves and try again?</source>
<source>Require user confirmation when this key is used</source>
<translation>使用此密钥时需要用户确认</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1997,6 +2683,10 @@ Disable safe saves and try again?</source>
<source>Inherit from parent group (%1)</source>
<translation>继承自父群组(%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>项目有未保存的更改</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -2025,68 +2715,98 @@ Disable safe saves and try again?</source>
<translation>无效</translation>
</message>
<message>
- <source>Import from path</source>
- <translation>从路径导入</translation>
+ <source>KeeShare unsigned container</source>
+ <translation>keshare 未签名的容器</translation>
</message>
<message>
- <source>Export to path</source>
- <translation>导出到路径</translation>
+ <source>KeeShare signed container</source>
+ <translation>签名容器</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation>与路径同步</translation>
+ <source>Select import source</source>
+ <translation>选择导入源</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation>您的KeePassXC版本不支持共享您的容器类型。请使用%1。</translation>
+ <source>Select export target</source>
+ <translation>选择导出目标</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation>数据库共享已禁用</translation>
+ <source>Select import/export file</source>
+ <translation>选择导入文件</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation>数据库导出被禁用</translation>
+ <source>Clear</source>
+ <translation>清除</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation>数据库导入被禁用</translation>
+ <source>Import</source>
+ <translation>导入</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation>keshare 未签名的容器</translation>
+ <source>Export</source>
+ <translation>输出</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation>签名容器</translation>
+ <source>Synchronize</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import source</source>
- <translation>选择导入源</translation>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select export target</source>
- <translation>选择导出目标</translation>
+ <source>%1 is already being exported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Select import/export file</source>
- <translation>选择导入文件</translation>
+ <source>%1 is already being imported by this database.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Clear</source>
- <translation>清除</translation>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path to share file field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation>导出容器 %1 已被引用。</translation>
+ <source>Browser for share file</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation>导入容器 %1 已导入。</translation>
+ <source>Password field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation>容器 %1 由不同的群组导入和导出。</translation>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -2113,22 +2833,50 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>&amp;Use default Auto-Type sequence of parent group</source>
- <translation>使用父群组的默认自动输入顺序(U)</translation>
+ <translation>&amp;使用父群组的默认自动输入顺序(U)</translation>
</message>
<message>
<source>Set default Auto-Type se&amp;quence</source>
- <translation>设置默认自动输入顺序(Q)</translation>
+ <translation>&amp;设置默认自动输入顺序(Q)</translation>
+ </message>
+ <message>
+ <source>Name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
<message>
<source>&amp;Use default icon</source>
- <translation>使用默认图标(U)</translation>
+ <translation>使用默认图标(&amp;U)</translation>
</message>
<message>
<source>Use custo&amp;m icon</source>
- <translation>使用自定义图标(M)</translation>
+ <translation>使用自定义图标(&amp;M)</translation>
</message>
<message>
<source>Add custom icon</source>
@@ -2144,7 +2892,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>无法获取网站图标</translation>
+ <translation>无法获取网站图标。</translation>
</message>
<message>
<source>Images</source>
@@ -2155,28 +2903,16 @@ Disable safe saves and try again?</source>
<translation>所有文件</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>已经存在自定义图标</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>确认删除</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation>自定义图标已成功下载</translation>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation>提示:您可以在工具&gt;设置&gt;安全性下启用DuckDuckGo作为后备</translation>
- </message>
- <message>
<source>Select Image(s)</source>
<translation>选择图像</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation><numerusform>已成功加载 %1 / %n 图标</numerusform></translation>
+ <translation><numerusform>已成功加载 %1 个 %n 图标</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@@ -2194,6 +2930,42 @@ Disable safe saves and try again?</source>
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>此图标由 %n 个条目使用,并将替换为默认图标。 你确定你要删除吗?</numerusform></translation>
</message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -2239,6 +3011,30 @@ This may cause the affected plugins to malfunction.</source>
<source>Value</source>
<translation>值</translation>
</message>
+ <message>
+ <source>Datetime created</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Entry</name>
@@ -2286,7 +3082,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>你确定要删除%n个附件吗?</numerusform></translation>
+ <translation><numerusform>您确定要删除 %n 个附件吗?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2300,7 +3096,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation>您确定要用附件覆盖现有文件“%1”吗?</translation>
+ <translation>您确定要用附件覆盖现有文件&quot;%1&quot;吗?</translation>
</message>
<message>
<source>Confirm overwrite</source>
@@ -2330,9 +3126,29 @@ This may cause the affected plugins to malfunction.</source>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation><numerusform>无法打开文件:
+ <translation><numerusform>无法打开文件:
%1</numerusform></translation>
</message>
+ <message>
+ <source>Attachments</source>
+ <translation>附件</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EntryAttributesModel</name>
@@ -2427,10 +3243,6 @@ This may cause the affected plugins to malfunction.</source>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>生成 TOTP 令牌</translation>
- </message>
- <message>
<source>Close</source>
<translation>关闭</translation>
</message>
@@ -2515,6 +3327,14 @@ This may cause the affected plugins to malfunction.</source>
<source>Share</source>
<translation>共享</translation>
</message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>高级</translation>
+ </message>
</context>
<context>
<name>EntryView</name>
@@ -2548,11 +3368,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>回收站</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation type="unfinished"/>
</message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
@@ -2571,10 +3413,62 @@ This may cause the affected plugins to malfunction.</source>
</message>
</context>
<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>网址</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>状态</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>KMessageWidget</name>
<message>
<source>&amp;Close</source>
- <translation>关闭</translation>
+ <translation>&amp;关闭</translation>
</message>
<message>
<source>Close message</source>
@@ -2589,11 +3483,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>无法发出挑战应答</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>密钥错误或数据库损坏</translation>
+ <translation>无法发出挑战应答。</translation>
</message>
<message>
<source>missing database headers</source>
@@ -2615,12 +3505,17 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>无效的标头数据长度</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
<message>
<source>Unable to issue challenge-response.</source>
- <translation>无法发出挑战应答</translation>
+ <translation>无法发出挑战应答。</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -2646,10 +3541,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>SHA256标头不匹配</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>错误的密钥或数据库文件已损坏。 (HMAC不匹配)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>未知的加密</translation>
</message>
@@ -2749,6 +3640,15 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>无效的变量映射字段类型大小</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
@@ -2811,7 +3711,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>不是 KeePass 数据库</translation>
+ <translation>不是 KeePass 数据库。</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
@@ -2970,31 +3870,31 @@ Line %2, column %3</source>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>导入 KeePass 1 数据库</translation>
+ <source>Unable to open the database.</source>
+ <translation>无法打开数据库。</translation>
</message>
<message>
- <source>Unable to open the database.</source>
- <translation>无法打开数据库</translation>
+ <source>Import KeePass1 Database</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
- <translation>无法读取密钥文件</translation>
+ <translation>无法读取密钥文件。</translation>
</message>
<message>
<source>Not a KeePass database.</source>
- <translation>不是 KeePass 数据库</translation>
+ <translation>不是 KeePass 数据库。</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
- <translation>不支持的加密算法</translation>
+ <translation>不支持的加密算法。</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
- <translation>不支持的 KeePass 数据库版本</translation>
+ <translation>不支持的 KeePass 数据库版本。</translation>
</message>
<message>
<source>Unable to read encryption IV</source>
@@ -3034,10 +3934,6 @@ Line %2, column %3</source>
<translation>无法计算主密码</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>密钥错误或数据库损坏</translation>
- </message>
- <message>
<source>Key transformation failed</source>
<translation>密钥转换失败</translation>
</message>
@@ -3133,40 +4029,57 @@ Line %2, column %3</source>
<source>unable to seek to content position</source>
<translation>无法寻求满足的内容</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation>禁用共享</translation>
+ <source>Invalid sharing reference</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from</source>
- <translation>从导入</translation>
+ <source>Inactive share %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to</source>
- <translation>导出到</translation>
+ <source>Imported from %1</source>
+ <translation>从%1导入</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation>与同步</translation>
+ <source>Exported to %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Disabled share %1</source>
- <translation>已禁用共享 %1</translation>
+ <source>Synchronized with %1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Import from share %1</source>
- <translation>从共享 %1 导入</translation>
+ <source>Import is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Export to share %1</source>
- <translation>导出到共享 %1</translation>
+ <source>Export is disabled in settings</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation>与共享 %1 同步</translation>
+ <source>Inactive share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -3211,10 +4124,6 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>浏览</translation>
- </message>
- <message>
<source>Generate</source>
<translation>生成</translation>
</message>
@@ -3270,68 +4179,105 @@ Message: %2</source>
<source>Select a key file</source>
<translation>选择密钥文件</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>浏览密钥文件</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>浏览...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>生成一个新的密钥文件</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>无效的密钥文件</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>&amp;Database</source>
- <translation>数据库(D)</translation>
+ <translation>数据库(&amp;D)</translation>
</message>
<message>
<source>&amp;Recent databases</source>
- <translation>最近的数据库(R)</translation>
+ <translation>最近的数据库(&amp;R)</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation>帮助(H)</translation>
+ <translation>帮助(&amp;H)</translation>
</message>
<message>
<source>E&amp;ntries</source>
- <translation>项目(N)</translation>
+ <translation>项目(&amp;N)</translation>
</message>
<message>
<source>&amp;Groups</source>
- <translation>群组(G)</translation>
+ <translation>群组(&amp;G)</translation>
</message>
<message>
<source>&amp;Tools</source>
- <translation>工具(T)</translation>
+ <translation>工具(&amp;T)</translation>
</message>
<message>
<source>&amp;Quit</source>
- <translation>退出(Q)</translation>
+ <translation>退出(&amp;Q)</translation>
</message>
<message>
<source>&amp;About</source>
- <translation>关于(A)</translation>
+ <translation>关于(&amp;A)</translation>
</message>
<message>
<source>&amp;Open database...</source>
- <translation>打开数据库(O)...</translation>
+ <translation>打开数据库(&amp;O)...</translation>
</message>
<message>
<source>&amp;Save database</source>
- <translation>保存数据库(S)</translation>
+ <translation>保存数据库(&amp;S)</translation>
</message>
<message>
<source>&amp;Close database</source>
- <translation>关闭数据库(C)</translation>
+ <translation>关闭数据库(&amp;C)</translation>
</message>
<message>
<source>&amp;Delete entry</source>
- <translation>删除项目(D)</translation>
+ <translation>删除项目(&amp;D)</translation>
</message>
<message>
<source>&amp;Edit group</source>
- <translation>编辑群组(E)</translation>
+ <translation>编辑群组(&amp;E)</translation>
</message>
<message>
<source>&amp;Delete group</source>
- <translation>删除群组(D)</translation>
+ <translation>删除群组(&amp;D)</translation>
</message>
<message>
<source>Sa&amp;ve database as...</source>
- <translation>数据库另存为(V)...</translation>
+ <translation>数据库另存为(&amp;V)...</translation>
</message>
<message>
<source>Database settings</source>
@@ -3339,11 +4285,11 @@ Message: %2</source>
</message>
<message>
<source>&amp;Clone entry</source>
- <translation>复制项目(C)</translation>
+ <translation>复制项目(&amp;C)</translation>
</message>
<message>
<source>Copy &amp;username</source>
- <translation>复制用户名(U)</translation>
+ <translation>复制用户名(&amp;U)</translation>
</message>
<message>
<source>Copy username to clipboard</source>
@@ -3355,19 +4301,15 @@ Message: %2</source>
</message>
<message>
<source>&amp;Settings</source>
- <translation>设置(S)</translation>
- </message>
- <message>
- <source>Password Generator</source>
- <translation>密码生成器</translation>
+ <translation>设置(&amp;S)</translation>
</message>
<message>
<source>&amp;Lock databases</source>
- <translation>锁定数据库(L)</translation>
+ <translation>锁定数据库(&amp;L)</translation>
</message>
<message>
<source>&amp;Title</source>
- <translation>标题(T)</translation>
+ <translation>标题(&amp;T)</translation>
</message>
<message>
<source>Copy title to clipboard</source>
@@ -3375,7 +4317,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;URL</source>
- <translation>网址(U)</translation>
+ <translation>网址(&amp;U)</translation>
</message>
<message>
<source>Copy URL to clipboard</source>
@@ -3383,7 +4325,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Notes</source>
- <translation>备注(N)</translation>
+ <translation>备注(&amp;N)</translation>
</message>
<message>
<source>Copy notes to clipboard</source>
@@ -3391,7 +4333,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Export to CSV file...</source>
- <translation>导出为 CSV 文件(E)...</translation>
+ <translation>导出为 CSV 文件(&amp;E)...</translation>
</message>
<message>
<source>Set up TOTP...</source>
@@ -3399,11 +4341,11 @@ Message: %2</source>
</message>
<message>
<source>Copy &amp;TOTP</source>
- <translation>复制 TOTP 密码(T)</translation>
+ <translation>复制 TOTP 密码(&amp;T)</translation>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
- <translation>清空回收站</translation>
+ <translation>清空回收站(&amp;m)</translation>
</message>
<message>
<source>Clear history</source>
@@ -3457,7 +4399,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Copy att&amp;ribute...</source>
- <translation>复制 att&amp;ribute...</translation>
+ <translation>复制属性(&amp;R)...</translation>
</message>
<message>
<source>TOTP...</source>
@@ -3465,7 +4407,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;New database...</source>
- <translation>&amp;新数据库...</translation>
+ <translation>新数据库(&amp;N)...</translation>
</message>
<message>
<source>Create a new database</source>
@@ -3505,7 +4447,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Change master &amp;key...</source>
- <translation>修改主密钥...</translation>
+ <translation>修改主密钥(&amp;K)...</translation>
</message>
<message>
<source>&amp;Database settings...</source>
@@ -3517,7 +4459,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
- <translation>执行和自动键入</translation>
+ <translation>执行和自动键入(&amp;A)</translation>
</message>
<message>
<source>Open &amp;URL</source>
@@ -3548,14 +4490,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation>显示TOTP 二维码...</translation>
</message>
<message>
- <source>Check for Updates...</source>
- <translation>正在检查更新..。</translation>
- </message>
- <message>
- <source>Share entry</source>
- <translation>共享条目</translation>
- </message>
- <message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>注意:您使用的是KeePassXC的预发行版本!
@@ -3573,6 +4507,74 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>You can always check for updates manually from the application menu.</source>
<translation>您始终可以从应用程序菜单手动检查更新。</translation>
</message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>下载网站图标</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>Merger</name>
@@ -3632,6 +4634,14 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Adding missing icon %1</source>
<translation>添加缺少的图标 %1</translation>
</message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>NewDatabaseWizard</name>
@@ -3653,7 +4663,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>En&amp;cryption Settings</source>
- <translation>加密设置</translation>
+ <translation>加密设置(&amp;C)</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
@@ -3702,6 +4712,72 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>OpenSSHKey</name>
<message>
<source>Invalid key file, expecting an OpenSSH key</source>
@@ -3801,6 +4877,17 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
</context>
<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
<name>PasswordEditWidget</name>
<message>
<source>Enter password:</source>
@@ -3826,6 +4913,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Generate master password</source>
<translation>生成主密码</translation>
</message>
+ <message>
+ <source>Password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -3855,22 +4958,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>字符类型</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>大写字母</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>小写字母</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>数字</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>特殊字符</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>扩展 ASCII</translation>
</message>
@@ -3884,7 +4975,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&amp;Length:</source>
- <translation>长度(L):</translation>
+ <translation>长度(&amp;L):</translation>
</message>
<message>
<source>Passphrase</source>
@@ -3951,18 +5042,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>高级</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation>大写字母A到F</translation>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation>小写字母A至F</translation>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3995,18 +5078,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>&quot; &apos;</translation>
</message>
<message>
- <source>Math</source>
- <translation>数学</translation>
- </message>
- <message>
<source>&lt;*+!?=</source>
<translation>&lt;*+!?=</translation>
</message>
<message>
- <source>Dashes</source>
- <translation>破折号</translation>
- </message>
- <message>
<source>\_|-/</source>
<translation>\_|-/</translation>
</message>
@@ -4048,12 +5123,80 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Word Co&amp;unt:</source>
- <translation>字数:</translation>
+ <translation>字数(&amp;u):</translation>
</message>
<message>
<source>Regenerate</source>
<translation>再生</translation>
</message>
+ <message>
+ <source>Generated password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>复制密码</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QApplication</name>
@@ -4061,12 +5204,9 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>KeeShare</source>
<translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation>选择</translation>
+ <source>Statistics</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -4103,6 +5243,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Merge</source>
<translation>合并</translation>
</message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -4160,7 +5304,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Path of the database.</source>
- <translation>数据库路径</translation>
+ <translation>数据库路径。</translation>
</message>
<message>
<source>Key file of the database.</source>
@@ -4195,10 +5339,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>为条目生成密码。</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>生成密码的长度。</translation>
- </message>
- <message>
<source>length</source>
<translation>长度</translation>
</message>
@@ -4248,18 +5388,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>对密码执行高级分析。</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>提取并打印数据库内容</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>将提取的数据库路径</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>插入密码以解锁%1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4281,11 +5409,11 @@ Available commands:
</message>
<message>
<source>Name of the command to execute.</source>
- <translation>将执行的命令名称</translation>
+ <translation>将执行的命令名称。</translation>
</message>
<message>
<source>List database entries.</source>
- <translation>列出数据库项目</translation>
+ <translation>列出数据库项目。</translation>
</message>
<message>
<source>Path of the group to list. Default is /</source>
@@ -4301,15 +5429,11 @@ Available commands:
</message>
<message>
<source>Merge two databases.</source>
- <translation>合并两个数据库</translation>
- </message>
- <message>
- <source>Path of the database to merge into.</source>
- <translation>合并成的数据库路径</translation>
+ <translation>合并两个数据库。</translation>
</message>
<message>
<source>Path of the database to merge from.</source>
- <translation>将合并的数据库路径</translation>
+ <translation>要合并的数据库的路径。</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
@@ -4333,7 +5457,7 @@ Available commands:
</message>
<message>
<source>Name of the entry to show.</source>
- <translation>项目名称</translation>
+ <translation>项目名称。</translation>
</message>
<message>
<source>NULL device</source>
@@ -4381,11 +5505,7 @@ Available commands:
</message>
<message>
<source>Browser Integration</source>
- <translation>浏览器配合</translation>
- </message>
- <message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] 挑战应答 - Slot %2 - %3</translation>
+ <translation>浏览器集成</translation>
</message>
<message>
<source>Press</source>
@@ -4418,10 +5538,6 @@ Available commands:
<translation>生成一个新的随机密码。</translation>
</message>
<message>
- <source>Invalid value for password length %1.</source>
- <translation>密码长度 %1 的值无效。</translation>
- </message>
- <message>
<source>Could not create entry with path %1.</source>
<translation>无法创建路径为 %1 的项目。</translation>
</message>
@@ -4479,10 +5595,6 @@ Available commands:
<translation>数</translation>
</message>
<message>
- <source>Invalid value for password length: %1</source>
- <translation>密码长度的值无效:%1</translation>
- </message>
- <message>
<source>Could not find entry with path %1.</source>
<translation>找不到路径为 %1的项目。</translation>
</message>
@@ -4607,26 +5719,6 @@ Available commands:
<translation>无法加载密钥文件 %1: %2</translation>
</message>
<message>
- <source>File %1 does not exist.</source>
- <translation>文件 %1 不存在。</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>无法打开文件 %1。</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation>读取数据库时出错:
-%1</translation>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation>解析数据库时出错:
-%1</translation>
- </message>
- <message>
<source>Length of the generated password</source>
<translation>生成密码的长度</translation>
</message>
@@ -4639,10 +5731,6 @@ Available commands:
<translation>使用大写字符</translation>
</message>
<message>
- <source>Use numbers.</source>
- <translation>使用数字。</translation>
- </message>
- <message>
<source>Use special characters</source>
<translation>使用特殊字符</translation>
</message>
@@ -4672,7 +5760,7 @@ Available commands:
</message>
<message>
<source>Cannot find group %1.</source>
- <translation>找不到群组%1。</translation>
+ <translation>找不到组%1。</translation>
</message>
<message>
<source>Error reading merge file:
@@ -4760,7 +5848,7 @@ Available commands:
</message>
<message>
<source>No groups found</source>
- <translation>未找到群组</translation>
+ <translation>未找到组</translation>
</message>
<message>
<source>Create a new database.</source>
@@ -4787,10 +5875,6 @@ Available commands:
<translation>已成功创建新数据库。</translation>
</message>
<message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation>插入密码加密数据库 (按回车键留空):</translation>
- </message>
- <message>
<source>Creating KeyFile %1 failed: %2</source>
<translation>创建密钥文件%1失败:%2</translation>
</message>
@@ -4799,10 +5883,6 @@ Available commands:
<translation>加载密钥文件 %1 失败: %2</translation>
</message>
<message>
- <source>Remove an entry from the database.</source>
- <translation>从数据库中删除条目。</translation>
- </message>
- <message>
<source>Path of the entry to remove.</source>
<translation>要删除的条目的路径。</translation>
</message>
@@ -4858,6 +5938,330 @@ Available commands:
<source>Cannot create new group</source>
<translation>无法创建新群组</translation>
</message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>版本 %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>构建类型: %1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>修订版本:%1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>发行版:%1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>操作系统:%1
+CPU 架构:%2
+内核:%3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>自动输入</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare (签名和未签名共享)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare (仅限签名共享)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare (仅限未签名共享)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>无</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>已启用的扩展:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>合并操作未修改数据库。</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -5012,6 +6416,93 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>常规</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>群组</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>数据库设置</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>解锁数据库</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>锁定数据库</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>无</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
@@ -5134,9 +6625,100 @@ Available commands:
<source>Signer:</source>
<translation>签名:</translation>
</message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>密钥</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>不支持覆盖签名的共享容器-防止导出</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>无法写入导出容器 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>无法嵌入签名:无法打开要写入的文件 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>无法嵌入签名:无法写入文件 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>无法嵌入数据库:无法打开要写入的文件 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>无法嵌入数据库:无法写入文件 (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>不支持覆盖未签名的共享容器-防止导出</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>无法写入导出容器</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>出现意外的导出错误</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
<translation>从没有签名的容器导入</translation>
@@ -5150,6 +6732,10 @@ Available commands:
<translation>从带有证书的容器导入</translation>
</message>
<message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>是否要信任 %1, 来自 %3 的 %2 的指纹?</translation>
+ </message>
+ <message>
<source>Not this time</source>
<translation>本次取消</translation>
</message>
@@ -5166,18 +6752,6 @@ Available commands:
<translation>现在</translation>
</message>
<message>
- <source>Import from %1 failed (%2)</source>
- <translation>从%1 导入失败 (%2)</translation>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation>从%1导入成功 (%2)</translation>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation>从%1导入</translation>
- </message>
- <message>
<source>Signed share container are not supported - import prevented</source>
<translation>不支持签名共享容器-导入已防止</translation>
</message>
@@ -5217,25 +6791,20 @@ Available commands:
<source>Unknown share container type</source>
<translation>未知的共享容器类型</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation>不支持覆盖签名的共享容器-防止导出</translation>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation>无法写入导出容器 (%1)</translation>
- </message>
- <message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation>不支持覆盖未签名的共享容器-防止导出</translation>
+ <source>Import from %1 failed (%2)</source>
+ <translation>从%1 导入失败 (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation>无法写入导出容器</translation>
+ <source>Import from %1 successful (%2)</source>
+ <translation>从%1导入成功 (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation>出现意外的导出错误</translation>
+ <source>Imported from %1</source>
+ <translation>从%1导入</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
@@ -5250,10 +6819,6 @@ Available commands:
<translation>导出到%1</translation>
</message>
<message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation>是否要信任 %1, 来自 %3 的 %2 的指纹? {1 ?} {2 ?}</translation>
- </message>
- <message>
<source>Multiple import source path to %1 in %2</source>
<translation>多个导入源路径到 %1 in %2</translation>
</message>
@@ -5261,22 +6826,6 @@ Available commands:
<source>Conflicting export target path %1 in %2</source>
<translation>冲突的导出目标路径 %1 in %2</translation>
</message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation>无法嵌入签名:无法打开要写入的文件 (%1)</translation>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation>无法嵌入签名:无法写入文件 (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation>无法嵌入数据库:无法打开要写入的文件 (%1)</translation>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation>无法嵌入数据库:无法写入文件 (%1)</translation>
- </message>
</context>
<context>
<name>TotpDialog</name>
@@ -5294,7 +6843,7 @@ Available commands:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation><numerusform>以&lt;b&gt;%n&lt;/b&gt;秒到期</numerusform></translation>
+ <translation><numerusform>在 &lt;b&gt;%n&lt;/b&gt; 秒后过期</numerusform></translation>
</message>
</context>
<context>
@@ -5324,10 +6873,6 @@ Available commands:
<translation>设置定时一次性密码</translation>
</message>
<message>
- <source>Key:</source>
- <translation>密钥:</translation>
- </message>
- <message>
<source>Default RFC 6238 token settings</source>
<translation>默认RFC 6238令牌设置</translation>
</message>
@@ -5357,16 +6902,45 @@ Available commands:
<translation>口令长度:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 位数字</translation>
+ <source>Secret Key:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key must be in Base32 format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Secret key field</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>算法:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>7 digits</source>
- <translation>7位数</translation>
+ <source> digits</source>
+ <translation type="unfinished"/>
</message>
<message>
- <source>8 digits</source>
- <translation>8 位数字</translation>
+ <source>Invalid TOTP Secret</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5448,7 +7022,15 @@ Available commands:
</message>
<message>
<source>Welcome to KeePassXC %1</source>
- <translation>欢迎来到 KeePassXC %1</translation>
+ <translation>欢迎来到KeePassXC %1</translation>
+ </message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5473,5 +7055,13 @@ Available commands:
<source>No YubiKey inserted.</source>
<translation>没有插入YubiKey。</translation>
</message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/share/translations/keepassx_zh_TW.ts b/share/translations/keepassx_zh_TW.ts
index f5dfd589f..e5c8f188b 100644
--- a/share/translations/keepassx_zh_TW.ts
+++ b/share/translations/keepassx_zh_TW.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
- <translation>KeePassXC 遵循 GNU 通用公共許可證 (GPL) 第二版 或(依你的需求)以第三版發行。</translation>
+ <translation>KeePassXC 遵循 GNU 通用公共許可證 (GPL) 第二版或(依您的需求)以第三版發行。</translation>
</message>
<message>
<source>Contributors</source>
@@ -31,7 +31,7 @@
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
- <translation>回報 Bug 時會包含以下資訊:</translation>
+ <translation>回報 Bug 時請包含以下資訊:</translation>
</message>
<message>
<source>Copy to clipboard</source>
@@ -43,18 +43,18 @@
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
- <translation>KeePassXC 團隊特別鳴謝 debfx 開發了原本的 KeePassX</translation>
+ <translation>KeePassXC 團隊特別鳴謝 debfx 開發了原本的 KeePassX。</translation>
</message>
</context>
<context>
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
- <translation>啟用 SSH 代理 (需要重新啟動)</translation>
+ <translation>啟用 SSH 代理(需要重新啟動)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
- <translation>使用 OpenSSH for Windows 而不是 Pageant</translation>
+ <translation>使用 Windows 版的 OpenSSH 而不是 Pageant</translation>
</message>
</context>
<context>
@@ -73,7 +73,7 @@
</message>
<message>
<source>Access error for config file %1</source>
- <translation>設定檔存取錯誤:%1</translation>
+ <translation>設定檔 %1 存取錯誤</translation>
</message>
<message>
<source>Icon only</source>
@@ -85,16 +85,24 @@
</message>
<message>
<source>Text beside icon</source>
- <translation>圖示旁有文字</translation>
+ <translation>文字在圖示旁邊</translation>
</message>
<message>
<source>Text under icon</source>
- <translation>圖示下有文字</translation>
+ <translation>文字在圖示底下</translation>
</message>
<message>
<source>Follow style</source>
<translation>遵照系統樣式</translation>
</message>
+ <message>
+ <source>Reset Settings?</source>
+ <translation>重設設定?</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to reset all general and security settings to default?</source>
+ <translation>確定將所有一般及安全性設定重設為預設值?</translation>
+ </message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -108,23 +116,11 @@
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
- <translation>只能啟動單一 KeePassXC 程式</translation>
- </message>
- <message>
- <source>Remember last databases</source>
- <translation>記住最近的資料庫</translation>
- </message>
- <message>
- <source>Remember last key files and security dongles</source>
- <translation>記住最近的金鑰檔案與安全加密狗</translation>
- </message>
- <message>
- <source>Load previous databases on startup</source>
- <translation>啟動時載入之前的資料庫</translation>
+ <translation>只啟動單一 KeePassXC 程序</translation>
</message>
<message>
<source>Minimize window at application startup</source>
- <translation>程式啟動時視窗最小化</translation>
+ <translation>程式啟動時將視窗最小化</translation>
</message>
<message>
<source>File Management</source>
@@ -132,27 +128,27 @@
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
- <translation>安全儲存資料庫檔案 (可能與 Dropbox 等服務不相容)</translation>
+ <translation>安全儲存資料庫檔案(可能與 Dropbox 等服務不相容)</translation>
</message>
<message>
<source>Backup database file before saving</source>
- <translation>儲存資料庫檔案前先備份</translation>
+ <translation>儲存前先備份資料庫檔案</translation>
</message>
<message>
<source>Automatically save after every change</source>
- <translation>修改後,自動儲存</translation>
+ <translation>每次修改後自動儲存</translation>
</message>
<message>
<source>Automatically save on exit</source>
- <translation>離開時,自動儲存</translation>
+ <translation>離開時自動儲存</translation>
</message>
<message>
<source>Don&apos;t mark database as modified for non-data changes (e.g., expanding groups)</source>
- <translation>未變更資料時(例如:擴展群組時)不要將資料庫標記為已修改</translation>
+ <translation>非資料變更(例如擴展群組)的情況下,不要將資料庫標記為已修改</translation>
</message>
<message>
<source>Automatically reload the database when modified externally</source>
- <translation>當有外部修改時自動重新載入資料庫</translation>
+ <translation>當資料庫被外部修改時,自動將其重新載入</translation>
</message>
<message>
<source>Entry Management</source>
@@ -160,15 +156,11 @@
</message>
<message>
<source>Use group icon on entry creation</source>
- <translation>新增項目時使用群組圖示</translation>
- </message>
- <message>
- <source>Minimize when copying to clipboard</source>
- <translation>在複製到剪貼簿時最小化</translation>
+ <translation>建立項目時使用群組圖示</translation>
</message>
<message>
<source>Hide the entry preview panel</source>
- <translation>隱藏預覽項目區域</translation>
+ <translation>隱藏項目預覽面板</translation>
</message>
<message>
<source>General</source>
@@ -176,7 +168,7 @@
</message>
<message>
<source>Hide toolbar (icons)</source>
- <translation>隱藏工具列 (圖示)</translation>
+ <translation>隱藏工具列(圖示)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
@@ -184,7 +176,7 @@
</message>
<message>
<source>Show a system tray icon</source>
- <translation>顯示工作列圖示</translation>
+ <translation>顯示系統列圖示</translation>
</message>
<message>
<source>Dark system tray icon</source>
@@ -192,11 +184,7 @@
</message>
<message>
<source>Hide window to system tray when minimized</source>
- <translation>將視窗最小化至工作列</translation>
- </message>
- <message>
- <source>Language</source>
- <translation>語言</translation>
+ <translation>將視窗最小化至系統列</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -204,15 +192,15 @@
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
- <translation>使用項目標題來匹配全域自動輸入的視窗</translation>
+ <translation>全域自動輸入下,使用項目標題來匹配視窗</translation>
</message>
<message>
<source>Use entry URL to match windows for global Auto-Type</source>
- <translation>使用項目 URL 來匹配全域自動輸入的視窗</translation>
+ <translation>全域自動輸入下,使用項目網址來匹配視窗</translation>
</message>
<message>
<source>Always ask before performing Auto-Type</source>
- <translation>在執行自動輸入前始終詢問</translation>
+ <translation>執行自動輸入前始終詢問</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
@@ -232,27 +220,108 @@
<translation>自動輸入啟動延遲</translation>
</message>
<message>
- <source>Check for updates at application startup</source>
- <translation>程式啟動時檢查更新</translation>
+ <source>Movable toolbar</source>
+ <translation>可移動的工具列</translation>
</message>
<message>
- <source>Include pre-releases when checking for updates</source>
- <translation>檢查更新時包括預先發行版本</translation>
+ <source>Remember previously used databases</source>
+ <translation>記住先前使用的資料庫</translation>
</message>
<message>
- <source>Movable toolbar</source>
- <translation>可移動的工具列</translation>
+ <source>Load previously open databases on startup</source>
+ <translation>啟動時載入先前開啟的資料庫</translation>
</message>
<message>
- <source>Button style</source>
- <translation>按鈕樣式</translation>
+ <source>Remember database key files and security dongles</source>
+ <translation>記住資料庫金鑰檔案與安全加密狗 (dongle)</translation>
+ </message>
+ <message>
+ <source>Check for updates at application startup once per week</source>
+ <translation>每週一次於程式啟動時檢查更新</translation>
+ </message>
+ <message>
+ <source>Include beta releases when checking for updates</source>
+ <translation>檢查更新時包括 beta 版本</translation>
+ </message>
+ <message>
+ <source>Button style:</source>
+ <translation>按鈕樣式:</translation>
+ </message>
+ <message>
+ <source>Language:</source>
+ <translation>語言:</translation>
+ </message>
+ <message>
+ <source>(restart program to activate)</source>
+ <translation>(重啟程式以生效)</translation>
+ </message>
+ <message>
+ <source>Minimize window after unlocking database</source>
+ <translation>解鎖資料庫後將視窗最小化</translation>
+ </message>
+ <message>
+ <source>Minimize when opening a URL</source>
+ <translation>開啟網址時最小化</translation>
+ </message>
+ <message>
+ <source>Hide window when copying to clipboard</source>
+ <translation>複製到剪貼簿時隱藏視窗</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>最小化</translation>
+ </message>
+ <message>
+ <source>Drop to background</source>
+ <translation>移至背景</translation>
+ </message>
+ <message>
+ <source>Favicon download timeout:</source>
+ <translation>收藏夾圖示下載逾時:</translation>
+ </message>
+ <message>
+ <source>Website icon download timeout in seconds</source>
+ <translation>網站圖示下載幾秒後逾時</translation>
+ </message>
+ <message>
+ <source> sec</source>
+ <comment>Seconds</comment>
+ <translation> 秒</translation>
+ </message>
+ <message>
+ <source>Toolbar button style</source>
+ <translation>工具列按鈕樣式</translation>
+ </message>
+ <message>
+ <source>Use monospaced font for Notes</source>
+ <translation>項目附註使用等寛字體</translation>
+ </message>
+ <message>
+ <source>Language selection</source>
+ <translation>語言選擇</translation>
+ </message>
+ <message>
+ <source>Reset Settings to Default</source>
+ <translation>將設定重設為預設值</translation>
+ </message>
+ <message>
+ <source>Global auto-type shortcut</source>
+ <translation>全域自動輸入快捷鍵</translation>
+ </message>
+ <message>
+ <source>Auto-type character typing delay milliseconds</source>
+ <translation>自動輸入的字元輸入延遲毫秒</translation>
+ </message>
+ <message>
+ <source>Auto-type start delay milliseconds</source>
+ <translation>自動輸入的起始延遲毫秒</translation>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
<message>
<source>Timeouts</source>
- <translation>超時</translation>
+ <translation>逾時</translation>
</message>
<message>
<source>Clear clipboard after</source>
@@ -265,27 +334,27 @@
</message>
<message>
<source>Lock databases after inactivity of</source>
- <translation>多久沒有動作之後鎖定資料庫</translation>
+ <translation>閒置多久後鎖定資料庫</translation>
</message>
<message>
<source> min</source>
- <translation>分鐘</translation>
+ <translation> 分</translation>
</message>
<message>
<source>Forget TouchID after inactivity of</source>
- <translation>遺忘 TouchID 當閒置</translation>
+ <translation>閒置多久後遺忘 TouchID</translation>
</message>
<message>
<source>Convenience</source>
- <translation>便利</translation>
+ <translation>便利性</translation>
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
- <translation>當工作階段鎖定或蓋上螢幕時鎖定資料庫</translation>
+ <translation>鎖定工作階段或蓋上螢幕時,將資料庫鎖定</translation>
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
- <translation>當工作階段鎖定或蓋上螢幕時遺忘 TouchID</translation>
+ <translation>鎖定工作階段或蓋上螢幕時,遺忘 TouchID</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@@ -293,42 +362,63 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
- <translation>自動輸入後,將原本鎖定的資料庫重新鎖定</translation>
+ <translation>執行自動輸入後,將之前鎖定的資料庫重新鎖定</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
- <translation>顯示密碼時不需要重複輸入密碼</translation>
+ <translation>當密碼可見時,不要求重複輸入密碼</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
- <translation>編輯時不隱藏密碼</translation>
+ <translation>編輯時不要隱藏密碼</translation>
</message>
<message>
<source>Don&apos;t use placeholder for empty password fields</source>
- <translation>不於空白密碼欄位處填入替代字符</translation>
+ <translation>不要在空白的密碼欄位處填入替換字符</translation>
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
- <translation>在項目預覽區內隱藏密碼</translation>
+ <translation>隱藏項目預覽面板內的密碼</translation>
</message>
<message>
<source>Hide entry notes by default</source>
- <translation>預設隱藏項目備註</translation>
+ <translation>預設情況下隱藏項目備註</translation>
</message>
<message>
<source>Privacy</source>
<translation>隱私</translation>
</message>
<message>
- <source>Use DuckDuckGo as fallback for downloading website icons</source>
- <translation>使用 DuckDuckGo 作為下載網站圖示失敗時的備案</translation>
+ <source>Use DuckDuckGo service to download website icons</source>
+ <translation>使用 DuckDuckGo 服務下載網站圖示</translation>
+ </message>
+ <message>
+ <source>Clipboard clear seconds</source>
+ <translation>剪貼簿清除秒數</translation>
+ </message>
+ <message>
+ <source>Touch ID inactivity reset</source>
+ <translation>Touch ID 閒置重設</translation>
+ </message>
+ <message>
+ <source>Database lock timeout seconds</source>
+ <translation>資料庫鎖定逾時秒數</translation>
+ </message>
+ <message>
+ <source> min</source>
+ <comment>Minutes</comment>
+ <translation> 分</translation>
+ </message>
+ <message>
+ <source>Clear search query after</source>
+ <translation>多久後清除搜尋字詞</translation>
</message>
</context>
<context>
<name>AutoType</name>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
- <translation>無法找到符合視窗標題的項目</translation>
+ <translation>找不到符合視窗標題的項目:</translation>
</message>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -340,7 +430,7 @@
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
- <translation>自動輸入語法不正確!</translation>
+ <translation>自動輸入敘述的語法不正確!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
@@ -390,6 +480,17 @@
</message>
</context>
<context>
+ <name>AutoTypeMatchView</name>
+ <message>
+ <source>Copy &amp;username</source>
+ <translation>複製使用者名稱 (&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;password</source>
+ <translation>複製密碼 (&amp;P)</translation>
+ </message>
+</context>
+<context>
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
@@ -397,14 +498,18 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
- <translation>選擇要自動輸入的項目</translation>
+ <translation>選擇要自動輸入的項目:</translation>
+ </message>
+ <message>
+ <source>Search...</source>
+ <translation>搜尋……</translation>
</message>
</context>
<context>
<name>BrowserAccessControlDialog</name>
<message>
<source>KeePassXC-Browser Confirm Access</source>
- <translation>KeePassXC-Browser 瀏覽器擴充功能存取確認</translation>
+ <translation>KeePassXC-Browser 存取確認</translation>
</message>
<message>
<source>Remember this decision</source>
@@ -416,7 +521,7 @@
</message>
<message>
<source>Deny</source>
- <translation>禁止</translation>
+ <translation>拒絕</translation>
</message>
<message>
<source>%1 has requested access to passwords for the following item(s).
@@ -424,12 +529,20 @@ Please select whether you want to allow access.</source>
<translation>%1 要求存取下列項目的密碼。
請選擇是否允許存取。</translation>
</message>
+ <message>
+ <source>Allow access</source>
+ <translation>允許存取</translation>
+ </message>
+ <message>
+ <source>Deny access</source>
+ <translation>拒絕存取</translation>
+ </message>
</context>
<context>
<name>BrowserEntrySaveDialog</name>
<message>
<source>KeePassXC-Browser Save Entry</source>
- <translation>KeePassXC-Browser 瀏覽器擴充功能儲存項目</translation>
+ <translation>KeePassXC-Browser 儲存項目</translation>
</message>
<message>
<source>Ok</source>
@@ -443,7 +556,7 @@ Please select whether you want to allow access.</source>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
<translation>您開啟了多個資料庫。
-請選擇您想要儲存憑證的資料庫。</translation>
+請選擇要儲存憑證的資料庫。</translation>
</message>
</context>
<context>
@@ -454,11 +567,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
- <translation>需要使用 KeePassXC-Browser 瀏覽器擴充功能存取你的資料庫</translation>
- </message>
- <message>
- <source>Enable KeepassXC browser integration</source>
- <translation>啟用 KeepassXC browser 瀏覽器擴充功能整合</translation>
+ <translation>使用 KeePassXC-Browser(瀏覽器擴充功能)存取您的資料庫</translation>
</message>
<message>
<source>General</source>
@@ -487,7 +596,7 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Show a &amp;notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>要求認證時顯示通知 (&amp;N)</translation>
+ <translation>要求憑證時顯示通知 (&amp;N)</translation>
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
@@ -495,29 +604,29 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
- <translation>只顯示相同協定的項目。(http://, https://, ...)</translation>
+ <translation>只回傳具相同協定 (http://, https://, ...) 的項目。</translation>
</message>
<message>
<source>&amp;Match URL scheme (e.g., https://...)</source>
- <translation>符合網址協定 (例如:https://……) (&amp;M)</translation>
+ <translation>匹配網址協定 (例如 https://...) (&amp;M)</translation>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
- <translation>只回傳最佳的網址相符項目而非所有網址相符的項目。(&amp;R)</translation>
+ <translation>對於給定網址,只回傳最佳的相符項目,而不是與整個網域相符的所有項目。</translation>
</message>
<message>
<source>&amp;Return only best-matching credentials</source>
- <translation>只回傳最佳的相符憑證 (&amp;R)</translation>
+ <translation>只回傳最符合的憑證 (&amp;R)</translation>
</message>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>依名稱排序符合認證 (&amp;M)</translation>
+ <translation>依照標題排序符合的憑證 (&amp;M)</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>依使用者名稱排序符合認證 (&amp;U)</translation>
+ <translation>依照使用者名稱排序符合的憑證 (&amp;U)</translation>
</message>
<message>
<source>Advanced</source>
@@ -526,21 +635,17 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Never &amp;ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>存取認證時不再詢問 (&amp;A)</translation>
+ <translation>存取憑證前永不詢問 (&amp;A)</translation>
</message>
<message>
<source>Never ask before &amp;updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>更新認證時不再詢問 (&amp;U)</translation>
- </message>
- <message>
- <source>Only the selected database has to be connected with a client.</source>
- <translation>只有所選的資料庫能連接到客戶端。</translation>
+ <translation>更新憑證前永不詢問 (&amp;U)</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
- <translation>在所有開啟的資料庫內搜尋相符的認證 (&amp;H)</translation>
+ <translation>在所有開啟的資料庫內搜尋相符的憑證 (&amp;H)</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
@@ -548,15 +653,15 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
- <translation>回傳 「KPH: 」 起首的進階文字欄位 (&amp;R)</translation>
+ <translation>回傳「KPH: 」起首的進階文字欄位 (&amp;R)</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
- <translation>啟動時自動將 KeePassXC 或 KeePassXC 代理執行檔路徑更新為 native messaging 腳本。</translation>
+ <translation>啟動時,自動將 KeePassXC 或 keepassxc-proxy 執行檔路徑更新為 Native Messaging 腳本。</translation>
</message>
<message>
<source>Update &amp;native messaging manifest files at startup</source>
- <translation>啟動時更新 native messaging 的 manifest 檔案 (&amp;N)</translation>
+ <translation>啟動時,更新 &amp;Native Messaging 的 manifest 檔案</translation>
</message>
<message>
<source>Support a proxy application between KeePassXC and browser extension.</source>
@@ -578,7 +683,7 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>瀏覽……</translation>
+ <translation>瀏覽...</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
@@ -593,10 +698,6 @@ Please select the correct database for saving credentials.</source>
<translation>&amp;Tor 瀏覽器</translation>
</message>
<message>
- <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
- <translation>&lt;b&gt;警告&lt;/b&gt;,找不到 keepassxc-proxy 應用程式!&lt;br /&gt;請檢查 KeePassXC 安裝目錄,或在進階選項中確認自定路徑。&lt;br /&gt;缺少此應用程式瀏覽器整合將無法運作。&lt;br /&gt;預期的路徑: </translation>
- </message>
- <message>
<source>Executable Files</source>
<translation>可執行檔案</translation>
</message>
@@ -607,20 +708,64 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
- <translation>不確認 HTTP 權限</translation>
+ <translation>不確認 HTTP 基本認證的權限 (&amp;B)</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
- <translation type="unfinished"/>
+ <translation>由於 Snap 的沙盒機制,你需要執行一個腳本來啟用瀏覽器整合。&lt;br /&gt;你可以從 %1 取得這個腳本</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
- <translation type="unfinished"/>
+ <translation>請參閱以下關於使用瀏覽器擴展的特別指示</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation>需要 KeePassXC-Browser 瀏覽器擴充功能才能使用瀏覽器整合。為 %1 及 %2 下載。%3</translation>
</message>
+ <message>
+ <source>&amp;Brave</source>
+ <translation>&amp;Brave</translation>
+ </message>
+ <message>
+ <source>Returns expired credentials. String [expired] is added to the title.</source>
+ <translation>回傳過期的憑證。標題會加入 [過期] 字串。</translation>
+ </message>
+ <message>
+ <source>&amp;Allow returning expired credentials.</source>
+ <translation>允許回傳過期的憑證 (&amp;A)。</translation>
+ </message>
+ <message>
+ <source>Enable browser integration</source>
+ <translation>啟用瀏覧器整合</translation>
+ </message>
+ <message>
+ <source>Browsers installed as snaps are currently not supported.</source>
+ <translation>目前不支援以快照版本安裝的瀏覧器。</translation>
+ </message>
+ <message>
+ <source>All databases connected to the extension will return matching credentials.</source>
+ <translation>所有與本擴充功能連接的資料庫將回傳相符的憑證。</translation>
+ </message>
+ <message>
+ <source>Don&apos;t display the popup suggesting migration of legacy KeePassHTTP settings.</source>
+ <translation>不要顯示舊版 KeePassHTTP 設定移轉的彈出視窗。</translation>
+ </message>
+ <message>
+ <source>&amp;Do not prompt for KeePassHTTP settings migration.</source>
+ <translation>移轉 KeePassHTTP 設定時不要顯示提示 (&amp;D)。</translation>
+ </message>
+ <message>
+ <source>Custom proxy location field</source>
+ <translation>自訂代理位置欄位</translation>
+ </message>
+ <message>
+ <source>Browser for custom proxy file</source>
+ <translation>瀏覧自訂代理檔案</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: %1</source>
+ <translation>&lt;b&gt;警告&lt;/b&gt;,未找到 keepassxc-proxy 應用程式!&lt;br /&gt;請檢查 KeePassXC 安裝目錄或確認進階選項內的自訂路徑。&lt;br /&gt;若缺少 proxy 應用程式,瀏覧器整合將「無法運作」。&lt;br /&gt;預期路徑:%1</translation>
+ </message>
</context>
<context>
<name>BrowserService</name>
@@ -666,48 +811,57 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Converting attributes to custom data…</source>
- <translation type="unfinished"/>
+ <translation>轉換屬性至自訂資料...</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC:轉換 KeePassHTTP 屬性</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
- <translation type="unfinished"/>
+ <translation>成功轉換 %1 個項目的屬性。
+移動 %2 個金鑰至自訂資料。</translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>成功移動 %n 個金鑰至自訂資料。</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC:找不到帶有 KeePassHTTP 屬性的項目!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
- <translation type="unfinished"/>
+ <translation>目前的資料庫沒有帶 KeePassHTTP 屬性的項目。</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC:偵測到舊式瀏覽器整合設定</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC:建立新群組</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
- <translation type="unfinished"/>
+ <translation>已收到建立新群組「%1」的請求。
+您要建立這個群組嗎?
+</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
- <translation type="unfinished"/>
+ <translation>您的 KeePassXC 瀏覽器設定需要被移動至資料庫設定。
+這對於保持您目前瀏覽器連線是必需的。
+您現在要匯入既有設定嗎?</translation>
+ </message>
+ <message>
+ <source>Don&apos;t show this warning again</source>
+ <translation>不再顯示此警告</translation>
</message>
</context>
<context>
@@ -726,7 +880,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Copy history</source>
- <translation>複製歷史記錄</translation>
+ <translation>複製歷史</translation>
</message>
</context>
<context>
@@ -741,7 +895,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>size, rows, columns</source>
- <translation>尺寸、行、列</translation>
+ <translation>大小、列、行</translation>
</message>
<message>
<source>Encoding</source>
@@ -753,7 +907,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Text is qualified by</source>
- <translation>文字資料標示符號</translation>
+ <translation>字段包裹符號</translation>
</message>
<message>
<source>Fields are separated by</source>
@@ -768,10 +922,6 @@ Would you like to migrate your existing settings now?</source>
<translation>首行為欄位名稱</translation>
</message>
<message>
- <source>Number of headers line to discard</source>
- <translation>要捨棄的標題行數</translation>
- </message>
- <message>
<source>Consider &apos;\&apos; an escape character</source>
<translation>請以「\」作為跳脫符號</translation>
</message>
@@ -801,36 +951,53 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Empty fieldname %1</source>
- <translation type="unfinished"/>
+ <translation>空白欄位 %1</translation>
</message>
<message>
<source>column %1</source>
- <translation type="unfinished"/>
+ <translation>行 %1</translation>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
- <translation type="unfinished"/>
+ <translation>在 CSV 檔案中偵測到錯誤!</translation>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>[跳過額外 %n 項訊息]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
%1</source>
- <translation type="unfinished"/>
+ <translation>CSV 匯入:寫入器錯誤:
+%1</translation>
+ </message>
+ <message>
+ <source>Text qualification</source>
+ <translation>字段包裹</translation>
+ </message>
+ <message>
+ <source>Field separation</source>
+ <translation>欄位分隔</translation>
+ </message>
+ <message>
+ <source>Number of header lines to discard</source>
+ <translation>要忽略的開頭欄數</translation>
+ </message>
+ <message>
+ <source>CSV import preview</source>
+ <translation>CSV 匯入預覧</translation>
</message>
</context>
<context>
<name>CsvParserModel</name>
<message numerus="yes">
<source>%n column(s)</source>
- <translation><numerusform>%n 列,</numerusform></translation>
+ <translation><numerusform>%n 行</numerusform></translation>
</message>
<message>
<source>%1, %2, %3</source>
<comment>file info: bytes, rows, columns</comment>
- <translation>%1,%2,%3</translation>
+ <translation>%1, %2, %3</translation>
</message>
<message numerus="yes">
<source>%n byte(s)</source>
@@ -861,61 +1028,63 @@ Would you like to migrate your existing settings now?</source>
<translation>讀取資料庫時發生錯誤:%1</translation>
</message>
<message>
- <source>Could not save, database has no file name.</source>
- <translation>無法存檔,沒有資料庫的檔名。</translation>
- </message>
- <message>
<source>File cannot be written as it is opened in read-only mode.</source>
<translation>無法寫入檔案,因為該檔案以唯獨模式開啟。</translation>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
- <translation type="unfinished"/>
+ <translation>金鑰未轉換。這是一個 bug,請向開發者回報!</translation>
+ </message>
+ <message>
+ <source>%1
+Backup database located at %2</source>
+ <translation>%1
+備份資料庫位於 %2</translation>
+ </message>
+ <message>
+ <source>Could not save, database does not point to a valid file.</source>
+ <translation>無法儲存,資料庫未指向任何有效檔案。</translation>
+ </message>
+ <message>
+ <source>Could not save, database file is read-only.</source>
+ <translation>無法儲存,資料庫檔案為唯讀狀態。</translation>
+ </message>
+ <message>
+ <source>Database file has unmerged changes.</source>
+ <translation>資料庫檔案有未合併的變更。</translation>
+ </message>
+ <message>
+ <source>Recycle Bin</source>
+ <translation>回收桶</translation>
</message>
</context>
<context>
<name>DatabaseOpenDialog</name>
<message>
<source>Unlock Database - KeePassXC</source>
- <translation type="unfinished"/>
+ <translation>解鎖資料庫 - KeePassXC</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
- <source>Enter master key</source>
- <translation>輸入主密碼</translation>
- </message>
- <message>
<source>Key File:</source>
<translation>金鑰檔案:</translation>
</message>
<message>
- <source>Password:</source>
- <translation>密碼:</translation>
- </message>
- <message>
- <source>Browse</source>
- <translation>瀏覽</translation>
- </message>
- <message>
<source>Refresh</source>
<translation>重新整理</translation>
</message>
<message>
- <source>Challenge Response:</source>
- <translation>挑戰回應:</translation>
- </message>
- <message>
<source>Legacy key file format</source>
- <translation>舊式金鑰檔案格式</translation>
+ <translation>舊版金鑰檔案格式</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
- <translation>你正在使用未來將不再支援的舊式金鑰檔案格式。
+ <translation>你正在使用未來將不再支援的舊版金鑰檔案格式。
請考慮產生新的金鑰。</translation>
</message>
@@ -936,18 +1105,100 @@ Please consider generating a new key file.</source>
<translation>選擇金鑰檔案</translation>
</message>
<message>
- <source>TouchID for quick unlock</source>
- <translation type="unfinished"/>
+ <source>Failed to open key file: %1</source>
+ <translation>開啟金鑰檔案失敗:%1</translation>
</message>
<message>
- <source>Unable to open the database:
-%1</source>
- <translation type="unfinished"/>
+ <source>Select slot...</source>
+ <translation>選擇插槽...</translation>
</message>
<message>
- <source>Can't open key file:
-%1</source>
- <translation type="unfinished"/>
+ <source>Unlock KeePassXC Database</source>
+ <translation>解鎖 KeePassXC 資料庫</translation>
+ </message>
+ <message>
+ <source>Enter Password:</source>
+ <translation>輸入密碼:</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>密碼欄位</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>切換密碼可見性</translation>
+ </message>
+ <message>
+ <source>Enter Additional Credentials:</source>
+ <translation>輸入額外憑證:</translation>
+ </message>
+ <message>
+ <source>Key file selection</source>
+ <translation>金鑰檔案選擇</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>硬體金鑰插槽選擇</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>瀏覧金鑰檔案</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>瀏覽...</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>更新實體插槽</translation>
+ </message>
+ <message>
+ <source>Hardware Key:</source>
+ <translation>硬體金鑰:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</source>
+ <translation>&lt;p&gt;您可以使用實體安全金鑰如 &lt;strong&gt;YubiKey&lt;/strong&gt; 或 &lt;strong&gt;OnlyKey&lt;/strong&gt;,並配合以 HMAC-SHA1 設置的插槽。&lt;/p&gt;
+ &lt;p&gt;點此以獲得更多資訊...&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Hardware key help</source>
+ <translation>硬體金鑰幫助</translation>
+ </message>
+ <message>
+ <source>TouchID for Quick Unlock</source>
+ <translation>TouchID 快速解鎖</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>清除</translation>
+ </message>
+ <message>
+ <source>Clear Key File</source>
+ <translation>清除金鑰檔案</translation>
+ </message>
+ <message>
+ <source>Select file...</source>
+ <translation>選擇檔案...</translation>
+ </message>
+ <message>
+ <source>Unlock failed and no password given</source>
+ <translation>解鎖失敗,密碼未提供</translation>
+ </message>
+ <message>
+ <source>Unlocking the database failed and you did not enter a password.
+Do you want to retry with an &quot;empty&quot; password instead?
+
+To prevent this error from appearing, you must go to &quot;Database Settings / Security&quot; and reset your password.</source>
+ <translation>解鎖資料庫失敗,且您未輸入任何密碼。
+要改以「空白」密碼嘗試嗎?
+
+若要避免此錯誤發生,您必須前往「資料庫設定 / 安全性」並重設您的密碼。</translation>
+ </message>
+ <message>
+ <source>Retry with empty password</source>
+ <translation>以空白密碼重試</translation>
</message>
</context>
<context>
@@ -961,7 +1212,7 @@ Please consider generating a new key file.</source>
<name>DatabaseSettingsDialog</name>
<message>
<source>Advanced Settings</source>
- <translation type="unfinished"/>
+ <translation>進階設定</translation>
</message>
<message>
<source>General</source>
@@ -977,7 +1228,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Encryption Settings</source>
- <translation type="unfinished"/>
+ <translation>加密設定</translation>
</message>
<message>
<source>Browser Integration</source>
@@ -996,15 +1247,15 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
- <translation>遺忘目前項目中所有站台相關的設定 (&amp;e)</translation>
+ <translation>遺忘目前項目中所有站台相關的設定 (&amp;E)</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
- <translation type="unfinished"/>
+ <translation>移動 KeePassHTTP 屬性至 KeePassXC 瀏覽器自定資料 (&amp;C)</translation>
</message>
<message>
<source>Stored keys</source>
- <translation type="unfinished"/>
+ <translation>貯存金鑰</translation>
</message>
<message>
<source>Remove</source>
@@ -1012,24 +1263,25 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Delete the selected key?</source>
- <translation type="unfinished"/>
+ <translation>刪除所選金鑰?</translation>
</message>
<message>
<source>Do you really want to delete the selected key?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>真的要刪除選擇的金鑰?
+這可能會影響瀏覽器插件的連線。</translation>
</message>
<message>
<source>Key</source>
- <translation type="unfinished"/>
+ <translation>鍵</translation>
</message>
<message>
<source>Value</source>
- <translation type="unfinished"/>
+ <translation>值</translation>
</message>
<message>
<source>Enable Browser Integration to access these settings.</source>
- <translation type="unfinished"/>
+ <translation>啟用瀏覽器整合以存取這些設定。</translation>
</message>
<message>
<source>Disconnect all browsers</source>
@@ -1038,7 +1290,8 @@ This may prevent connection to the browser plugin.</source>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>真的要斷開所有瀏覽器的連線?
+這可能會影響瀏覽器插件的連線。</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
@@ -1046,7 +1299,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>No shared encryption keys found in KeePassXC settings.</source>
- <translation type="unfinished"/>
+ <translation>在 KeePassXC 設定中找不到共用加密金鑰。</translation>
</message>
<message>
<source>KeePassXC: Removed keys from database</source>
@@ -1054,16 +1307,17 @@ This may prevent connection to the browser plugin.</source>
</message>
<message numerus="yes">
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>成功從 KeePassXC 設定中移除 %n 個加密金鑰。</numerusform></translation>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
- <translation type="unfinished"/>
+ <translation>遺忘項目中與所有站台相關的設定</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
- <translation type="unfinished"/>
+ <translation>真的要遺忘每個項目的所有站台相關的設定嗎?
+存取項目的權限將被撤銷。</translation>
</message>
<message>
<source>Removing stored permissions…</source>
@@ -1079,7 +1333,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>成功從 %n 個項目移除權限。</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@@ -1091,12 +1345,21 @@ Permissions to access entries will be revoked.</source>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
- <translation type="unfinished"/>
+ <translation>移動 KeePassHTTP 屬性至自定資料</translation>
</message>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
- <translation type="unfinished"/>
+ <translation>真的要將所有舊式瀏覽器整合資料遷移到最新標準?
+這對於保持與瀏覽器插件的相容性是必要的。</translation>
+ </message>
+ <message>
+ <source>Stored browser keys</source>
+ <translation>已儲存的瀏覧器金鑰</translation>
+ </message>
+ <message>
+ <source>Remove selected key</source>
+ <translation>移除所選金鑰</translation>
</message>
</context>
<context>
@@ -1115,15 +1378,15 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Key Derivation Function:</source>
- <translation>金鑰衍生函數:</translation>
+ <translation>金鑰推導函式 (KDF):</translation>
</message>
<message>
<source>Transform rounds:</source>
- <translation>加密轉換次數:</translation>
+ <translation>轉換回合數:</translation>
</message>
<message>
<source>Benchmark 1-second delay</source>
- <translation>效能測試一秒延遲</translation>
+ <translation>測試一秒延遲</translation>
</message>
<message>
<source>Memory Usage:</source>
@@ -1155,7 +1418,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
- <translation type="unfinished"/>
+ <translation>較高的值提供較多保護,但需要更長的時間開啟資料庫。</translation>
</message>
<message>
<source>Database format:</source>
@@ -1167,7 +1430,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>KDBX 4.0 (recommended)</source>
- <translation>KDBX 4.0 (推薦)</translation>
+ <translation>KDBX 4.0(推薦)</translation>
</message>
<message>
<source>KDBX 3.1</source>
@@ -1218,17 +1481,17 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Failed to transform key with new KDF parameters; KDF unchanged.</source>
- <translation>無法用新的 KDF 參數轉換金鑰;KDF 不變。</translation>
+ <translation>無法以新的 KDF 參數轉換金鑰;KDF 保持不變。</translation>
</message>
<message numerus="yes">
<source> MiB</source>
<comment>Abbreviation for Mebibytes (KDF settings)</comment>
- <translation><numerusform>MiB</numerusform></translation>
+ <translation><numerusform> MiB</numerusform></translation>
</message>
<message numerus="yes">
<source> thread(s)</source>
<comment>Threads for parallel execution (KDF settings)</comment>
- <translation><numerusform>執行緒</numerusform></translation>
+ <translation><numerusform> 線程數</numerusform></translation>
</message>
<message numerus="yes">
<source>%1 ms</source>
@@ -1240,12 +1503,63 @@ If you keep this number, your database may be too easy to crack!</source>
<comment>seconds</comment>
<translation><numerusform>%1 秒</numerusform></translation>
</message>
+ <message>
+ <source>Change existing decryption time</source>
+ <translation>更改目前解密時間</translation>
+ </message>
+ <message>
+ <source>Decryption time in seconds</source>
+ <translation>解密所需時間(秒)</translation>
+ </message>
+ <message>
+ <source>Database format</source>
+ <translation>資料庫格式</translation>
+ </message>
+ <message>
+ <source>Encryption algorithm</source>
+ <translation>加密演算法</translation>
+ </message>
+ <message>
+ <source>Key derivation function</source>
+ <translation>金鑰推導函式</translation>
+ </message>
+ <message>
+ <source>Transform rounds</source>
+ <translation>轉換回合數</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>記憶體使用量</translation>
+ </message>
+ <message>
+ <source>Parallelism</source>
+ <translation>平行運算</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Exposed Entries</source>
+ <translation>已開放的項目</translation>
+ </message>
+ <message>
+ <source>Don&apos;t e&amp;xpose this database</source>
+ <translation>不要開放此資料庫 (&amp;X)</translation>
+ </message>
+ <message>
+ <source>Expose entries &amp;under this group:</source>
+ <translation>開放此群組的項目 (&amp;U):</translation>
+ </message>
+ <message>
+ <source>Enable fd.o Secret Service to access these settings.</source>
+ <translation>啟用 fd.o 秘密服務以存取這些設定。</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetGeneral</name>
<message>
<source>Database Meta Data</source>
- <translation>資料庫中繼資料</translation>
+ <translation>資料庫數據</translation>
</message>
<message>
<source>Database name:</source>
@@ -1257,7 +1571,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Default username:</source>
- <translation>預設的使用者名稱:</translation>
+ <translation>預設使用者名稱:</translation>
</message>
<message>
<source>History Settings</source>
@@ -1265,11 +1579,11 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Max. history items:</source>
- <translation>最大歷史記錄項目:</translation>
+ <translation>最大歷史記錄數:</translation>
</message>
<message>
<source>Max. history size:</source>
- <translation>最大歷史記錄大小:</translation>
+ <translation>最大歷史大小:</translation>
</message>
<message>
<source> MiB</source>
@@ -1285,7 +1599,41 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Enable &amp;compression (recommended)</source>
- <translation>啟用壓縮 (推薦) (&amp;C)</translation>
+ <translation>啟用壓縮(推薦)(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Database name field</source>
+ <translation>資料庫名稱欄位</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>資料庫描述欄位</translation>
+ </message>
+ <message>
+ <source>Default username field</source>
+ <translation>預設使用者名稱欄位</translation>
+ </message>
+ <message>
+ <source>Maximum number of history items per entry</source>
+ <translation>每個項目的最大歷史記錄數</translation>
+ </message>
+ <message>
+ <source>Maximum size of history per entry</source>
+ <translation>每個項目的最大歷史記錄大小</translation>
+ </message>
+ <message>
+ <source>Delete Recycle Bin</source>
+ <translation>刪除回收桶</translation>
+ </message>
+ <message>
+ <source>Do you want to delete the current recycle bin and all its contents?
+This action is not reversible.</source>
+ <translation>您要刪除目前的回收桶以及裡面所有內容嗎?
+此項操作無法恢復。</translation>
+ </message>
+ <message>
+ <source> (old)</source>
+ <translation> (舊)</translation>
</message>
</context>
<context>
@@ -1296,7 +1644,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Breadcrumb</source>
- <translation type="unfinished"/>
+ <translation>痕跡</translation>
</message>
<message>
<source>Type</source>
@@ -1308,7 +1656,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message>
<message>
<source>Last Signer</source>
- <translation type="unfinished"/>
+ <translation>最後的簽署者</translation>
</message>
<message>
<source>Certificates</source>
@@ -1317,26 +1665,26 @@ If you keep this number, your database may be too easy to crack!</source>
<message>
<source> &gt; </source>
<comment>Breadcrumb separator</comment>
- <translation>&gt;</translation>
+ <translation> &gt; </translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidgetMasterKey</name>
<message>
<source>Add additional protection...</source>
- <translation type="unfinished"/>
+ <translation>加入額外保護...</translation>
</message>
<message>
<source>No encryption key added</source>
- <translation type="unfinished"/>
+ <translation>未加入加密金鑰</translation>
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
- <translation type="unfinished"/>
+ <translation>您必須添加至少一個加密金鑰以保護您的資料庫!</translation>
</message>
<message>
<source>No password set</source>
- <translation>沒有設定密碼</translation>
+ <translation>未設定密碼</translation>
</message>
<message>
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
@@ -1354,6 +1702,10 @@ Are you sure you want to continue without a password?</source>
<source>Failed to change master key</source>
<translation>更改主密碼失敗</translation>
</message>
+ <message>
+ <source>Continue without password</source>
+ <translation>不使用密碼並繼續</translation>
+ </message>
</context>
<context>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
@@ -1365,6 +1717,129 @@ Are you sure you want to continue without a password?</source>
<source>Description:</source>
<translation>描述:</translation>
</message>
+ <message>
+ <source>Database name field</source>
+ <translation>資料庫名稱欄位</translation>
+ </message>
+ <message>
+ <source>Database description field</source>
+ <translation>資料庫描述欄位</translation>
+ </message>
+</context>
+<context>
+ <name>DatabaseSettingsWidgetStatistics</name>
+ <message>
+ <source>Statistics</source>
+ <translation>統計</translation>
+ </message>
+ <message>
+ <source>Hover over lines with error icons for further information.</source>
+ <translation>將游標懸浮於錯誤圖示出現的欄位,可獲得更多資訊。</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名稱</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ <message>
+ <source>Database name</source>
+ <translation>資料庫名稱</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>描述</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Last saved</source>
+ <translation>最近儲存於</translation>
+ </message>
+ <message>
+ <source>Unsaved changes</source>
+ <translation>未儲存變更</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>是</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>否</translation>
+ </message>
+ <message>
+ <source>The database was modified, but the changes have not yet been saved to disk.</source>
+ <translation>資料庫已被更改,但變更尚未被儲存至磁碟。</translation>
+ </message>
+ <message>
+ <source>Number of groups</source>
+ <translation>群組數</translation>
+ </message>
+ <message>
+ <source>Number of entries</source>
+ <translation>項目數</translation>
+ </message>
+ <message>
+ <source>Number of expired entries</source>
+ <translation>已過期項目數</translation>
+ </message>
+ <message>
+ <source>The database contains entries that have expired.</source>
+ <translation>資料庫包含已過期的項目。</translation>
+ </message>
+ <message>
+ <source>Unique passwords</source>
+ <translation>獨特的密碼</translation>
+ </message>
+ <message>
+ <source>Non-unique passwords</source>
+ <translation>非獨特的密碼</translation>
+ </message>
+ <message>
+ <source>More than 10% of passwords are reused. Use unique passwords when possible.</source>
+ <translation>超過 10% 的密碼被重複使用。請盡可能使用獨一無二的密碼。</translation>
+ </message>
+ <message>
+ <source>Maximum password reuse</source>
+ <translation>最大密碼重複使用次數</translation>
+ </message>
+ <message>
+ <source>Some passwords are used more than three times. Use unique passwords when possible.</source>
+ <translation>某些密碼被使用超過三次以上。請盡可能使用獨一無二的密碼。</translation>
+ </message>
+ <message>
+ <source>Number of short passwords</source>
+ <translation>過短密碼數</translation>
+ </message>
+ <message>
+ <source>Recommended minimum password length is at least 8 characters.</source>
+ <translation>建議最短密碼長度為至少 8 個字元。</translation>
+ </message>
+ <message>
+ <source>Number of weak passwords</source>
+ <translation>弱密碼數</translation>
+ </message>
+ <message>
+ <source>Recommend using long, randomized passwords with a rating of &apos;good&apos; or &apos;excellent&apos;.</source>
+ <translation>建議使用足夠長度、亂度,且評價為「較好」或「極好」的密碼。</translation>
+ </message>
+ <message>
+ <source>Average password length</source>
+ <translation>平均密碼長度</translation>
+ </message>
+ <message>
+ <source>%1 characters</source>
+ <translation>%1 字元</translation>
+ </message>
+ <message>
+ <source>Average password length is less than ten characters. Longer passwords provide more security.</source>
+ <translation>平均密碼長度小於 10 個字元。密碼越長,能提供的保護越多。</translation>
+ </message>
</context>
<context>
<name>DatabaseTabWidget</name>
@@ -1411,15 +1886,12 @@ Are you sure you want to continue without a password?</source>
<message>
<source>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>The database file does not exist or is not accessible.</source>
- <translation type="unfinished"/>
+ <translation>建立的資料庫沒有金鑰或 KDF,拒絕儲存。
+這顯然是一個臭蟲 (bug),請向開發人員回報。</translation>
</message>
<message>
<source>Select CSV file</source>
- <translation type="unfinished"/>
+ <translation>選擇 CSV 檔案</translation>
</message>
<message>
<source>New Database</source>
@@ -1428,7 +1900,7 @@ This is definitely a bug, please report it to the developers.</source>
<message>
<source>%1 [New Database]</source>
<comment>Database tab name modifier</comment>
- <translation>%1 [新的資料庫]</translation>
+ <translation>%1 [新資料庫]</translation>
</message>
<message>
<source>%1 [Locked]</source>
@@ -1440,6 +1912,30 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [唯讀]</translation>
</message>
+ <message>
+ <source>Failed to open %1. It either does not exist or is not accessible.</source>
+ <translation>開啟 %1 失敗。此項目不存在或無法存取。</translation>
+ </message>
+ <message>
+ <source>Export database to HTML file</source>
+ <translation>匯出資料庫至 HTML 檔案</translation>
+ </message>
+ <message>
+ <source>HTML file</source>
+ <translation>HTML 檔案</translation>
+ </message>
+ <message>
+ <source>Writing the HTML file failed.</source>
+ <translation>寫入 HTML 檔案失敗。</translation>
+ </message>
+ <message>
+ <source>Export Confirmation</source>
+ <translation>匯出確認</translation>
+ </message>
+ <message>
+ <source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
+ <translation>您正要匯出資料庫至未加密的檔案。您的密碼及敏感資料將不受任何保護!真的要繼續嗎?</translation>
+ </message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1519,19 +2015,15 @@ Do you want to merge your changes?</source>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>真的要永遠移除 %n 個項目?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>刪除項目?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
- </message>
- <message>
- <source>File opened in read only mode.</source>
- <translation>已將檔案以唯讀模式開啟。</translation>
+ <translation><numerusform>移動項目到資源回收桶?</numerusform></translation>
</message>
<message>
<source>Lock Database?</source>
@@ -1539,7 +2031,7 @@ Do you want to merge your changes?</source>
</message>
<message>
<source>You are editing an entry. Discard changes and lock anyway?</source>
- <translation type="unfinished"/>
+ <translation>您正在編輯一個項目。放棄更改並鎖定?</translation>
</message>
<message>
<source>&quot;%1&quot; was modified.
@@ -1560,21 +2052,18 @@ Save changes?</source>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
- <translation type="unfinished"/>
+ <translation>嘗試自動重啟時無法開啟新的資料庫檔案。
+錯誤:%1</translation>
</message>
<message>
<source>Disable safe saves?</source>
- <translation>關閉安全存檔?</translation>
+ <translation>關閉安全存檔?</translation>
</message>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Writing the database failed.
-%1</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC 儲存資料庫已失敗數次。有可能是檔案同步服務將儲存檔案鎖住了。
+將安全儲存停用並再試一次?</translation>
</message>
<message>
<source>Passwords</source>
@@ -1590,11 +2079,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Replace references to entry?</source>
- <translation type="unfinished"/>
+ <translation>替換對項目的引用?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>項目「%1」有 %2 個引用。是否使用值覆寫引用、跳過此項目或刪除?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@@ -1602,23 +2091,31 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Move group to recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>移動群組至回收桶?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
- <translation type="unfinished"/>
+ <translation>真的要移動群組「%1」至回收桶?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
- <translation type="unfinished"/>
+ <translation>成功合併資料庫檔案。</translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
- <translation type="unfinished"/>
+ <translation>資料庫未被合併操作修改。</translation>
</message>
<message>
<source>Shared group...</source>
- <translation type="unfinished"/>
+ <translation>共享群組...</translation>
+ </message>
+ <message>
+ <source>Writing the database failed: %1</source>
+ <translation>寫入資料庫失敗:%1</translation>
+ </message>
+ <message>
+ <source>This database is opened in read-only mode. Autosave is disabled.</source>
+ <translation>此資料庫以唯讀模式開啟。自動儲存已停用。</translation>
</message>
</context>
<context>
@@ -1645,7 +2142,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>History</source>
- <translation>歷史記錄</translation>
+ <translation>歷史</translation>
</message>
<message>
<source>SSH Agent</source>
@@ -1673,11 +2170,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Entry history</source>
- <translation>項目歷史記錄</translation>
+ <translation>項目歷史</translation>
</message>
<message>
<source>Add entry</source>
- <translation>增加項目</translation>
+ <translation>加入項目</translation>
</message>
<message>
<source>Edit entry</source>
@@ -1701,11 +2198,11 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
- <translation><numerusform>%n 個禮拜</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>Apply generated password?</source>
@@ -1721,11 +2218,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Entry has unsaved changes</source>
- <translation type="unfinished"/>
+ <translation>項目有未保存的變更</translation>
</message>
<message>
<source>New attribute %1</source>
- <translation type="unfinished"/>
+ <translation>新的屬性 %1</translation>
</message>
<message>
<source>[PROTECTED] Press reveal to view or edit</source>
@@ -1733,11 +2230,23 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>%n 年</numerusform></translation>
</message>
<message>
<source>Confirm Removal</source>
- <translation type="unfinished"/>
+ <translation>確認移除</translation>
+ </message>
+ <message>
+ <source>Browser Integration</source>
+ <translation>瀏覽器整合</translation>
+ </message>
+ <message>
+ <source>&lt;empty URL&gt;</source>
+ <translation>&lt;空白網址&gt;</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to remove this URL?</source>
+ <translation>真的要移除此網址?</translation>
</message>
</context>
<context>
@@ -1778,6 +2287,42 @@ Disable safe saves and try again?</source>
<source>Background Color:</source>
<translation>背景顏色:</translation>
</message>
+ <message>
+ <source>Attribute selection</source>
+ <translation>屬性選擇</translation>
+ </message>
+ <message>
+ <source>Attribute value</source>
+ <translation>屬性值</translation>
+ </message>
+ <message>
+ <source>Add a new attribute</source>
+ <translation>加入新屬性</translation>
+ </message>
+ <message>
+ <source>Remove selected attribute</source>
+ <translation>移除所選屬性</translation>
+ </message>
+ <message>
+ <source>Edit attribute name</source>
+ <translation>編輯屬性名稱</translation>
+ </message>
+ <message>
+ <source>Toggle attribute protection</source>
+ <translation>切換屬性保護</translation>
+ </message>
+ <message>
+ <source>Show a protected attribute</source>
+ <translation>顯示被保護的屬性</translation>
+ </message>
+ <message>
+ <source>Foreground color selection</source>
+ <translation>前景顏色選擇</translation>
+ </message>
+ <message>
+ <source>Background color selection</source>
+ <translation>背景顏色選擇</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -1811,7 +2356,78 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Use a specific sequence for this association:</source>
- <translation type="unfinished"/>
+ <translation>使用特定序列進行此關聯:</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence</source>
+ <translation>自訂自動輸入序列</translation>
+ </message>
+ <message>
+ <source>Open Auto-Type help webpage</source>
+ <translation>開啟自動輸入幫助網頁</translation>
+ </message>
+ <message>
+ <source>Existing window associations</source>
+ <translation>即存的視窗關聯</translation>
+ </message>
+ <message>
+ <source>Add new window association</source>
+ <translation>加入新的視窗關聯</translation>
+ </message>
+ <message>
+ <source>Remove selected window association</source>
+ <translation>移除所選的視窗關聯</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk (*) to match everything</source>
+ <translation>您可以使用星號 (*) 匹配任意字詞</translation>
+ </message>
+ <message>
+ <source>Set the window association title</source>
+ <translation>設定視窗關聯標題</translation>
+ </message>
+ <message>
+ <source>You can use an asterisk to match everything</source>
+ <translation>您可以使用星號匹配任意字詞</translation>
+ </message>
+ <message>
+ <source>Custom Auto-Type sequence for this window</source>
+ <translation>自訂此視窗的自動輸入序列</translation>
+ </message>
+</context>
+<context>
+ <name>EditEntryWidgetBrowser</name>
+ <message>
+ <source>These settings affect to the entry&apos;s behaviour with the browser extension.</source>
+ <translation>這些設定影響了項目在瀏覧器擴充下的行為。</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>一般</translation>
+ </message>
+ <message>
+ <source>Skip Auto-Submit for this entry</source>
+ <translation>為此項目跳過自動送出</translation>
+ </message>
+ <message>
+ <source>Hide this entry from the browser extension</source>
+ <translation>在瀏覧器擴充隱藏此項目</translation>
+ </message>
+ <message>
+ <source>Additional URL&apos;s</source>
+ <translation>其他網址</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>加入</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>移除</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>編輯</translation>
</message>
</context>
<context>
@@ -1832,6 +2448,26 @@ Disable safe saves and try again?</source>
<source>Delete all</source>
<translation>刪除全部</translation>
</message>
+ <message>
+ <source>Entry history selection</source>
+ <translation>項目歷史選擇</translation>
+ </message>
+ <message>
+ <source>Show entry at selected history state</source>
+ <translation>顯示所選歷史狀態下的項目</translation>
+ </message>
+ <message>
+ <source>Restore entry to selected history state</source>
+ <translation>恢復項目至所選歷史狀態</translation>
+ </message>
+ <message>
+ <source>Delete selected history state</source>
+ <translation>刪除所選歷史狀態</translation>
+ </message>
+ <message>
+ <source>Delete all history</source>
+ <translation>刪除所有歷史</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetMain</name>
@@ -1861,7 +2497,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Toggle the checkbox to reveal the notes section.</source>
- <translation>切換核取方塊以揭示備註欄位。</translation>
+ <translation>勾選核取方塊以揭示附註欄位。</translation>
</message>
<message>
<source>Username:</source>
@@ -1871,6 +2507,62 @@ Disable safe saves and try again?</source>
<source>Expires</source>
<translation>過期</translation>
</message>
+ <message>
+ <source>Url field</source>
+ <translation>網址欄位</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>下載網址的收藏夾圖示</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>重複密碼欄位</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>切換密碼產生器</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>密碼欄位</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>切換密碼可見性</translation>
+ </message>
+ <message>
+ <source>Toggle notes visible</source>
+ <translation>切換附註可見性</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>過期欄位</translation>
+ </message>
+ <message>
+ <source>Expiration Presets</source>
+ <translation>過期日預置</translation>
+ </message>
+ <message>
+ <source>Expiration presets</source>
+ <translation>過期日預置</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>附註欄位</translation>
+ </message>
+ <message>
+ <source>Title field</source>
+ <translation>標題欄位</translation>
+ </message>
+ <message>
+ <source>Username field</source>
+ <translation>使用者名稱欄位</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>切換過期日</translation>
+ </message>
</context>
<context>
<name>EditEntryWidgetSSHAgent</name>
@@ -1900,7 +2592,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
- <translation>當打開/解鎖資料庫時向代理新增金鑰</translation>
+ <translation>當打開/解鎖資料庫時向代理加入金鑰</translation>
</message>
<message>
<source>Comment</source>
@@ -1929,7 +2621,7 @@ Disable safe saves and try again?</source>
<message>
<source>Browse...</source>
<extracomment>Button for opening file dialog</extracomment>
- <translation>瀏覽……</translation>
+ <translation>瀏覽...</translation>
</message>
<message>
<source>Attachment</source>
@@ -1937,16 +2629,32 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Add to agent</source>
- <translation>新增到代理</translation>
+ <translation>加入到代理</translation>
</message>
<message>
<source>Remove from agent</source>
- <translation>從代理中刪除</translation>
+ <translation>從代理移除</translation>
</message>
<message>
<source>Require user confirmation when this key is used</source>
<translation>使用此金鑰時需要使用者確認</translation>
</message>
+ <message>
+ <source>Remove key from agent after specified seconds</source>
+ <translation>於指定秒數後從代理移除金鑰</translation>
+ </message>
+ <message>
+ <source>Browser for key file</source>
+ <translation>瀏覧金鑰檔案</translation>
+ </message>
+ <message>
+ <source>External key file</source>
+ <translation>外部金鑰檔案</translation>
+ </message>
+ <message>
+ <source>Select attachment file</source>
+ <translation>選擇附件檔案</translation>
+ </message>
</context>
<context>
<name>EditGroupWidget</name>
@@ -1976,12 +2684,16 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Disable</source>
- <translation>關閉</translation>
+ <translation>停用</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
<translation>繼承自上層群組 (%1)</translation>
</message>
+ <message>
+ <source>Entry has unsaved changes</source>
+ <translation>項目有未保存的變更</translation>
+ </message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -1991,15 +2703,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Type:</source>
- <translation type="unfinished"/>
+ <translation>類型:</translation>
</message>
<message>
<source>Path:</source>
- <translation type="unfinished"/>
+ <translation>路徑:</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"/>
+ <translation>...</translation>
</message>
<message>
<source>Password:</source>
@@ -2007,71 +2719,102 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Inactive</source>
- <translation type="unfinished"/>
+ <translation>無效</translation>
+ </message>
+ <message>
+ <source>KeeShare unsigned container</source>
+ <translation>KeeShare 未簽署容器</translation>
+ </message>
+ <message>
+ <source>KeeShare signed container</source>
+ <translation>KeeShare 簽署容器</translation>
</message>
<message>
- <source>Import from path</source>
- <translation type="unfinished"/>
+ <source>Select import source</source>
+ <translation>選擇匯入來源</translation>
</message>
<message>
- <source>Export to path</source>
- <translation type="unfinished"/>
+ <source>Select export target</source>
+ <translation>選擇匯出目標</translation>
</message>
<message>
- <source>Synchronize with path</source>
- <translation type="unfinished"/>
+ <source>Select import/export file</source>
+ <translation>選擇匯入/匯出檔案</translation>
</message>
<message>
- <source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
- <translation type="unfinished"/>
+ <source>Clear</source>
+ <translation>清除</translation>
</message>
<message>
- <source>Database sharing is disabled</source>
- <translation type="unfinished"/>
+ <source>Import</source>
+ <translation>匯入</translation>
</message>
<message>
- <source>Database export is disabled</source>
- <translation type="unfinished"/>
+ <source>Export</source>
+ <translation>匯出</translation>
</message>
<message>
- <source>Database import is disabled</source>
- <translation type="unfinished"/>
+ <source>Synchronize</source>
+ <translation>同步</translation>
</message>
<message>
- <source>KeeShare unsigned container</source>
- <translation type="unfinished"/>
+ <source>Your KeePassXC version does not support sharing this container type.
+Supported extensions are: %1.</source>
+ <translation>您的 KeePassXC 版本不支援此容器類型。
+受支援的擴充為:%1。</translation>
</message>
<message>
- <source>KeeShare signed container</source>
- <translation type="unfinished"/>
+ <source>%1 is already being exported by this database.</source>
+ <translation>%1 已被此資料庫匯出。</translation>
</message>
<message>
- <source>Select import source</source>
- <translation type="unfinished"/>
+ <source>%1 is already being imported by this database.</source>
+ <translation>%1 已被此資料庫匯入。</translation>
</message>
<message>
- <source>Select export target</source>
- <translation type="unfinished"/>
+ <source>%1 is being imported and exported by different groups in this database.</source>
+ <translation>%1 在此資料庫內被不同的群組匯入並匯出。</translation>
</message>
<message>
- <source>Select import/export file</source>
- <translation type="unfinished"/>
+ <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
+ <comment>KeeShare is a proper noun</comment>
+ <translation>KeeShare 目前停用。您可以在應用程式設定中啟用匯入/匯出功能。</translation>
</message>
<message>
- <source>Clear</source>
- <translation>清除</translation>
+ <source>Database export is currently disabled by application settings.</source>
+ <translation>目前資料庫匯出被應用程式設定停用。</translation>
+ </message>
+ <message>
+ <source>Database import is currently disabled by application settings.</source>
+ <translation>目前資料庫匯入被應用程式設定停用。</translation>
+ </message>
+ <message>
+ <source>Sharing mode field</source>
+ <translation>分享模式欄位</translation>
</message>
<message>
- <source>The export container %1 is already referenced.</source>
- <translation type="unfinished"/>
+ <source>Path to share file field</source>
+ <translation>分享檔案路徑欄位</translation>
</message>
<message>
- <source>The import container %1 is already imported.</source>
- <translation type="unfinished"/>
+ <source>Browser for share file</source>
+ <translation>瀏覧分享檔案</translation>
</message>
<message>
- <source>The container %1 imported and export by different groups.</source>
- <translation type="unfinished"/>
+ <source>Password field</source>
+ <translation>密碼欄位</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>切換密碼可見性</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>切換密碼產生器</translation>
+ </message>
+ <message>
+ <source>Clear fields</source>
+ <translation>清除欄位</translation>
</message>
</context>
<context>
@@ -2104,6 +2847,34 @@ Disable safe saves and try again?</source>
<source>Set default Auto-Type se&amp;quence</source>
<translation>設定預設自動輸入序列 (&amp;Q)</translation>
</message>
+ <message>
+ <source>Name field</source>
+ <translation>名稱欄位</translation>
+ </message>
+ <message>
+ <source>Notes field</source>
+ <translation>附註欄位</translation>
+ </message>
+ <message>
+ <source>Toggle expiration</source>
+ <translation>切換過期時間</translation>
+ </message>
+ <message>
+ <source>Auto-Type toggle for this and sub groups</source>
+ <translation>切換此群組及其子群組的自動輸入</translation>
+ </message>
+ <message>
+ <source>Expiration field</source>
+ <translation>過期時間欄位</translation>
+ </message>
+ <message>
+ <source>Search toggle for this and sub groups</source>
+ <translation>切換此群組及其子群組的搜尋</translation>
+ </message>
+ <message>
+ <source>Default auto-type sequence field</source>
+ <translation>預設自動輸入序列欄位</translation>
+ </message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -2125,11 +2896,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Download favicon</source>
- <translation>下載圖示</translation>
+ <translation>下載收藏夾圖示</translation>
</message>
<message>
<source>Unable to fetch favicon.</source>
- <translation>無法擷取圖示。</translation>
+ <translation>無法擷取收藏夾圖示。</translation>
</message>
<message>
<source>Images</source>
@@ -2140,44 +2911,68 @@ Disable safe saves and try again?</source>
<translation>所有檔案</translation>
</message>
<message>
- <source>Custom icon already exists</source>
- <translation>自訂圖示已經存在</translation>
- </message>
- <message>
<source>Confirm Delete</source>
<translation>確認刪除</translation>
</message>
<message>
- <source>Custom icon successfully downloaded</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>Select Image(s)</source>
- <translation type="unfinished"/>
+ <translation>選擇圖片</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>成功載入 %1 / %n 個圖示</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
- <translation type="unfinished"/>
+ <translation>未載入任何圖示</translation>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>%n 個圖示已存在於資料庫</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>以下圖示失敗:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>此圖示由 %n 個條目使用,並將被替換為預設圖示。確定要刪除它嗎?</numerusform></translation>
+ </message>
+ <message>
+ <source>You can enable the DuckDuckGo website icon service under Tools -&gt; Settings -&gt; Security</source>
+ <translation>您可以到「工具」-&gt;「設定」-&gt;「安全性」啟用 DuckDuckGo 網站圖示服務</translation>
+ </message>
+ <message>
+ <source>Download favicon for URL</source>
+ <translation>下載網址的收藏夾圖示</translation>
+ </message>
+ <message>
+ <source>Apply selected icon to subgroups and entries</source>
+ <translation>套用所選的圖示至子群組與項目</translation>
+ </message>
+ <message>
+ <source>Apply icon &amp;to ...</source>
+ <translation>加入圖示至 (&amp;T)...</translation>
+ </message>
+ <message>
+ <source>Apply to this only</source>
+ <translation>只套用至此</translation>
+ </message>
+ <message>
+ <source>Also apply to child groups</source>
+ <translation>也套用至子群組</translation>
+ </message>
+ <message>
+ <source>Also apply to child entries</source>
+ <translation>也套用至子項目</translation>
+ </message>
+ <message>
+ <source>Also apply to all children</source>
+ <translation>也套用至所有子群組與項目</translation>
+ </message>
+ <message>
+ <source>Existing icon selected.</source>
+ <translation>選擇了已存在的圖示。</translation>
</message>
</context>
<context>
@@ -2200,7 +2995,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Plugin Data</source>
- <translation type="unfinished"/>
+ <translation>插件資料</translation>
</message>
<message>
<source>Remove</source>
@@ -2208,27 +3003,52 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Delete plugin data?</source>
- <translation type="unfinished"/>
+ <translation>刪除插件資料?</translation>
</message>
<message>
<source>Do you really want to delete the selected plugin data?
This may cause the affected plugins to malfunction.</source>
- <translation type="unfinished"/>
+ <translation>真的要刪除選擇的插件資料?
+這可能導致受影響的插件出現問題。</translation>
</message>
<message>
<source>Key</source>
- <translation type="unfinished"/>
+ <translation>鍵</translation>
</message>
<message>
<source>Value</source>
- <translation type="unfinished"/>
+ <translation>值</translation>
+ </message>
+ <message>
+ <source>Datetime created</source>
+ <translation>建立日期時間</translation>
+ </message>
+ <message>
+ <source>Datetime modified</source>
+ <translation>修改日期時間</translation>
+ </message>
+ <message>
+ <source>Datetime accessed</source>
+ <translation>存取日期時間</translation>
+ </message>
+ <message>
+ <source>Unique ID</source>
+ <translation>獨特 ID</translation>
+ </message>
+ <message>
+ <source>Plugin data</source>
+ <translation>插件資料</translation>
+ </message>
+ <message>
+ <source>Remove selected plugin data</source>
+ <translation>移除所選的插件資料</translation>
</message>
</context>
<context>
<name>Entry</name>
<message>
<source>%1 - Clone</source>
- <translation type="unfinished"/>
+ <translation>%1 - 複製</translation>
</message>
</context>
<context>
@@ -2270,7 +3090,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
- <translation><numerusform>確定移除 %n 個附件?</numerusform></translation>
+ <translation><numerusform>確定要移除 %n 個附件嗎?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@@ -2284,7 +3104,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Are you sure you want to overwrite the existing file &quot;%1&quot; with the attachment?</source>
- <translation>確定要以附件覆蓋現有的檔案 &quot;%1&quot; 嗎?</translation>
+ <translation>確定要以附件覆蓋現有的檔案「%1」嗎?</translation>
</message>
<message>
<source>Confirm overwrite</source>
@@ -2310,12 +3130,33 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Confirm remove</source>
- <translation type="unfinished"/>
+ <translation>確認移除</translation>
</message>
<message numerus="yes">
<source>Unable to open file(s):
%1</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>無法開啟檔案:
+%1</numerusform></translation>
+ </message>
+ <message>
+ <source>Attachments</source>
+ <translation>附件</translation>
+ </message>
+ <message>
+ <source>Add new attachment</source>
+ <translation>加入新附件</translation>
+ </message>
+ <message>
+ <source>Remove selected attachment</source>
+ <translation>移除所選附件</translation>
+ </message>
+ <message>
+ <source>Open selected attachment</source>
+ <translation>開啟所選附件</translation>
+ </message>
+ <message>
+ <source>Save selected attachment to disk</source>
+ <translation>儲存所選附件至磁碟</translation>
</message>
</context>
<context>
@@ -2385,15 +3226,15 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Created</source>
- <translation>已建立</translation>
+ <translation>建立於</translation>
</message>
<message>
<source>Modified</source>
- <translation>已修改</translation>
+ <translation>修改於</translation>
</message>
<message>
<source>Accessed</source>
- <translation>已存取</translation>
+ <translation>存取於</translation>
</message>
<message>
<source>Attachments</source>
@@ -2401,20 +3242,16 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Yes</source>
- <translation type="unfinished"/>
+ <translation>是</translation>
</message>
<message>
<source>TOTP</source>
- <translation type="unfinished"/>
+ <translation>TOTP</translation>
</message>
</context>
<context>
<name>EntryPreviewWidget</name>
<message>
- <source>Generate TOTP Token</source>
- <translation>產生 TOTP Token</translation>
- </message>
- <message>
<source>Close</source>
<translation>關閉</translation>
</message>
@@ -2464,7 +3301,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Searching</source>
- <translation>搜尋中</translation>
+ <translation>搜尋功能</translation>
</message>
<message>
<source>Search</source>
@@ -2485,7 +3322,7 @@ This may cause the affected plugins to malfunction.</source>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
- <translation type="unfinished"/>
+ <translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message>
<source>Enabled</source>
@@ -2497,14 +3334,22 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Share</source>
- <translation type="unfinished"/>
+ <translation>共用</translation>
+ </message>
+ <message>
+ <source>Display current TOTP value</source>
+ <translation>顯示目前 TOTP 值</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>進階</translation>
</message>
</context>
<context>
<name>EntryView</name>
<message>
<source>Customize View</source>
- <translation type="unfinished"/>
+ <translation>自訂檢視</translation>
</message>
<message>
<source>Hide Usernames</source>
@@ -2516,11 +3361,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Fit to window</source>
- <translation type="unfinished"/>
+ <translation>符合視窗</translation>
</message>
<message>
<source>Fit to contents</source>
- <translation type="unfinished"/>
+ <translation>符合內容</translation>
</message>
<message>
<source>Reset to defaults</source>
@@ -2528,19 +3373,41 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Attachments (icon)</source>
- <translation type="unfinished"/>
+ <translation>附件 (圖示)</translation>
</message>
</context>
<context>
- <name>Group</name>
+ <name>FdoSecrets::Item</name>
<message>
- <source>Recycle Bin</source>
- <translation>回收桶</translation>
+ <source>Entry &quot;%1&quot; from database &quot;%2&quot; was used by %3</source>
+ <translation>項目「%1」來自資料庫「%2」,被 %3 使用</translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecrets::Service</name>
+ <message>
+ <source>Failed to register DBus service at %1: another secret service is running.</source>
+ <translation>註冊 DBus 服務於 %1 失敗:另一個秘密服務已經在執行當中。</translation>
</message>
+ <message numerus="yes">
+ <source>%n Entry(s) was used by %1</source>
+ <comment>%1 is the name of an application</comment>
+ <translation><numerusform>%n 個項目被 %1 使用</numerusform></translation>
+ </message>
+</context>
+<context>
+ <name>FdoSecretsPlugin</name>
+ <message>
+ <source>Fdo Secret Service: %1</source>
+ <translation>Fdo 秘密服務 (Secret Service):%1</translation>
+ </message>
+</context>
+<context>
+ <name>Group</name>
<message>
<source>[empty]</source>
<comment>group has no children</comment>
- <translation type="unfinished"/>
+ <translation>[空白]</translation>
</message>
</context>
<context>
@@ -2551,7 +3418,60 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Cannot save the native messaging script file.</source>
- <translation>無法保存 native messaging 指令檔。</translation>
+ <translation>無法保存 native messaging 指令檔案。</translation>
+ </message>
+</context>
+<context>
+ <name>IconDownloaderDialog</name>
+ <message>
+ <source>Download Favicons</source>
+ <translation>下載收藏夾圖示</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</source>
+ <translation>下載圖示時碰到問題了?
+您可以在應用程式設定的「安全性」一欄啟用 DuckDuckGo 網站圖示服務。</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>URL</source>
+ <translation>網址</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>狀態</translation>
+ </message>
+ <message>
+ <source>Please wait, processing entry list...</source>
+ <translation>請稍待,正在處理項目清單...</translation>
+ </message>
+ <message>
+ <source>Downloading...</source>
+ <translation>正在下載...</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>確定</translation>
+ </message>
+ <message>
+ <source>Already Exists</source>
+ <translation>已存在</translation>
+ </message>
+ <message>
+ <source>Download Failed</source>
+ <translation>下載失敗</translation>
+ </message>
+ <message>
+ <source>Downloading favicons (%1/%2)...</source>
+ <translation>正在下載收藏夾圖示 (%1/%2)...</translation>
</message>
</context>
<context>
@@ -2569,23 +3489,19 @@ This may cause the affected plugins to malfunction.</source>
<name>Kdbx3Reader</name>
<message>
<source>Unable to calculate master key</source>
- <translation>無法計算主密碼</translation>
+ <translation>無法計算主金鑰</translation>
</message>
<message>
<source>Unable to issue challenge-response.</source>
<translation>無法發出挑戰-回應。</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>金鑰不正確或是資料庫損壞。</translation>
- </message>
- <message>
<source>missing database headers</source>
<translation>缺少資料庫標頭</translation>
</message>
<message>
<source>Header doesn&apos;t match hash</source>
- <translation type="unfinished"/>
+ <translation>標頭與雜湊值不匹配</translation>
</message>
<message>
<source>Invalid header id size</source>
@@ -2599,6 +3515,12 @@ This may cause the affected plugins to malfunction.</source>
<source>Invalid header data length</source>
<translation>無效的資料長度</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>所提供的憑證無效,請再嘗試一遍。
+若此情形一再發生,代表您的資料庫檔案可能已損毀。</translation>
+ </message>
</context>
<context>
<name>Kdbx3Writer</name>
@@ -2608,7 +3530,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>無法計算主密碼</translation>
+ <translation>無法計算主金鑰</translation>
</message>
</context>
<context>
@@ -2619,7 +3541,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>無法計算主密碼</translation>
+ <translation>無法計算主金鑰</translation>
</message>
<message>
<source>Invalid header checksum size</source>
@@ -2630,10 +3552,6 @@ This may cause the affected plugins to malfunction.</source>
<translation>SHA256 標頭不相符</translation>
</message>
<message>
- <source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
- <translation>金鑰不正確或是資料庫損壞。(HMAC 不相符)</translation>
- </message>
- <message>
<source>Unknown cipher</source>
<translation>未知的加密</translation>
</message>
@@ -2655,11 +3573,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source>
- <translation>不支援的金鑰衍生函數 (KDF) 或參數無效</translation>
+ <translation>不支援的金鑰推導函式 (KDF) 或無效參數</translation>
</message>
<message>
<source>Legacy header fields found in KDBX4 file.</source>
- <translation>在 KDBX4 檔中找到的舊式標頭欄位。</translation>
+ <translation>在 KDBX4 檔案中找到的舊式標頭欄位。</translation>
</message>
<message>
<source>Invalid inner header id size</source>
@@ -2733,21 +3651,31 @@ This may cause the affected plugins to malfunction.</source>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>無效的變體映射欄位類型大小</translation>
</message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>所提供的憑證無效,請再嘗試一遍。
+若此情形一再發生,代表您的資料庫檔案可能已損毀。</translation>
+ </message>
+ <message>
+ <source>(HMAC mismatch)</source>
+ <translation>(HMAC 不符)</translation>
+ </message>
</context>
<context>
<name>Kdbx4Writer</name>
<message>
<source>Invalid symmetric cipher algorithm.</source>
- <translation>無效的對稱密碼演算法。</translation>
+ <translation>無效的對稱式加密演算法。</translation>
</message>
<message>
<source>Invalid symmetric cipher IV size.</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation>無效的對稱密碼 IV 大小。</translation>
+ <translation>對稱式加密演算法的初始向量 (IV) 大小為無效。</translation>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>無法計算主密碼</translation>
+ <translation>無法計算主金鑰</translation>
</message>
<message>
<source>Failed to serialize KDF parameters variant map</source>
@@ -2804,8 +3732,8 @@ 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>
+您可以點選「資料庫」&gt; 「匯入 KeePass 1 資料庫...」。
+此操作為單向遷移。您將無法用舊的 KeePassX 0.4 版本開啟匯入後的資料庫。</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
@@ -2813,15 +3741,15 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
- <translation type="unfinished"/>
+ <translation>無效的密碼 uuid 長度:%1 (長度=%2)</translation>
</message>
<message>
<source>Unable to parse UUID: %1</source>
- <translation type="unfinished"/>
+ <translation>無法分析 UUID:%1</translation>
</message>
<message>
<source>Failed to read database file.</source>
- <translation type="unfinished"/>
+ <translation>讀取資料庫檔案失敗。</translation>
</message>
</context>
<context>
@@ -2884,7 +3812,7 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
</message>
<message>
<source>History element in history entry</source>
- <translation>歷史記錄項目中的歷史元素</translation>
+ <translation>歷史項目中的歷史元素</translation>
</message>
<message>
<source>No entry uuid found</source>
@@ -2947,19 +3875,21 @@ This is a one-way migration. You won&apos;t be able to open the imported databas
<source>XML error:
%1
Line %2, column %3</source>
- <translation type="unfinished"/>
+ <translation>XML 錯誤:
+%1
+列 %2, 行 %3</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
- <source>Import KeePass1 database</source>
- <translation>匯入 KeePass 1 資料庫</translation>
- </message>
- <message>
<source>Unable to open the database.</source>
<translation>無法開啟資料庫。</translation>
</message>
+ <message>
+ <source>Import KeePass1 Database</source>
+ <translation>匯入 KeePass1 資料庫</translation>
+ </message>
</context>
<context>
<name>KeePass1Reader</name>
@@ -2982,7 +3912,7 @@ Line %2, column %3</source>
<message>
<source>Unable to read encryption IV</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
- <translation>無法讀取加密 IV</translation>
+ <translation>無法讀取加密用初始向量 (IV)</translation>
</message>
<message>
<source>Invalid number of groups</source>
@@ -3014,11 +3944,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Unable to calculate master key</source>
- <translation>無法計算主密碼</translation>
- </message>
- <message>
- <source>Wrong key or database file is corrupt.</source>
- <translation>金鑰不正確或是資料庫損壞。</translation>
+ <translation>無法計算主金鑰</translation>
</message>
<message>
<source>Key transformation failed</source>
@@ -3114,53 +4040,71 @@ Line %2, column %3</source>
</message>
<message>
<source>unable to seek to content position</source>
- <translation type="unfinished"/>
+ <translation>無法定位內容</translation>
+ </message>
+ <message>
+ <source>Invalid credentials were provided, please try again.
+If this reoccurs, then your database file may be corrupt.</source>
+ <translation>所提供的憑證無效,請再嘗試一遍。
+若此情形一再發生,代表您的資料庫檔案可能已損毀。</translation>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
- <source>Disabled share</source>
- <translation type="unfinished"/>
+ <source>Invalid sharing reference</source>
+ <translation>無效的分享引用</translation>
</message>
<message>
- <source>Import from</source>
- <translation type="unfinished"/>
+ <source>Inactive share %1</source>
+ <translation>未激活的分享 %1</translation>
</message>
<message>
- <source>Export to</source>
- <translation type="unfinished"/>
+ <source>Imported from %1</source>
+ <translation>從 %1 匯入</translation>
</message>
<message>
- <source>Synchronize with</source>
- <translation type="unfinished"/>
+ <source>Exported to %1</source>
+ <translation>匯出至 %1</translation>
</message>
<message>
- <source>Disabled share %1</source>
- <translation type="unfinished"/>
+ <source>Synchronized with %1</source>
+ <translation>與 %1 同步</translation>
</message>
<message>
- <source>Import from share %1</source>
- <translation type="unfinished"/>
+ <source>Import is disabled in settings</source>
+ <translation>匯入於設定停用</translation>
</message>
<message>
- <source>Export to share %1</source>
- <translation type="unfinished"/>
+ <source>Export is disabled in settings</source>
+ <translation>匯出於設定停用</translation>
</message>
<message>
- <source>Synchronize with share %1</source>
- <translation type="unfinished"/>
+ <source>Inactive share</source>
+ <translation>未激活的分享</translation>
+ </message>
+ <message>
+ <source>Imported from</source>
+ <translation>匯入從</translation>
+ </message>
+ <message>
+ <source>Exported to</source>
+ <translation>匯出至</translation>
+ </message>
+ <message>
+ <source>Synchronized with</source>
+ <translation>同步於</translation>
</message>
</context>
<context>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
- <translation type="unfinished"/>
+ <translation>金鑰組件</translation>
</message>
<message>
<source>Key Component Description</source>
- <translation type="unfinished"/>
+ <translation>金鑰組件描述</translation>
</message>
<message>
<source>Cancel</source>
@@ -3168,22 +4112,22 @@ Line %2, column %3</source>
</message>
<message>
<source>Key Component set, click to change or remove</source>
- <translation type="unfinished"/>
+ <translation>金鑰組件集,點擊以變更或移除</translation>
</message>
<message>
<source>Add %1</source>
<comment>Add a key component</comment>
- <translation type="unfinished"/>
+ <translation>加入 %1</translation>
</message>
<message>
<source>Change %1</source>
<comment>Change a key component</comment>
- <translation>更改%1</translation>
+ <translation>更改 %1</translation>
</message>
<message>
<source>Remove %1</source>
<comment>Remove a key component</comment>
- <translation>移除%1</translation>
+ <translation>移除 %1</translation>
</message>
<message>
<source>%1 set, click to change or remove</source>
@@ -3194,20 +4138,16 @@ Line %2, column %3</source>
<context>
<name>KeyFileEditWidget</name>
<message>
- <source>Browse</source>
- <translation>瀏覽</translation>
- </message>
- <message>
<source>Generate</source>
<translation>產生</translation>
</message>
<message>
<source>Key File</source>
- <translation type="unfinished"/>
+ <translation>金鑰檔案</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;您可以加入一份包含隨機字元的金鑰檔案以提升安全性。&lt;/p&gt;&lt;p&gt;您必須將其保密,切莫丟失,否則將會被鎖在外頭!&lt;/p&gt;</translation>
</message>
<message>
<source>Legacy key file format</source>
@@ -3225,7 +4165,8 @@ Please go to the master key settings and generate a new key file.</source>
<message>
<source>Error loading the key file '%1'
Message: %2</source>
- <translation type="unfinished"/>
+ <translation>載入金鑰檔案「%1」失敗
+訊息:%2</translation>
</message>
<message>
<source>Key files</source>
@@ -3237,20 +4178,58 @@ Message: %2</source>
</message>
<message>
<source>Create Key File...</source>
- <translation>建立金鑰檔案……</translation>
+ <translation>建立金鑰檔案...</translation>
</message>
<message>
<source>Error creating key file</source>
- <translation type="unfinished"/>
+ <translation>建立金鑰檔案錯誤</translation>
</message>
<message>
<source>Unable to create key file: %1</source>
- <translation type="unfinished"/>
+ <translation>無法建立金鑰檔案:%1</translation>
</message>
<message>
<source>Select a key file</source>
<translation>選擇金鑰檔案</translation>
</message>
+ <message>
+ <source>Key file selection</source>
+ <translation>金鑰檔案選擇</translation>
+ </message>
+ <message>
+ <source>Browse for key file</source>
+ <translation>瀏覧金鑰檔案</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>瀏覽...</translation>
+ </message>
+ <message>
+ <source>Generate a new key file</source>
+ <translation>產生新金鑰檔案</translation>
+ </message>
+ <message>
+ <source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
+ <translation>注意:請不要使用可更改的檔案,否則可能導致您無法解鎖資料庫!</translation>
+ </message>
+ <message>
+ <source>Invalid Key File</source>
+ <translation>無效的金鑰檔案</translation>
+ </message>
+ <message>
+ <source>You cannot use the current database as its own keyfile. Please choose a different file or generate a new key file.</source>
+ <translation>您不能使用目前的資料庫作為自己的金鑰檔案。請選擇一個不同檔案,或者產生一份新的金鑰檔案。</translation>
+ </message>
+ <message>
+ <source>Suspicious Key File</source>
+ <translation>可疑的金鑰檔案</translation>
+ </message>
+ <message>
+ <source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
+Are you sure you want to continue with this file?</source>
+ <translation>所選擇的金鑰檔案像是一份密碼資料庫檔案。金鑰檔案必須是一個永不變更的靜態檔案,否則您將永遠失去資料庫的存取權。
+真的要以此檔案繼續嗎?</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -3288,7 +4267,7 @@ Message: %2</source>
</message>
<message>
<source>&amp;Open database...</source>
- <translation>開啟資料庫…… (&amp;O)</translation>
+ <translation>開啟資料庫 (&amp;O)…</translation>
</message>
<message>
<source>&amp;Save database</source>
@@ -3312,7 +4291,7 @@ Message: %2</source>
</message>
<message>
<source>Sa&amp;ve database as...</source>
- <translation>將資料庫儲存為…… (&amp;V)</translation>
+ <translation>將資料庫儲存為 (&amp;V)…</translation>
</message>
<message>
<source>Database settings</source>
@@ -3339,10 +4318,6 @@ Message: %2</source>
<translation>設定 (&amp;S)</translation>
</message>
<message>
- <source>Password Generator</source>
- <translation>密碼產生器</translation>
- </message>
- <message>
<source>&amp;Lock databases</source>
<translation>鎖定資料庫 (&amp;L)</translation>
</message>
@@ -3360,7 +4335,7 @@ Message: %2</source>
</message>
<message>
<source>Copy URL to clipboard</source>
- <translation>將 URL 複製到剪貼簿</translation>
+ <translation>將網址複製到剪貼簿</translation>
</message>
<message>
<source>&amp;Notes</source>
@@ -3372,15 +4347,15 @@ Message: %2</source>
</message>
<message>
<source>&amp;Export to CSV file...</source>
- <translation>匯出到 CSV 檔案…… (&amp;E)</translation>
+ <translation>匯出到 CSV 檔案 (&amp;E)…</translation>
</message>
<message>
<source>Set up TOTP...</source>
- <translation>安裝 TOTP</translation>
+ <translation>設置 TOTP...</translation>
</message>
<message>
<source>Copy &amp;TOTP</source>
- <translation>複製 TOTP (&amp;T)</translation>
+ <translation>複製 &amp;TOTP</translation>
</message>
<message>
<source>E&amp;mpty recycle bin</source>
@@ -3388,7 +4363,7 @@ Message: %2</source>
</message>
<message>
<source>Clear history</source>
- <translation>清除歷史記錄</translation>
+ <translation>清除歷史</translation>
</message>
<message>
<source>Access error for config file %1</source>
@@ -3414,9 +4389,9 @@ Message: %2</source>
<source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source>
- <translation>警告: 你正在使用非穩定版本的 KeePassXC!
-具有高風險的破壞可能, 請備份你的資料庫.
-這個版本不是給一般使用者使用.</translation>
+ <translation>警告:你正在使用非穩定版本的 KeePassXC!
+具有高風險的破壞可能,請備份你的資料庫。
+這個版本不是給一般使用者使用。</translation>
</message>
<message>
<source>&amp;Donate</source>
@@ -3424,12 +4399,13 @@ This version is not meant for production use.</source>
</message>
<message>
<source>Report a &amp;bug</source>
- <translation>回報錯誤 (&amp;b)</translation>
+ <translation>回報錯誤 (&amp;B)</translation>
</message>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
- <translation type="unfinished"/>
+ <translation>警告:您的 Qt 版本可能會導致 KeePassXC 與螢幕鍵盤崩潰!
+建議您使用我們下載頁面上提供的 AppImage。</translation>
</message>
<message>
<source>&amp;Import</source>
@@ -3437,15 +4413,15 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Copy att&amp;ribute...</source>
- <translation>複製屬性 (&amp;r)…</translation>
+ <translation>複製屬性 (&amp;R)…</translation>
</message>
<message>
<source>TOTP...</source>
- <translation>基於時間的一次性密碼算法…</translation>
+ <translation>限時單次密碼 (TOTP)…</translation>
</message>
<message>
<source>&amp;New database...</source>
- <translation>新增資料庫(&amp;N)…</translation>
+ <translation>新增資料庫 (&amp;N)…</translation>
</message>
<message>
<source>Create a new database</source>
@@ -3453,7 +4429,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;Merge from database...</source>
- <translation>與資料庫合併(&amp;M)…</translation>
+ <translation>與資料庫合併 (&amp;M)…</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
@@ -3461,15 +4437,15 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;New entry</source>
- <translation>新增項目(&amp;N)</translation>
+ <translation>新增項目 (&amp;N)</translation>
</message>
<message>
<source>Add a new entry</source>
- <translation>添加新項目</translation>
+ <translation>加入新項目</translation>
</message>
<message>
<source>&amp;Edit entry</source>
- <translation>編輯項目(&amp;E)</translation>
+ <translation>編輯項目 (&amp;E)</translation>
</message>
<message>
<source>View or edit entry</source>
@@ -3481,19 +4457,19 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Add a new group</source>
- <translation>添加新群組</translation>
+ <translation>加入新群組</translation>
</message>
<message>
<source>Change master &amp;key...</source>
- <translation>更改主密碼(&amp;k)…</translation>
+ <translation>更改主密碼 (&amp;K)…</translation>
</message>
<message>
<source>&amp;Database settings...</source>
- <translation>資料庫設定(&amp;D)…</translation>
+ <translation>資料庫設定 (&amp;D)…</translation>
</message>
<message>
<source>Copy &amp;password</source>
- <translation>複製密碼(&amp;p)</translation>
+ <translation>複製密碼 (&amp;P)</translation>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
@@ -3501,23 +4477,23 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Open &amp;URL</source>
- <translation>開啟網址(&amp;U)</translation>
+ <translation>開啟網址 (&amp;U)</translation>
</message>
<message>
<source>KeePass 1 database...</source>
- <translation type="unfinished"/>
+ <translation>KeePass 1 資料庫...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
- <translation type="unfinished"/>
+ <translation>匯入 KeePass 1 資料庫</translation>
</message>
<message>
<source>CSV file...</source>
- <translation type="unfinished"/>
+ <translation>CSV 檔案...</translation>
</message>
<message>
<source>Import a CSV file</source>
- <translation type="unfinished"/>
+ <translation>匯入 CSV 檔案</translation>
</message>
<message>
<source>Show TOTP...</source>
@@ -3525,114 +4501,183 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Show TOTP QR Code...</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Check for Updates...</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Share entry</source>
- <translation type="unfinished"/>
+ <translation>顯示 TOTP QR 碼...</translation>
</message>
<message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
- <translation type="unfinished"/>
+ <translation>注意:您正在使用 KeePassXC 的預先發行版本!
+此版本並不適合生產用途,可能會出現一些程式錯誤和小問題。</translation>
</message>
<message>
<source>Check for updates on startup?</source>
- <translation type="unfinished"/>
+ <translation>是否在啟動時檢查更新?</translation>
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
- <translation type="unfinished"/>
+ <translation>你希望在 KeePassXC 啟動時檢查更新嗎?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
- <translation type="unfinished"/>
+ <translation>你可以隨時在應用程式選單中手動檢查更新。</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>匯出 (&amp;E)</translation>
+ </message>
+ <message>
+ <source>&amp;Check for Updates...</source>
+ <translation>檢查更新 (&amp;C)...</translation>
+ </message>
+ <message>
+ <source>Downlo&amp;ad all favicons</source>
+ <translation>下載所有收藏夾圖示 (&amp;A)</translation>
+ </message>
+ <message>
+ <source>Sort &amp;A-Z</source>
+ <translation>排序從 &amp;A 到 Z</translation>
+ </message>
+ <message>
+ <source>Sort &amp;Z-A</source>
+ <translation>排序從 &amp;Z 到 A</translation>
+ </message>
+ <message>
+ <source>&amp;Password Generator</source>
+ <translation>密碼產生器 (&amp;P)</translation>
+ </message>
+ <message>
+ <source>Download favicon</source>
+ <translation>下載收藏夾圖示</translation>
+ </message>
+ <message>
+ <source>&amp;Export to HTML file...</source>
+ <translation>匯出至 HTML 檔案 (&amp;E)...</translation>
+ </message>
+ <message>
+ <source>1Password Vault...</source>
+ <translation>1Password 保險庫...</translation>
+ </message>
+ <message>
+ <source>Import a 1Password Vault</source>
+ <translation>匯入 1Password 保險庫</translation>
+ </message>
+ <message>
+ <source>&amp;Getting Started</source>
+ <translation>開始使用 (&amp;G)</translation>
+ </message>
+ <message>
+ <source>Open Getting Started Guide PDF</source>
+ <translation>開啟「開始使用」指南 PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Online Help...</source>
+ <translation>線上幫助 (&amp;O)...</translation>
+ </message>
+ <message>
+ <source>Go to online documentation (opens browser)</source>
+ <translation>前往線上文件(開啟瀏覧器)</translation>
+ </message>
+ <message>
+ <source>&amp;User Guide</source>
+ <translation>使用者指南 (&amp;U)</translation>
+ </message>
+ <message>
+ <source>Open User Guide PDF</source>
+ <translation>開啟使用者指南 PDF</translation>
+ </message>
+ <message>
+ <source>&amp;Keyboard Shortcuts</source>
+ <translation>鍵盤快捷鍵 (&amp;K)</translation>
</message>
</context>
<context>
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>建立缺少的 %1 [%2]</translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>重新定位 %1 [%2]</translation>
</message>
<message>
<source>Overwriting %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>覆寫 %1 [%2]</translation>
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
- <translation type="unfinished"/>
+ <translation>舊項目從資料庫「%1」合併</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>為較舊的目標 %1 [%2] 添加備份</translation>
</message>
<message>
<source>Adding backup for older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>為較舊的來源 %1 [%2] 添加備份</translation>
</message>
<message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>在較新的來源 %1 [%2] 之上重新應用較舊的目標項目</translation>
</message>
<message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>在較新的目標 %1 [%2] 之上重新應用較舊的來源項目</translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>從較新的來源 %1 [%2] 同步</translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>從較舊的來源 %1 [%2] 同步</translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>刪除子項 %1 [%2]</translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
- <translation type="unfinished"/>
+ <translation>刪除孤立項 %1 [%2]</translation>
</message>
<message>
<source>Changed deleted objects</source>
- <translation type="unfinished"/>
+ <translation>更改已刪除的對象</translation>
</message>
<message>
<source>Adding missing icon %1</source>
- <translation type="unfinished"/>
+ <translation>添加缺失的圖示 %1</translation>
+ </message>
+ <message>
+ <source>Removed custom data %1 [%2]</source>
+ <translation>移除自訂資料 %1 [%2]</translation>
+ </message>
+ <message>
+ <source>Adding custom data %1 [%2]</source>
+ <translation>添加自訂資料 %1 [%2]</translation>
</message>
</context>
<context>
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
- <translation type="unfinished"/>
+ <translation>建立新 KeePassXC 資料庫...</translation>
</message>
<message>
<source>Root</source>
<comment>Root group</comment>
- <translation>根</translation>
+ <translation>根群組</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPage</name>
<message>
<source>WizardPage</source>
- <translation type="unfinished"/>
+ <translation>嚮導頁</translation>
</message>
<message>
<source>En&amp;cryption Settings</source>
- <translation>加密設定 (&amp;c)</translation>
+ <translation>加密設定 (&amp;C)</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
@@ -3640,18 +4685,18 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Advanced Settings</source>
- <translation type="unfinished"/>
+ <translation>進階設定</translation>
</message>
<message>
<source>Simple Settings</source>
- <translation type="unfinished"/>
+ <translation>簡單設定</translation>
</message>
</context>
<context>
<name>NewDatabaseWizardPageEncryption</name>
<message>
<source>Encryption Settings</source>
- <translation type="unfinished"/>
+ <translation>加密設定</translation>
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
@@ -3673,11 +4718,78 @@ Expect some bugs and minor issues, this version is not meant for production use.
<name>NewDatabaseWizardPageMetaData</name>
<message>
<source>General Database Information</source>
- <translation type="unfinished"/>
+ <translation>一般資料庫資訊</translation>
</message>
<message>
<source>Please fill in the display name and an optional description for your new database:</source>
- <translation type="unfinished"/>
+ <translation>請為你的新資料庫填寫一個顯示名稱,及一個選擇性的說明:</translation>
+ </message>
+</context>
+<context>
+ <name>OpData01</name>
+ <message>
+ <source>Invalid OpData01, does not contain header</source>
+ <translation>無效的 OpData01,未包含標頭</translation>
+ </message>
+ <message>
+ <source>Unable to read all IV bytes, wanted 16 but got %1</source>
+ <translation>無法讀取初始向量 (IV) 的所有位元組,預期為 16 但得到了 %1</translation>
+ </message>
+ <message>
+ <source>Unable to init cipher for opdata01: %1</source>
+ <translation>無法初始化 opdata01 的加密:%1</translation>
+ </message>
+ <message>
+ <source>Unable to read all HMAC signature bytes</source>
+ <translation>無法讀取所有 HMAC 簽名位元組</translation>
+ </message>
+ <message>
+ <source>Malformed OpData01 due to a failed HMAC</source>
+ <translation>異常的 OpData01,因為 HMAC 運行失敗</translation>
+ </message>
+ <message>
+ <source>Unable to process clearText in place</source>
+ <translation>無法在場處理純文本</translation>
+ </message>
+ <message>
+ <source>Expected %1 bytes of clear-text, found %2</source>
+ <translation>預期 %1 位元組的純文本,實際為 %2</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultOpenWidget</name>
+ <message>
+ <source>Read Database did not produce an instance
+%1</source>
+ <translation>讀取資料庫並未產生實體
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>OpVaultReader</name>
+ <message>
+ <source>Directory .opvault must exist</source>
+ <translation>目錄 .opvault 必須存在</translation>
+ </message>
+ <message>
+ <source>Directory .opvault must be readable</source>
+ <translation>目錄 .opvault 必須為可讀取</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must exist</source>
+ <translation>目錄 .opvault/default 必須存在</translation>
+ </message>
+ <message>
+ <source>Directory .opvault/default must be readable</source>
+ <translation>目錄 .opvault/default 必須為可讀取</translation>
+ </message>
+ <message>
+ <source>Unable to decode masterKey: %1</source>
+ <translation>無法解碼主金鑰:%1</translation>
+ </message>
+ <message>
+ <source>Unable to derive master key: %1</source>
+ <translation>無法推導主金鑰:%1</translation>
</message>
</context>
<context>
@@ -3696,11 +4808,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Key file way too small.</source>
- <translation>金鑰檔太小。</translation>
+ <translation>金鑰檔案太小。</translation>
</message>
<message>
<source>Key file magic header id invalid</source>
- <translation>金鑰檔魔術標頭 id 無效</translation>
+ <translation>金鑰檔案的魔術標頭 ID 無效</translation>
</message>
<message>
<source>Found zero keys</source>
@@ -3712,7 +4824,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Corrupted key file, reading private key failed</source>
- <translation>金鑰檔損壞,讀取私密金鑰失敗</translation>
+ <translation>金鑰檔案損壞,讀取私密金鑰失敗</translation>
</message>
<message>
<source>No private key payload to decrypt</source>
@@ -3720,7 +4832,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Trying to run KDF without cipher</source>
- <translation>嘗試運行無加密的 KDF</translation>
+ <translation>嘗試運行無密碼的 KDF</translation>
</message>
<message>
<source>Passphrase is required to decrypt this key</source>
@@ -3728,7 +4840,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Key derivation failed, key file corrupted?</source>
- <translation>金鑰衍生失敗,金鑰檔已損壞?</translation>
+ <translation>金鑰推導失敗,金鑰檔已損壞?</translation>
</message>
<message>
<source>Decryption failed, wrong passphrase?</source>
@@ -3760,23 +4872,34 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Unsupported key type: %1</source>
- <translation type="unfinished"/>
+ <translation>不支援的金鑰類型:%1</translation>
</message>
<message>
<source>Unknown cipher: %1</source>
- <translation type="unfinished"/>
+ <translation>未知的密語:%1</translation>
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
- <translation type="unfinished"/>
+ <translation>加密的初始向量 (IV) 對 MD5 kdf 來說太短了</translation>
</message>
<message>
<source>Unknown KDF: %1</source>
- <translation type="unfinished"/>
+ <translation>未知的金鑰推導函式 (KDF):%1</translation>
</message>
<message>
<source>Unknown key type: %1</source>
- <translation type="unfinished"/>
+ <translation>未知的金鑰類型:%1</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordEdit</name>
+ <message>
+ <source>Passwords do not match</source>
+ <translation>不符合的密碼</translation>
+ </message>
+ <message>
+ <source>Passwords match so far</source>
+ <translation>目前符合的密碼</translation>
</message>
</context>
<context>
@@ -3787,7 +4910,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Confirm password:</source>
- <translation type="unfinished"/>
+ <translation>確認密碼:</translation>
</message>
<message>
<source>Password</source>
@@ -3795,15 +4918,31 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;密碼是保全您的資料庫的主要方式。&lt;/p&gt;&lt;p&gt;好的密碼要夠長且獨特。KeePassXC 可以幫您產生一組。&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
- <translation type="unfinished"/>
+ <translation>密碼不相符。</translation>
</message>
<message>
<source>Generate master password</source>
- <translation type="unfinished"/>
+ <translation>產生主密碼</translation>
+ </message>
+ <message>
+ <source>Password field</source>
+ <translation>密碼欄位</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>切換密碼可見性</translation>
+ </message>
+ <message>
+ <source>Repeat password field</source>
+ <translation>重複密碼欄位</translation>
+ </message>
+ <message>
+ <source>Toggle password generator</source>
+ <translation>切換密碼產生器</translation>
</message>
</context>
<context>
@@ -3823,7 +4962,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>entropy</source>
- <translation>entropy</translation>
+ <translation>熵值</translation>
</message>
<message>
<source>Password</source>
@@ -3834,22 +4973,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>字元類型</translation>
</message>
<message>
- <source>Upper Case Letters</source>
- <translation>大寫英文字母</translation>
- </message>
- <message>
- <source>Lower Case Letters</source>
- <translation>小寫英文字母</translation>
- </message>
- <message>
<source>Numbers</source>
<translation>數字</translation>
</message>
<message>
- <source>Special Characters</source>
- <translation>特殊字元</translation>
- </message>
- <message>
<source>Extended ASCII</source>
<translation>擴展 ASCII 碼</translation>
</message>
@@ -3867,7 +4994,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Passphrase</source>
- <translation>密語</translation>
+ <translation>密碼短語</translation>
</message>
<message>
<source>Wordlist:</source>
@@ -3891,11 +5018,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Entropy: %1 bit</source>
- <translation>Entropy: %1 bit</translation>
+ <translation>資訊熵:%1 位元</translation>
</message>
<message>
<source>Password Quality: %1</source>
- <translation>密碼素質:%1</translation>
+ <translation>密碼品質:%1</translation>
</message>
<message>
<source>Poor</source>
@@ -3919,29 +5046,21 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>ExtendedASCII</source>
- <translation type="unfinished"/>
+ <translation>延伸 ASCII</translation>
</message>
<message>
<source>Switch to advanced mode</source>
- <translation type="unfinished"/>
+ <translation>切換至進階模式</translation>
</message>
<message>
<source>Advanced</source>
<translation>進階</translation>
</message>
<message>
- <source>Upper Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>A-Z</source>
<translation>A-Z</translation>
</message>
<message>
- <source>Lower Case Letters A to F</source>
- <translation type="unfinished"/>
- </message>
- <message>
<source>a-z</source>
<translation>a-z</translation>
</message>
@@ -3951,108 +5070,165 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Braces</source>
- <translation type="unfinished"/>
+ <translation>括號</translation>
</message>
<message>
<source>{[(</source>
- <translation type="unfinished"/>
+ <translation>{[(</translation>
</message>
<message>
<source>Punctuation</source>
- <translation type="unfinished"/>
+ <translation>標點</translation>
</message>
<message>
<source>.,:;</source>
- <translation type="unfinished"/>
+ <translation>.,:;</translation>
</message>
<message>
<source>Quotes</source>
- <translation type="unfinished"/>
+ <translation>引號</translation>
</message>
<message>
<source>&quot; &apos;</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Math</source>
- <translation type="unfinished"/>
+ <translation>&quot; &apos;</translation>
</message>
<message>
<source>&lt;*+!?=</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Dashes</source>
- <translation type="unfinished"/>
+ <translation>&lt;*+!?=</translation>
</message>
<message>
<source>\_|-/</source>
- <translation type="unfinished"/>
+ <translation>\_|-/</translation>
</message>
<message>
<source>Logograms</source>
- <translation type="unfinished"/>
+ <translation>語標符號</translation>
</message>
<message>
<source>#$%&amp;&amp;@^`~</source>
- <translation type="unfinished"/>
+ <translation>#$%&amp;&amp;@^`~</translation>
</message>
<message>
<source>Switch to simple mode</source>
- <translation type="unfinished"/>
+ <translation>切換至簡單模式</translation>
</message>
<message>
<source>Simple</source>
- <translation type="unfinished"/>
+ <translation>簡單</translation>
</message>
<message>
<source>Character set to exclude from generated password</source>
- <translation type="unfinished"/>
+ <translation>產生密碼時排除的字元集合</translation>
</message>
<message>
<source>Do not include:</source>
- <translation type="unfinished"/>
+ <translation>不要包括:</translation>
</message>
<message>
<source>Add non-hex letters to &quot;do not include&quot; list</source>
- <translation type="unfinished"/>
+ <translation>將非十六進制字母加入「不要包括」清單</translation>
</message>
<message>
<source>Hex</source>
- <translation type="unfinished"/>
+ <translation>十六進制</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</source>
- <translation type="unfinished"/>
+ <translation>排除以下字元:&quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;﹒&quot;</translation>
</message>
<message>
<source>Word Co&amp;unt:</source>
- <translation type="unfinished"/>
+ <translation>字數統計 (&amp;U):</translation>
</message>
<message>
<source>Regenerate</source>
- <translation type="unfinished"/>
+ <translation>重新產生</translation>
+ </message>
+ <message>
+ <source>Generated password</source>
+ <translation>已產生密碼</translation>
+ </message>
+ <message>
+ <source>Upper-case letters</source>
+ <translation>大寫字母</translation>
+ </message>
+ <message>
+ <source>Lower-case letters</source>
+ <translation>小寫字母</translation>
+ </message>
+ <message>
+ <source>Special characters</source>
+ <translation>特殊字母</translation>
+ </message>
+ <message>
+ <source>Math Symbols</source>
+ <translation>數學符號</translation>
+ </message>
+ <message>
+ <source>Dashes and Slashes</source>
+ <translation>破折號與斜線號</translation>
+ </message>
+ <message>
+ <source>Excluded characters</source>
+ <translation>排除字元</translation>
+ </message>
+ <message>
+ <source>Hex Passwords</source>
+ <translation>十六進制密碼</translation>
+ </message>
+ <message>
+ <source>Password length</source>
+ <translation>密碼長度</translation>
+ </message>
+ <message>
+ <source>Word Case:</source>
+ <translation>字母大小寫:</translation>
+ </message>
+ <message>
+ <source>Regenerate password</source>
+ <translation>重新產生密碼</translation>
+ </message>
+ <message>
+ <source>Copy password</source>
+ <translation>複製密碼</translation>
+ </message>
+ <message>
+ <source>Accept password</source>
+ <translation>接受密碼</translation>
+ </message>
+ <message>
+ <source>lower case</source>
+ <translation>全部小寫</translation>
+ </message>
+ <message>
+ <source>UPPER CASE</source>
+ <translation>全部大寫</translation>
+ </message>
+ <message>
+ <source>Title Case</source>
+ <translation>首字母大寫</translation>
+ </message>
+ <message>
+ <source>Toggle password visibility</source>
+ <translation>切換密碼可見性</translation>
</message>
</context>
<context>
<name>QApplication</name>
<message>
<source>KeeShare</source>
- <translation type="unfinished"/>
+ <translation>KeeShare</translation>
</message>
-</context>
-<context>
- <name>QFileDialog</name>
<message>
- <source>Select</source>
- <translation type="unfinished"/>
+ <source>Statistics</source>
+ <translation>統計</translation>
</message>
</context>
<context>
<name>QMessageBox</name>
<message>
<source>Overwrite</source>
- <translation type="unfinished"/>
+ <translation>覆寫</translation>
</message>
<message>
<source>Delete</source>
@@ -4060,11 +5236,11 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Move</source>
- <translation type="unfinished"/>
+ <translation>移動</translation>
</message>
<message>
<source>Empty</source>
- <translation type="unfinished"/>
+ <translation>清空</translation>
</message>
<message>
<source>Remove</source>
@@ -4072,15 +5248,19 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Skip</source>
- <translation type="unfinished"/>
+ <translation>跳過</translation>
</message>
<message>
<source>Disable</source>
- <translation>關閉</translation>
+ <translation>停用</translation>
</message>
<message>
<source>Merge</source>
- <translation type="unfinished"/>
+ <translation>合併</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>繼續</translation>
</message>
</context>
<context>
@@ -4123,7 +5303,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>No URL provided</source>
- <translation>未提供 URL</translation>
+ <translation>未提供網址</translation>
</message>
<message>
<source>No logins found</source>
@@ -4135,7 +5315,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Add a new entry to a database.</source>
- <translation>新增項目到資料庫</translation>
+ <translation>加入項目到資料庫。</translation>
</message>
<message>
<source>Path of the database.</source>
@@ -4159,7 +5339,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>URL for the entry.</source>
- <translation>此項目的網址</translation>
+ <translation>此項目的網址。</translation>
</message>
<message>
<source>URL</source>
@@ -4174,16 +5354,12 @@ Expect some bugs and minor issues, this version is not meant for production use.
<translation>產生此項目的密碼。</translation>
</message>
<message>
- <source>Length for the generated password.</source>
- <translation>欲產生的密碼長度。</translation>
- </message>
- <message>
<source>length</source>
<translation>長度</translation>
</message>
<message>
<source>Path of the entry to add.</source>
- <translation>欲新增的項目路徑</translation>
+ <translation>欲加入的項目路徑。</translation>
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
@@ -4220,25 +5396,13 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Password for which to estimate the entropy.</source>
- <translation>用於估計 entropy 的密碼。</translation>
+ <translation>用於估計資訊熵的密碼。</translation>
</message>
<message>
<source>Perform advanced analysis on the password.</source>
<translation>對密碼執行高級分析。</translation>
</message>
<message>
- <source>Extract and print the content of a database.</source>
- <translation>提取與列印資料庫內容。</translation>
- </message>
- <message>
- <source>Path of the database to extract.</source>
- <translation>要提取的資料庫路徑。</translation>
- </message>
- <message>
- <source>Insert password to unlock %1: </source>
- <translation>插入密碼以解除鎖定 %1: </translation>
- </message>
- <message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
@@ -4282,16 +5446,12 @@ Available commands:
<translation>合併兩個資料庫。</translation>
</message>
<message>
- <source>Path of the database to merge into.</source>
- <translation>合併時的目標資料庫路徑。</translation>
- </message>
- <message>
<source>Path of the database to merge from.</source>
<translation>合併時的來源資料庫路徑。</translation>
</message>
<message>
<source>Use the same credentials for both database files.</source>
- <translation>對兩個資料庫檔案使用相同的認證。</translation>
+ <translation>對兩個資料庫檔案使用相同的憑證。</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
@@ -4362,10 +5522,6 @@ Available commands:
<translation>瀏覽器整合</translation>
</message>
<message>
- <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
- <translation>YubiKey[%1] 挑戰回應 - 插槽 %2 - %3</translation>
- </message>
- <message>
<source>Press</source>
<translation>按</translation>
</message>
@@ -4379,320 +5535,292 @@ Available commands:
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
- <translation type="unfinished"/>
+ <translation>產生一組全新隨機的 Diceware 密碼短語。</translation>
</message>
<message>
<source>Word count for the diceware passphrase.</source>
- <translation type="unfinished"/>
+ <translation>Diceware 密碼短語字數統計。</translation>
</message>
<message>
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
- <translation type="unfinished"/>
+ <translation>Diceware 產生器使用的字詞表。
+[預設:EFF English]</translation>
</message>
<message>
<source>Generate a new random password.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Invalid value for password length %1.</source>
- <translation type="unfinished"/>
+ <translation>產生新的隨機密碼。</translation>
</message>
<message>
<source>Could not create entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>無法建立路徑為 %1 的項目。</translation>
</message>
<message>
<source>Enter password for new entry: </source>
- <translation type="unfinished"/>
+ <translation>為新項目輸入密碼: </translation>
</message>
<message>
<source>Writing the database failed %1.</source>
- <translation type="unfinished"/>
+ <translation>寫入資料庫失敗 %1。</translation>
</message>
<message>
<source>Successfully added entry %1.</source>
- <translation type="unfinished"/>
+ <translation>成功加入項目 %1。</translation>
</message>
<message>
<source>Copy the current TOTP to the clipboard.</source>
- <translation type="unfinished"/>
+ <translation>複製目前 TOTP 至剪貼簿。</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
- <translation type="unfinished"/>
+ <translation>無效的超時值 %1。</translation>
</message>
<message>
<source>Entry %1 not found.</source>
- <translation type="unfinished"/>
+ <translation>項目 %1 未找到。</translation>
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
- <translation type="unfinished"/>
+ <translation>路徑為 %1 的項目未設定 TOTP。</translation>
</message>
<message>
<source>Entry&apos;s current TOTP copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>已複製項目目前的 TOTP 到剪貼簿!</translation>
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
- <translation type="unfinished"/>
+ <translation>已複製項目密碼到剪貼簿!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>將於 %1 秒後清空剪貼簿...</numerusform></translation>
</message>
<message>
<source>Clipboard cleared!</source>
- <translation type="unfinished"/>
+ <translation>剪貼簿已清空!</translation>
</message>
<message>
<source>Silence password prompt and other secondary outputs.</source>
- <translation type="unfinished"/>
+ <translation>關閉密碼提示與其他輔助輸出。</translation>
</message>
<message>
<source>count</source>
<comment>CLI parameter</comment>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Invalid value for password length: %1</source>
- <translation type="unfinished"/>
+ <translation>計數</translation>
</message>
<message>
<source>Could not find entry with path %1.</source>
- <translation type="unfinished"/>
+ <translation>未找到路徑為 %1 的項目。</translation>
</message>
<message>
<source>Not changing any field for entry %1.</source>
- <translation type="unfinished"/>
+ <translation>未更改項目 %1 的任何欄位。</translation>
</message>
<message>
<source>Enter new password for entry: </source>
- <translation type="unfinished"/>
+ <translation>為項目輸入新密碼: </translation>
</message>
<message>
<source>Writing the database failed: %1</source>
- <translation type="unfinished"/>
+ <translation>寫入資料庫失敗:%1</translation>
</message>
<message>
<source>Successfully edited entry %1.</source>
- <translation type="unfinished"/>
+ <translation>成功編輯項目 %1。</translation>
</message>
<message>
<source>Length %1</source>
- <translation type="unfinished"/>
+ <translation>長度 %1</translation>
</message>
<message>
<source>Entropy %1</source>
- <translation type="unfinished"/>
+ <translation>熵值 %1</translation>
</message>
<message>
<source>Log10 %1</source>
- <translation type="unfinished"/>
+ <translation>Log10 %1</translation>
</message>
<message>
<source>Multi-word extra bits %1</source>
- <translation type="unfinished"/>
+ <translation>多字詞額外字元 %1</translation>
</message>
<message>
<source>Type: Bruteforce</source>
- <translation type="unfinished"/>
+ <translation>類型:暴力破解</translation>
</message>
<message>
<source>Type: Dictionary</source>
- <translation type="unfinished"/>
+ <translation>類型:字典</translation>
</message>
<message>
<source>Type: Dict+Leet</source>
- <translation type="unfinished"/>
+ <translation>類型:字典+名單</translation>
</message>
<message>
<source>Type: User Words</source>
- <translation type="unfinished"/>
+ <translation>類型:使用者字詞</translation>
</message>
<message>
<source>Type: User+Leet</source>
- <translation type="unfinished"/>
+ <translation>類型:使用者+名單</translation>
</message>
<message>
<source>Type: Repeated</source>
- <translation type="unfinished"/>
+ <translation>類型:重複</translation>
</message>
<message>
<source>Type: Sequence</source>
- <translation type="unfinished"/>
+ <translation>類型:序列</translation>
</message>
<message>
<source>Type: Spatial</source>
- <translation type="unfinished"/>
+ <translation>類型:空間</translation>
</message>
<message>
<source>Type: Date</source>
- <translation type="unfinished"/>
+ <translation>類型:日期</translation>
</message>
<message>
<source>Type: Bruteforce(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:暴力破解(重複)</translation>
</message>
<message>
<source>Type: Dictionary(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:字典(重複)</translation>
</message>
<message>
<source>Type: Dict+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:字典+名單(重複)</translation>
</message>
<message>
<source>Type: User Words(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:使用者字詞(重複)</translation>
</message>
<message>
<source>Type: User+Leet(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:使用者+名單(重複)</translation>
</message>
<message>
<source>Type: Repeated(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:重複(重複)</translation>
</message>
<message>
<source>Type: Sequence(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:序列(重複)</translation>
</message>
<message>
<source>Type: Spatial(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:空間(重複)</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
- <translation type="unfinished"/>
+ <translation>類型:日期(重複)</translation>
</message>
<message>
<source>Type: Unknown%1</source>
- <translation type="unfinished"/>
+ <translation>類型:未知%1</translation>
</message>
<message>
<source>Entropy %1 (%2)</source>
- <translation type="unfinished"/>
+ <translation>熵值 %1 (%2)</translation>
</message>
<message>
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
- <translation type="unfinished"/>
+ <translation>*** 密碼長度 (%1) != 部位長度總和 (%2) ***</translation>
</message>
<message>
<source>Failed to load key file %1: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>File %1 does not exist.</source>
- <translation>檔案 %1 不存在。</translation>
- </message>
- <message>
- <source>Unable to open file %1.</source>
- <translation>無法開啟檔案 %1。</translation>
- </message>
- <message>
- <source>Error while reading the database:
-%1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Error while parsing the database:
-%1</source>
- <translation type="unfinished"/>
+ <translation>載入金鑰檔案 %1 失敗:%2</translation>
</message>
<message>
<source>Length of the generated password</source>
- <translation type="unfinished"/>
+ <translation>產生密碼長度</translation>
</message>
<message>
<source>Use lowercase characters</source>
- <translation type="unfinished"/>
+ <translation>使用小寫字母</translation>
</message>
<message>
<source>Use uppercase characters</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Use numbers.</source>
- <translation type="unfinished"/>
+ <translation>使用大寫字母</translation>
</message>
<message>
<source>Use special characters</source>
- <translation type="unfinished"/>
+ <translation>使用特殊字元</translation>
</message>
<message>
<source>Use extended ASCII</source>
- <translation type="unfinished"/>
+ <translation>使用延伸 ASCII</translation>
</message>
<message>
<source>Exclude character set</source>
- <translation type="unfinished"/>
+ <translation>排除的字元集合</translation>
</message>
<message>
<source>chars</source>
- <translation type="unfinished"/>
+ <translation>字元</translation>
</message>
<message>
<source>Exclude similar looking characters</source>
- <translation type="unfinished"/>
+ <translation>排除相似字元</translation>
</message>
<message>
<source>Include characters from every selected group</source>
- <translation type="unfinished"/>
+ <translation>包含每個選定組中的字元</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
- <translation type="unfinished"/>
+ <translation>遞迴列出組內元素。</translation>
</message>
<message>
<source>Cannot find group %1.</source>
- <translation type="unfinished"/>
+ <translation>未找到群組 %1。</translation>
</message>
<message>
<source>Error reading merge file:
%1</source>
- <translation type="unfinished"/>
+ <translation>讀取合併檔案錯誤:
+%1</translation>
</message>
<message>
<source>Unable to save database to file : %1</source>
- <translation type="unfinished"/>
+ <translation>無法儲存資料庫至檔案:%1</translation>
</message>
<message>
<source>Unable to save database to file: %1</source>
- <translation type="unfinished"/>
+ <translation>無法儲存資料庫至檔案:%1</translation>
</message>
<message>
<source>Successfully recycled entry %1.</source>
- <translation type="unfinished"/>
+ <translation>成功回收項目 %1。</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
- <translation type="unfinished"/>
+ <translation>成功刪除項目 %1。</translation>
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
- <translation type="unfinished"/>
+ <translation>顯示項目目前的 TOTP。</translation>
</message>
<message>
<source>ERROR: unknown attribute %1.</source>
- <translation type="unfinished"/>
+ <translation>錯誤:未知的屬性 %1。</translation>
</message>
<message>
<source>No program defined for clipboard manipulation</source>
- <translation type="unfinished"/>
+ <translation>沒有為剪貼簿操作定義程式</translation>
</message>
<message>
<source>Unable to start program %1</source>
- <translation type="unfinished"/>
+ <translation>無法開啟程式 %1</translation>
</message>
<message>
<source>file empty</source>
- <translation type="unfinished"/>
+ <translation>檔案為空</translation>
</message>
<message>
<source>%1: (row, col) %2,%3</source>
- <translation type="unfinished"/>
+ <translation>%1: (列, 行) %2,%3</translation>
</message>
<message>
<source>AES: 256-bit</source>
@@ -4721,60 +5849,52 @@ Available commands:
<message>
<source>Invalid Settings</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>無效的設定</translation>
</message>
<message>
<source>Invalid Key</source>
<comment>TOTP</comment>
- <translation type="unfinished"/>
+ <translation>無效的金鑰</translation>
</message>
<message>
<source>Message encryption failed.</source>
- <translation type="unfinished"/>
+ <translation>訊息加密失敗。</translation>
</message>
<message>
<source>No groups found</source>
- <translation type="unfinished"/>
+ <translation>未找到群組</translation>
</message>
<message>
<source>Create a new database.</source>
- <translation type="unfinished"/>
+ <translation>建立新群組。</translation>
</message>
<message>
<source>File %1 already exists.</source>
- <translation type="unfinished"/>
+ <translation>檔案 %1 已存在。</translation>
</message>
<message>
<source>Loading the key file failed</source>
- <translation type="unfinished"/>
+ <translation>載入金鑰檔案失敗</translation>
</message>
<message>
<source>No key is set. Aborting database creation.</source>
- <translation type="unfinished"/>
+ <translation>未設置金鑰。中止資料庫建立。</translation>
</message>
<message>
<source>Failed to save the database: %1.</source>
- <translation type="unfinished"/>
+ <translation>儲存資料庫失敗:%1。</translation>
</message>
<message>
<source>Successfully created new database.</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Insert password to encrypt database (Press enter to leave blank): </source>
- <translation type="unfinished"/>
+ <translation>成功建立新資料庫。</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
+ <translation>建立金鑰檔案 %1 失敗:%2</translation>
</message>
<message>
<source>Loading KeyFile %1 failed: %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Remove an entry from the database.</source>
- <translation>從資料庫中移除項目。</translation>
+ <translation>載入金鑰檔案 %1 失敗:%2</translation>
</message>
<message>
<source>Path of the entry to remove.</source>
@@ -4782,7 +5902,7 @@ Available commands:
</message>
<message>
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
- <translation>現有的單實例鎖定檔無效。正在啟動新實例。</translation>
+ <translation>現有的單實例鎖定檔案無效。正在啟動新實例。</translation>
</message>
<message>
<source>The lock file could not be created. Single-instance mode disabled.</source>
@@ -4798,7 +5918,7 @@ Available commands:
</message>
<message>
<source>path to a custom config file</source>
- <translation>自訂設定檔路徑</translation>
+ <translation>自訂設定檔案的路徑</translation>
</message>
<message>
<source>key file of the database</source>
@@ -4806,7 +5926,7 @@ Available commands:
</message>
<message>
<source>read password of the database from stdin</source>
- <translation>從 stdin 讀取資料庫密碼</translation>
+ <translation>從標準輸入 (stdin) 讀取資料庫密碼</translation>
</message>
<message>
<source>Parent window handle</source>
@@ -4818,7 +5938,7 @@ Available commands:
</message>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
- <translation>測試加密函數時發生重大錯誤。</translation>
+ <translation>測試加密函式時發生重大錯誤。</translation>
</message>
<message>
<source>KeePassXC - Error</source>
@@ -4826,11 +5946,335 @@ Available commands:
</message>
<message>
<source>Database password: </source>
- <translation type="unfinished"/>
+ <translation>資料庫密碼: </translation>
</message>
<message>
<source>Cannot create new group</source>
- <translation type="unfinished"/>
+ <translation>無法建立新群組</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database.</source>
+ <translation>停用資料庫的密碼金鑰。</translation>
+ </message>
+ <message>
+ <source>Displays debugging information.</source>
+ <translation>顯示除錯資訊。</translation>
+ </message>
+ <message>
+ <source>Deactivate password key for the database to merge from.</source>
+ <translation>停用合併資料庫的密碼金鑰。</translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation>版本 %1</translation>
+ </message>
+ <message>
+ <source>Build Type: %1</source>
+ <translation>建置類型:%1</translation>
+ </message>
+ <message>
+ <source>Revision: %1</source>
+ <translation>修訂版號:%1</translation>
+ </message>
+ <message>
+ <source>Distribution: %1</source>
+ <translation>發行版本:%1</translation>
+ </message>
+ <message>
+ <source>Debugging mode is disabled.</source>
+ <translation>除錯資訊已停用。</translation>
+ </message>
+ <message>
+ <source>Debugging mode is enabled.</source>
+ <translation>除錯資訊已啟用。</translation>
+ </message>
+ <message>
+ <source>Operating system: %1
+CPU architecture: %2
+Kernel: %3 %4</source>
+ <translation>作業系統:%1
+中央處理器架構:%2
+核心:%3 %4</translation>
+ </message>
+ <message>
+ <source>Auto-Type</source>
+ <translation>自動輸入</translation>
+ </message>
+ <message>
+ <source>KeeShare (signed and unsigned sharing)</source>
+ <translation>KeeShare(簽署及未簽署的共用)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only signed sharing)</source>
+ <translation>KeeShare(限簽署的共用)</translation>
+ </message>
+ <message>
+ <source>KeeShare (only unsigned sharing)</source>
+ <translation>KeeShare(限未簽署的共用)</translation>
+ </message>
+ <message>
+ <source>YubiKey</source>
+ <translation>YubiKey</translation>
+ </message>
+ <message>
+ <source>TouchID</source>
+ <translation>TouchID</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>無</translation>
+ </message>
+ <message>
+ <source>Enabled extensions:</source>
+ <translation>已啟用的擴充元件:</translation>
+ </message>
+ <message>
+ <source>Cryptographic libraries:</source>
+ <translation>加密函式庫:</translation>
+ </message>
+ <message>
+ <source>Cannot generate a password and prompt at the same time!</source>
+ <translation>無法同時產生並顯示密碼!</translation>
+ </message>
+ <message>
+ <source>Adds a new group to a database.</source>
+ <translation>加入新群組到資料庫。</translation>
+ </message>
+ <message>
+ <source>Path of the group to add.</source>
+ <translation>欲加入的群組路徑。</translation>
+ </message>
+ <message>
+ <source>Group %1 already exists!</source>
+ <translation>群組 %1 已經存在!</translation>
+ </message>
+ <message>
+ <source>Group %1 not found.</source>
+ <translation>群組 %1 未找到。</translation>
+ </message>
+ <message>
+ <source>Successfully added group %1.</source>
+ <translation>成功加入群組 %1。</translation>
+ </message>
+ <message>
+ <source>Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing SHA-1 hashes of leaked passwords in HIBP format, as available from https://haveibeenpwned.com/Passwords.</source>
+ <translation>檢查是否有任何密碼被公開泄露。FILENAME 需為一路徑指向檔案,內部以 HIBP 格式列出被泄露密碼的 SHA-1 雜湊。檔案可從 https://haveibeenpwned.com/Passwords 獲得。</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>FILENAME</translation>
+ </message>
+ <message>
+ <source>Analyze passwords for weaknesses and problems.</source>
+ <translation>分析密碼的弱點與問題。</translation>
+ </message>
+ <message>
+ <source>Failed to open HIBP file %1: %2</source>
+ <translation>開啟 HIBP 檔案 %1 失敗:%2</translation>
+ </message>
+ <message>
+ <source>Evaluating database entries against HIBP file, this will take a while...</source>
+ <translation>根據 HIBP 檔案評估資料庫的項目,這將花上一段時間...</translation>
+ </message>
+ <message>
+ <source>Close the currently opened database.</source>
+ <translation>關閉目前開啟的資料庫。</translation>
+ </message>
+ <message>
+ <source>Display this help.</source>
+ <translation>顯示此幫助。</translation>
+ </message>
+ <message>
+ <source>Yubikey slot used to encrypt the database.</source>
+ <translation>用來加密資料庫的 Yubikey 插槽。</translation>
+ </message>
+ <message>
+ <source>slot</source>
+ <translation>插槽</translation>
+ </message>
+ <message>
+ <source>Invalid word count %1</source>
+ <translation>無效的字數統計 %1</translation>
+ </message>
+ <message>
+ <source>The word list is too small (&lt; 1000 items)</source>
+ <translation>字詞清單過小(&lt; 1000 個項目)</translation>
+ </message>
+ <message>
+ <source>Exit interactive mode.</source>
+ <translation>離開互動模式。</translation>
+ </message>
+ <message>
+ <source>Format to use when exporting. Available choices are xml or csv. Defaults to xml.</source>
+ <translation>匯出時使用的格式。可用選項為 xml 或 csv。預設為 xml。</translation>
+ </message>
+ <message>
+ <source>Exports the content of a database to standard output in the specified format.</source>
+ <translation>以指定格式匯出資料庫內容至標準輸出。</translation>
+ </message>
+ <message>
+ <source>Unable to export database to XML: %1</source>
+ <translation>無法匯出資料庫至 XML:%1</translation>
+ </message>
+ <message>
+ <source>Unsupported format %1</source>
+ <translation>不支援的格式 %1</translation>
+ </message>
+ <message>
+ <source>Use numbers</source>
+ <translation>使用數字</translation>
+ </message>
+ <message>
+ <source>Invalid password length %1</source>
+ <translation>無效的密碼長度 %1</translation>
+ </message>
+ <message>
+ <source>Display command help.</source>
+ <translation>顯示指令幫助。</translation>
+ </message>
+ <message>
+ <source>Available commands:</source>
+ <translation>可用指令:</translation>
+ </message>
+ <message>
+ <source>Import the contents of an XML database.</source>
+ <translation>匯入 XML 資料庫的內容。</translation>
+ </message>
+ <message>
+ <source>Path of the XML database export.</source>
+ <translation>XML 資料庫匯出的路徑。</translation>
+ </message>
+ <message>
+ <source>Path of the new database.</source>
+ <translation>新資料庫的路徑。</translation>
+ </message>
+ <message>
+ <source>Unable to import XML database export %1</source>
+ <translation>無法匯入 XML 資料庫匯出 %1</translation>
+ </message>
+ <message>
+ <source>Successfully imported database.</source>
+ <translation>成功匯入資料庫。</translation>
+ </message>
+ <message>
+ <source>Unknown command %1</source>
+ <translation>未知的指令 %1</translation>
+ </message>
+ <message>
+ <source>Flattens the output to single lines.</source>
+ <translation>將輸出壓縮至單一行。</translation>
+ </message>
+ <message>
+ <source>Only print the changes detected by the merge operation.</source>
+ <translation>只印出合併操作偵測到的變更。</translation>
+ </message>
+ <message>
+ <source>Yubikey slot for the second database.</source>
+ <translation>第二資料庫的 Yubikey 插槽。</translation>
+ </message>
+ <message>
+ <source>Successfully merged %1 into %2.</source>
+ <translation>成功合併 %1 至 %2。</translation>
+ </message>
+ <message>
+ <source>Database was not modified by merge operation.</source>
+ <translation>資料庫未被合併操作修改。</translation>
+ </message>
+ <message>
+ <source>Moves an entry to a new group.</source>
+ <translation>移動項目至新群組。</translation>
+ </message>
+ <message>
+ <source>Path of the entry to move.</source>
+ <translation>欲移動的項目路徑。</translation>
+ </message>
+ <message>
+ <source>Path of the destination group.</source>
+ <translation>目標群組的路徑。</translation>
+ </message>
+ <message>
+ <source>Could not find group with path %1.</source>
+ <translation>找不到路徑為 %1 的群組。</translation>
+ </message>
+ <message>
+ <source>Entry is already in group %1.</source>
+ <translation>項目已存在於群組 %1。</translation>
+ </message>
+ <message>
+ <source>Successfully moved entry %1 to group %2.</source>
+ <translation>成功移動項目 %1 至群組 %2。</translation>
+ </message>
+ <message>
+ <source>Open a database.</source>
+ <translation>開啟資料庫。</translation>
+ </message>
+ <message>
+ <source>Path of the group to remove.</source>
+ <translation>欲移除的群組路徑。</translation>
+ </message>
+ <message>
+ <source>Cannot remove root group from database.</source>
+ <translation>無法從資料庫移除根群組。</translation>
+ </message>
+ <message>
+ <source>Successfully recycled group %1.</source>
+ <translation>成功回收群組 %1。</translation>
+ </message>
+ <message>
+ <source>Successfully deleted group %1.</source>
+ <translation>成功刪除群組 %1。</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not found</source>
+ <translation>開啟資料庫檔案 %1 失敗:查無此檔</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not a plain file</source>
+ <translation>開啟資料庫檔案 %1 失敗:並非檔案</translation>
+ </message>
+ <message>
+ <source>Failed to open database file %1: not readable</source>
+ <translation>開啟資料庫檔案 %1 失敗:無法讀取</translation>
+ </message>
+ <message>
+ <source>Enter password to unlock %1: </source>
+ <translation>輸入密碼以解鎖 %1: </translation>
+ </message>
+ <message>
+ <source>Invalid YubiKey slot %1</source>
+ <translation>無效的 YubiKey 插槽 %1</translation>
+ </message>
+ <message>
+ <source>Please touch the button on your YubiKey to unlock %1</source>
+ <translation>請接觸您的 YubiKey 上面的按鈕以解鎖 %1</translation>
+ </message>
+ <message>
+ <source>Enter password to encrypt database (optional): </source>
+ <translation>輸入密碼以加密資料庫(選用): </translation>
+ </message>
+ <message>
+ <source>HIBP file, line %1: parse error</source>
+ <translation>HIBP 檔案,欄 %1:剖析錯誤</translation>
+ </message>
+ <message>
+ <source>Secret Service Integration</source>
+ <translation>秘密服務整合</translation>
+ </message>
+ <message>
+ <source>User name</source>
+ <translation>使用者名稱</translation>
+ </message>
+ <message>
+ <source>%1[%2] Challenge Response - Slot %3 - %4</source>
+ <translation>%1[%2] 挑戰應答 - 插槽 %3 - %4</translation>
+ </message>
+ <message numerus="yes">
+ <source>Password for &apos;%1&apos; has been leaked %2 time(s)!</source>
+ <translation><numerusform>「%1」的密碼已被泄露 %2 次!</numerusform></translation>
+ </message>
+ <message>
+ <source>Invalid password generator after applying all options</source>
+ <translation>套用所有選項的密碼產生器為無效</translation>
</message>
</context>
<context>
@@ -4860,7 +6304,7 @@ Available commands:
<name>QtIOCompressor::open</name>
<message>
<source>The gzip format not supported in this version of zlib.</source>
- <translation>此版本的 zlib 不支援 gzip 格式</translation>
+ <translation>此版本的 zlib 不支援 gzip 格式。</translation>
</message>
<message>
<source>Internal zlib error: </source>
@@ -4871,90 +6315,90 @@ Available commands:
<name>SSHAgent</name>
<message>
<source>Agent connection failed.</source>
- <translation type="unfinished"/>
+ <translation>代理連線失敗。</translation>
</message>
<message>
<source>Agent protocol error.</source>
- <translation type="unfinished"/>
+ <translation>代理協議錯誤。</translation>
</message>
<message>
<source>No agent running, cannot add identity.</source>
- <translation type="unfinished"/>
+ <translation>代理未執行,無法加入身份。</translation>
</message>
<message>
<source>No agent running, cannot remove identity.</source>
- <translation type="unfinished"/>
+ <translation>代理未執行,無法移除身份。</translation>
</message>
<message>
<source>Agent refused this identity. Possible reasons include:</source>
- <translation type="unfinished"/>
+ <translation>代理拒絕此身份。可能的原因包括:</translation>
</message>
<message>
<source>The key has already been added.</source>
- <translation type="unfinished"/>
+ <translation>金鑰已經加入。</translation>
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>代理並未支援受限制的生命周期(請檢查選項)。</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
- <translation type="unfinished"/>
+ <translation>代理並未支援確認請求(請檢查選項)。</translation>
</message>
</context>
<context>
<name>SearchHelpWidget</name>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>搜尋幫助</translation>
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
- <translation type="unfinished"/>
+ <translation>搜尋條件如下所示:[修飾子][欄位:][&quot;]條件[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
- <translation type="unfinished"/>
+ <translation>必須符合所有搜尋條件(即邏輯 AND)</translation>
</message>
<message>
<source>Modifiers</source>
- <translation type="unfinished"/>
+ <translation>修飾子</translation>
</message>
<message>
<source>exclude term from results</source>
- <translation type="unfinished"/>
+ <translation>從結果排除條件</translation>
</message>
<message>
<source>match term exactly</source>
- <translation type="unfinished"/>
+ <translation>完全匹配條件</translation>
</message>
<message>
<source>use regex in term</source>
- <translation type="unfinished"/>
+ <translation>在條件中使用正規表示式 (regex)</translation>
</message>
<message>
<source>Fields</source>
- <translation type="unfinished"/>
+ <translation>欄位</translation>
</message>
<message>
<source>Term Wildcards</source>
- <translation type="unfinished"/>
+ <translation>條件通配符</translation>
</message>
<message>
<source>match anything</source>
- <translation type="unfinished"/>
+ <translation>任意匹配</translation>
</message>
<message>
<source>match one</source>
- <translation type="unfinished"/>
+ <translation>匹配一組</translation>
</message>
<message>
<source>logical OR</source>
- <translation type="unfinished"/>
+ <translation>邏輯 OR</translation>
</message>
<message>
<source>Examples</source>
- <translation type="unfinished"/>
+ <translation>範例</translation>
</message>
</context>
<context>
@@ -4973,12 +6417,12 @@ Available commands:
</message>
<message>
<source>Search Help</source>
- <translation type="unfinished"/>
+ <translation>搜尋幫助</translation>
</message>
<message>
<source>Search (%1)...</source>
<comment>Search placeholder text, %1 is the keyboard shortcut</comment>
- <translation type="unfinished"/>
+ <translation>搜尋 (%1)...</translation>
</message>
<message>
<source>Case sensitive</source>
@@ -4986,34 +6430,121 @@ Available commands:
</message>
</context>
<context>
+ <name>SettingsWidgetFdoSecrets</name>
+ <message>
+ <source>Options</source>
+ <translation>選項</translation>
+ </message>
+ <message>
+ <source>Enable KeepassXC Freedesktop.org Secret Service integration</source>
+ <translation>啟用 KeepassXC 與 Freedesktop.org 秘密服務 (Secret Service) 的整合</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>一般</translation>
+ </message>
+ <message>
+ <source>Show notification when credentials are requested</source>
+ <translation>請求憑證時顯示通知</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;若資料庫內的回收桶已經啟用,項目會直接被移至回收桶。否則,項目將會被刪除且不做任何確認。&lt;/p&gt;&lt;p&gt;若有項目被其他項目引用,您仍將會收到通知。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Don&apos;t confirm when entries are deleted by clients.</source>
+ <translation>當項目被客戶端刪除時,不進行確認。</translation>
+ </message>
+ <message>
+ <source>Exposed database groups:</source>
+ <translation>開放的資料庫群組:</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation>檔案名稱</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation>群組</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation>管理</translation>
+ </message>
+ <message>
+ <source>Authorization</source>
+ <translation>認證</translation>
+ </message>
+ <message>
+ <source>These applications are currently connected:</source>
+ <translation>這些應用程式目前已連線:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>應用程式</translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation>中斷連線</translation>
+ </message>
+ <message>
+ <source>Database settings</source>
+ <translation>資料庫設定</translation>
+ </message>
+ <message>
+ <source>Edit database settings</source>
+ <translation>編輯資料庫設定</translation>
+ </message>
+ <message>
+ <source>Unlock database</source>
+ <translation>解鎖資料庫</translation>
+ </message>
+ <message>
+ <source>Unlock database to show more information</source>
+ <translation>解鎖資料庫以顯示更多資訊</translation>
+ </message>
+ <message>
+ <source>Lock database</source>
+ <translation>鎖定資料庫</translation>
+ </message>
+ <message>
+ <source>Unlock to show</source>
+ <translation>解鎖以顯示</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>無</translation>
+ </message>
+</context>
+<context>
<name>SettingsWidgetKeeShare</name>
<message>
<source>Active</source>
- <translation type="unfinished"/>
+ <translation>啟用項</translation>
</message>
<message>
<source>Allow export</source>
- <translation type="unfinished"/>
+ <translation>允許匯出</translation>
</message>
<message>
<source>Allow import</source>
- <translation type="unfinished"/>
+ <translation>允許匯入</translation>
</message>
<message>
<source>Own certificate</source>
- <translation type="unfinished"/>
+ <translation>自帶證書</translation>
</message>
<message>
<source>Fingerprint:</source>
- <translation type="unfinished"/>
+ <translation>指紋:</translation>
</message>
<message>
<source>Certificate:</source>
- <translation type="unfinished"/>
+ <translation>證書:</translation>
</message>
<message>
<source>Signer</source>
- <translation type="unfinished"/>
+ <translation>簽署者</translation>
</message>
<message>
<source>Key:</source>
@@ -5029,23 +6560,23 @@ Available commands:
</message>
<message>
<source>Export</source>
- <translation type="unfinished"/>
+ <translation>匯出</translation>
</message>
<message>
<source>Imported certificates</source>
- <translation type="unfinished"/>
+ <translation>匯入的證書</translation>
</message>
<message>
<source>Trust</source>
- <translation type="unfinished"/>
+ <translation>信任</translation>
</message>
<message>
<source>Ask</source>
- <translation type="unfinished"/>
+ <translation>詢問</translation>
</message>
<message>
<source>Untrust</source>
- <translation type="unfinished"/>
+ <translation>不信任</translation>
</message>
<message>
<source>Remove</source>
@@ -5057,7 +6588,7 @@ Available commands:
</message>
<message>
<source>Status</source>
- <translation type="unfinished"/>
+ <translation>狀態</translation>
</message>
<message>
<source>Fingerprint</source>
@@ -5065,28 +6596,28 @@ Available commands:
</message>
<message>
<source>Certificate</source>
- <translation type="unfinished"/>
+ <translation>證書</translation>
</message>
<message>
<source>Trusted</source>
- <translation type="unfinished"/>
+ <translation>信任</translation>
</message>
<message>
<source>Untrusted</source>
- <translation type="unfinished"/>
+ <translation>不可信任</translation>
</message>
<message>
<source>Unknown</source>
- <translation type="unfinished"/>
+ <translation>未知</translation>
</message>
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
- <translation type="unfinished"/>
+ <translation>key.share</translation>
</message>
<message>
<source>KeeShare key file</source>
- <translation type="unfinished"/>
+ <translation>KeeShare 金鑰檔案</translation>
</message>
<message>
<source>All files</source>
@@ -5094,38 +6625,133 @@ Available commands:
</message>
<message>
<source>Select path</source>
- <translation type="unfinished"/>
+ <translation>選擇路徑</translation>
</message>
<message>
<source>Exporting changed certificate</source>
- <translation type="unfinished"/>
+ <translation>匯出已更改的證書</translation>
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
- <translation type="unfinished"/>
+ <translation>匯出的證書與目前使用的證書不同。真的要匯出目前的證書?</translation>
</message>
<message>
<source>Signer:</source>
- <translation type="unfinished"/>
+ <translation>簽署者:</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare imports</source>
+ <translation>允許 KeeShare 匯入</translation>
+ </message>
+ <message>
+ <source>Allow KeeShare exports</source>
+ <translation>允許 KeeShare 匯出</translation>
+ </message>
+ <message>
+ <source>Only show warnings and errors</source>
+ <translation>只顯示警告與錯誤</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>鍵</translation>
+ </message>
+ <message>
+ <source>Signer name field</source>
+ <translation>簽署者名稱欄位</translation>
+ </message>
+ <message>
+ <source>Generate new certificate</source>
+ <translation>產生新證書</translation>
+ </message>
+ <message>
+ <source>Import existing certificate</source>
+ <translation>匯入已存證書</translation>
+ </message>
+ <message>
+ <source>Export own certificate</source>
+ <translation>匯出自帶證書</translation>
+ </message>
+ <message>
+ <source>Known shares</source>
+ <translation>已知分享</translation>
+ </message>
+ <message>
+ <source>Trust selected certificate</source>
+ <translation>信任所選證書</translation>
+ </message>
+ <message>
+ <source>Ask whether to trust the selected certificate every time</source>
+ <translation>每次詢問是否信任所選證書</translation>
+ </message>
+ <message>
+ <source>Untrust selected certificate</source>
+ <translation>取消信任所選證書</translation>
+ </message>
+ <message>
+ <source>Remove selected certificate</source>
+ <translation>移除所選證書</translation>
</message>
</context>
<context>
- <name>ShareObserver</name>
+ <name>ShareExport</name>
+ <message>
+ <source>Overwriting signed share container is not supported - export prevented</source>
+ <translation>不支援覆寫已簽署的分享容器 — 匯出已阻止</translation>
+ </message>
+ <message>
+ <source>Could not write export container (%1)</source>
+ <translation>無法寫入匯出的共享容器 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not open file to write (%1)</source>
+ <translation>無法嵌入簽名:無法開啟檔案來寫入 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed signature: Could not write file (%1)</source>
+ <translation>無法嵌入簽名:無法寫入檔案 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not open file to write (%1)</source>
+ <translation>無法嵌入資料庫:無法開啟檔案來寫入 (%1)</translation>
+ </message>
+ <message>
+ <source>Could not embed database: Could not write file (%1)</source>
+ <translation>無法嵌入資料庫:無法寫入檔案 (%1)</translation>
+ </message>
+ <message>
+ <source>Overwriting unsigned share container is not supported - export prevented</source>
+ <translation>不支援覆寫未簽署的分享容器 — 匯出已阻止</translation>
+ </message>
+ <message>
+ <source>Could not write export container</source>
+ <translation>無法寫入匯出的共享容器</translation>
+ </message>
+ <message>
+ <source>Unexpected export error occurred</source>
+ <translation>出現未預期的錯誤</translation>
+ </message>
+</context>
+<context>
+ <name>ShareImport</name>
<message>
<source>Import from container without signature</source>
- <translation type="unfinished"/>
+ <translation>從沒有簽署的容器匯入</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
- <translation type="unfinished"/>
+ <translation>我們無法確認分享容器的來源,因為它未被簽署過。真的要從 %1 匯入嗎?</translation>
</message>
<message>
<source>Import from container with certificate</source>
- <translation type="unfinished"/>
+ <translation>從帶有證書的容器匯入</translation>
+ </message>
+ <message>
+ <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
+ <translation>是否要信任 %1,來自 %3 的 %2 的指紋?</translation>
</message>
<message>
<source>Not this time</source>
- <translation type="unfinished"/>
+ <translation>這次不要</translation>
</message>
<message>
<source>Never</source>
@@ -5133,123 +6759,86 @@ Available commands:
</message>
<message>
<source>Always</source>
- <translation type="unfinished"/>
+ <translation>永遠</translation>
</message>
<message>
<source>Just this time</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Import from %1 failed (%2)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Import from %1 successful (%2)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Imported from %1</source>
- <translation type="unfinished"/>
+ <translation>只有這次</translation>
</message>
<message>
<source>Signed share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>不支援已簽署的分享容器 — 匯入已阻止</translation>
</message>
<message>
<source>File is not readable</source>
- <translation type="unfinished"/>
+ <translation>檔案無法讀取</translation>
</message>
<message>
<source>Invalid sharing container</source>
- <translation type="unfinished"/>
+ <translation>無效的分享容器</translation>
</message>
<message>
<source>Untrusted import prevented</source>
- <translation type="unfinished"/>
+ <translation>阻止不受信任的匯入</translation>
</message>
<message>
<source>Successful signed import</source>
- <translation type="unfinished"/>
+ <translation>簽署已成功匯入</translation>
</message>
<message>
<source>Unexpected error</source>
- <translation type="unfinished"/>
+ <translation>未預期的錯誤</translation>
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
- <translation type="unfinished"/>
+ <translation>不支援未簽署的分享容器 — 匯入已阻止</translation>
</message>
<message>
<source>Successful unsigned import</source>
- <translation type="unfinished"/>
+ <translation>未簽署已成功匯入</translation>
</message>
<message>
<source>File does not exist</source>
- <translation type="unfinished"/>
+ <translation>檔案不存在</translation>
</message>
<message>
<source>Unknown share container type</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Overwriting signed share container is not supported - export prevented</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not write export container (%1)</source>
- <translation type="unfinished"/>
+ <translation>未知的共享容器種類</translation>
</message>
+</context>
+<context>
+ <name>ShareObserver</name>
<message>
- <source>Overwriting unsigned share container is not supported - export prevented</source>
- <translation type="unfinished"/>
+ <source>Import from %1 failed (%2)</source>
+ <translation>從 %1 匯入失敗 (%2)</translation>
</message>
<message>
- <source>Could not write export container</source>
- <translation type="unfinished"/>
+ <source>Import from %1 successful (%2)</source>
+ <translation>從 %1 匯入成功 (%2)</translation>
</message>
<message>
- <source>Unexpected export error occurred</source>
- <translation type="unfinished"/>
+ <source>Imported from %1</source>
+ <translation>從 %1 匯入</translation>
</message>
<message>
<source>Export to %1 failed (%2)</source>
- <translation type="unfinished"/>
+ <translation>匯出至 %1 失敗 (%2)</translation>
</message>
<message>
<source>Export to %1 successful (%2)</source>
- <translation type="unfinished"/>
+ <translation>匯出至 %1 成功 (%2)</translation>
</message>
<message>
<source>Export to %1</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
- <translation type="unfinished"/>
+ <translation>匯出至 %1</translation>
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
- <translation type="unfinished"/>
+ <translation>多個匯入來源路徑至 %1,位於 %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed signature: Could not write file (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not open file to write (%1)</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <source>Could not embed database: Could not write file (%1)</source>
- <translation type="unfinished"/>
+ <translation>衝突的匯出目標路徑 %1,位於 %2</translation>
</message>
</context>
<context>
@@ -5268,7 +6857,7 @@ Available commands:
</message>
<message numerus="yes">
<source>Expires in &lt;b&gt;%n&lt;/b&gt; second(s)</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>&lt;b&gt;%n&lt;/b&gt; 秒後過期</numerusform></translation>
</message>
</context>
<context>
@@ -5280,34 +6869,30 @@ Available commands:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
- <translation type="unfinished"/>
+ <translation>注意:這些 TOTP 設定為自定義項目,可能無法與其他驗証器一起使用。</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
- <translation type="unfinished"/>
+ <translation>建立 QR 碼時發生錯誤。</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
- <translation type="unfinished"/>
+ <translation>將於 %1 秒後關閉。</translation>
</message>
</context>
<context>
<name>TotpSetupDialog</name>
<message>
<source>Setup TOTP</source>
- <translation>安裝 TOTP</translation>
- </message>
- <message>
- <source>Key:</source>
- <translation>金鑰:</translation>
+ <translation>設置 TOTP</translation>
</message>
<message>
<source>Default RFC 6238 token settings</source>
- <translation>預設 RFC 6238 token 設定</translation>
+ <translation>預設 RFC 6238 令牌設定</translation>
</message>
<message>
<source>Steam token settings</source>
- <translation>Steam token 設定</translation>
+ <translation>Steam 令牌設定</translation>
</message>
<message>
<source>Use custom settings</source>
@@ -5315,7 +6900,7 @@ Available commands:
</message>
<message>
<source>Custom Settings</source>
- <translation type="unfinished"/>
+ <translation>自訂設定</translation>
</message>
<message>
<source>Time step:</source>
@@ -5331,27 +6916,57 @@ Available commands:
<translation>代碼長度:</translation>
</message>
<message>
- <source>6 digits</source>
- <translation>6 位數</translation>
+ <source>Secret Key:</source>
+ <translation>私密金鑰:</translation>
</message>
<message>
- <source>7 digits</source>
- <translation type="unfinished"/>
+ <source>Secret key must be in Base32 format</source>
+ <translation>私密金鑰必須為 Base32 格式</translation>
</message>
<message>
- <source>8 digits</source>
- <translation>8 位數</translation>
+ <source>Secret key field</source>
+ <translation>私密金鑰欄位</translation>
+ </message>
+ <message>
+ <source>Algorithm:</source>
+ <translation>演算法:</translation>
+ </message>
+ <message>
+ <source>Time step field</source>
+ <translation>時間間隔</translation>
+ </message>
+ <message>
+ <source> digits</source>
+ <translation> 位數</translation>
+ </message>
+ <message>
+ <source>Invalid TOTP Secret</source>
+ <translation>無效的 TOTP 私鑰</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid secret key. The key must be in Base32 format.
+Example: JBSWY3DPEHPK3PXP</source>
+ <translation>您輸入的私密金鑰無效。金鑰必須為 Base32 格式。
+範例:JBSWY3DPEHPK3PXP</translation>
+ </message>
+ <message>
+ <source>Confirm Remove TOTP Settings</source>
+ <translation>確認移除 TOTP 設定</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete TOTP settings for this entry?</source>
+ <translation>真的要刪除此項目的 TOTP 設定?</translation>
</message>
</context>
<context>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
- <translation type="unfinished"/>
+ <translation>正在檢查更新</translation>
</message>
<message>
<source>Checking for updates...</source>
- <translation type="unfinished"/>
+ <translation>正在檢查更新...</translation>
</message>
<message>
<source>Close</source>
@@ -5359,11 +6974,11 @@ Available commands:
</message>
<message>
<source>Update Error!</source>
- <translation type="unfinished"/>
+ <translation>更新錯誤!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
- <translation type="unfinished"/>
+ <translation>接收更新資訊時發生錯誤。</translation>
</message>
<message>
<source>Please try again later.</source>
@@ -5375,11 +6990,11 @@ Available commands:
</message>
<message>
<source>A new version of KeePassXC is available!</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC 有新版本可用!</translation>
</message>
<message>
<source>KeePassXC %1 is now available — you have %2.</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 可供使用 — 目前版本為 %2。</translation>
</message>
<message>
<source>Download it at keepassxc.org</source>
@@ -5387,11 +7002,11 @@ Available commands:
</message>
<message>
<source>You&apos;re up-to-date!</source>
- <translation type="unfinished"/>
+ <translation>您正使用最新版本!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
- <translation type="unfinished"/>
+ <translation>KeePassXC %1 為目前可用最新版本</translation>
</message>
</context>
<context>
@@ -5424,28 +7039,44 @@ Available commands:
<source>Welcome to KeePassXC %1</source>
<translation>歡迎來到 KeePassXC %1</translation>
</message>
+ <message>
+ <source>Import from 1Password</source>
+ <translation>從 1Password 匯入</translation>
+ </message>
+ <message>
+ <source>Open a recent database</source>
+ <translation>開啟一個近期的資料庫</translation>
+ </message>
</context>
<context>
<name>YubiKeyEditWidget</name>
<message>
<source>Refresh</source>
- <translation>重新整理</translation>
+ <translation>更新</translation>
</message>
<message>
<source>YubiKey Challenge-Response</source>
- <translation type="unfinished"/>
+ <translation>YubiKey 挑戰應答</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;p&gt;若您擁有&lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;,您可以使用它以獲得額外保護。&lt;/p&gt;&lt;p&gt;YubiKey 要求將其中一個插槽編程為 &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 挑戰應答&lt;/a&gt;。&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>
- <translation type="unfinished"/>
+ <translation>未偵測到 YubiKey,請確認是否插入裝置。</translation>
</message>
<message>
<source>No YubiKey inserted.</source>
- <translation type="unfinished"/>
+ <translation>YubiKey 尚未接入。</translation>
+ </message>
+ <message>
+ <source>Refresh hardware tokens</source>
+ <translation>更新硬體令牌</translation>
+ </message>
+ <message>
+ <source>Hardware key slot selection</source>
+ <translation>硬體金鑰插槽選擇</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/share/windows/wix-patch.xml b/share/windows/wix-patch.xml
index 205ffa352..4d01d68ce 100644
--- a/share/windows/wix-patch.xml
+++ b/share/windows/wix-patch.xml
@@ -1,10 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<CPackWiXPatch>
- <CPackWiXFragment Id="CM_FP_KeePassXC.exe">
- <Shortcut Id="CM_SP_KeePassXC.exe" Directory="ProgramMenuFolder"
- Name="KeePassXC" Icon="ProductIcon.ico"
- WorkingDirectory="INSTALL_ROOT" Advertise="yes" />
- </CPackWiXFragment>
<CPackWiXFragment Id="CM_CP_KeePassXC.exe">
<ProgId Id="KeePassXC.kdbx" Description="KeePass Password Database" Icon="CM_FP_KeePassXC.exe" IconIndex="1">
<Extension Id="kdbx" ContentType="application/x-keepass2">
diff --git a/share/windows/wix-template.xml b/share/windows/wix-template.xml
index 44cab1641..9693d6344 100644
--- a/share/windows/wix-template.xml
+++ b/share/windows/wix-template.xml
@@ -37,29 +37,56 @@
<?ifdef CPACK_WIX_UI_DIALOG?>
<WixVariable Id="WixUIDialogBmp" Value="$(var.CPACK_WIX_UI_DIALOG)"/>
<?endif?>
-
- <FeatureRef Id="ProductFeature"/>
-
- <UIRef Id="$(var.CPACK_WIX_UI_REF)" />
+
+ <FeatureRef Id="ProductFeature">
+ <ComponentRef Id="ApplicationShortcut" />
+ </FeatureRef>
+
+ <UI>
+ <UIRef Id="$(var.CPACK_WIX_UI_REF)" />
+ <Publish Dialog="ExitDialog"
+ Control="Finish"
+ Event="DoAction"
+ Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
+ </UI>
<?include "properties.wxi"?>
<?include "product_fragment.wxi"?>
<DirectoryRef Id="TARGETDIR">
- <Directory Id="ProgramMenuFolder" />
+ <Directory Id="ProgramMenuFolder">
+ <Directory Id="ApplicationProgramsFolder" Name="KeePassXC"/>
+ </Directory>
</DirectoryRef>
- <Property Id="WixSilentExecCmdLine" Value='"Taskkill" /IM KeePassXC.exe'/>
- <CustomAction Id="KillKeePassXCInstall" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="ignore"/>
- <CustomAction Id="KillKeePassXCUninstall" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="ignore"/>
+ <DirectoryRef Id="ApplicationProgramsFolder">
+ <Component Id="ApplicationShortcut" Guid="*">
+ <Shortcut Id="ApplicationStartMenuShortcut"
+ Name="KeePassXC"
+ Target="[#CM_FP_KeePassXC.exe]"
+ Icon="ProductIcon.ico"
+ WorkingDirectory="INSTALL_ROOT"/>
+ <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
+ <RegistryValue Root="HKCU" Key="Software\KeePassXC" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
+ </Component>
+ </DirectoryRef>
+
+ <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
+ <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch $(var.CPACK_PACKAGE_NAME)" />
+ <Property Id="WixShellExecTarget" Value="[#CM_FP_KeePassXC.exe]" />
+ <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
+
+ <Property Id="WixSilentExecCmdLine" Value='"Taskkill" /IM KeePassXC.exe' />
+ <CustomAction Id="KillKeePassXCInstall" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="ignore" />
+ <CustomAction Id="KillKeePassXCUninstall" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="ignore" />
- <Property Id="WixQuietExecCmdLine" Value='"Taskkill" /IM keepassxc-proxy.exe /F'/>
- <CustomAction Id="KillProxyInstall" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore"/>
- <CustomAction Id="KillProxyUninstall" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore"/>
+ <Property Id="WixQuietExecCmdLine" Value='"Taskkill" /IM keepassxc-proxy.exe /F' />
+ <CustomAction Id="KillProxyInstall" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore" />
+ <CustomAction Id="KillProxyUninstall" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore" />
<InstallExecuteSequence>
- <Custom Action="KillKeePassXCInstall" After="InstallInitialize"/>
- <Custom Action="KillProxyInstall" After="InstallInitialize"/>
+ <Custom Action="KillKeePassXCInstall" After="InstallInitialize" />
+ <Custom Action="KillProxyInstall" After="InstallInitialize" />
<Custom Action="KillKeePassXCUninstall" Before="InstallValidate">Installed</Custom>
<Custom Action="KillProxyUninstall" Before="InstallValidate">Installed</Custom>
</InstallExecuteSequence>
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index 2a8bb0294..aa68cea4f 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -1,5 +1,5 @@
name: keepassxc
-version: 2.4.3
+version: 2.5.0
grade: stable
summary: Community-driven port of the Windows application “KeePass Password Safe”
description: |
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f142f3680..0e3bca7af 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -27,6 +27,9 @@ set(keepassx_SOURCES
core/Alloc.cpp
core/AutoTypeAssociations.cpp
core/AutoTypeMatch.cpp
+ core/Base32.cpp
+ core/Bootstrap.cpp
+ core/Clock.cpp
core/Compare.cpp
core/Config.cpp
core/CsvParser.cpp
@@ -39,8 +42,8 @@ set(keepassx_SOURCES
core/EntrySearcher.cpp
core/FilePath.cpp
core/FileWatcher.cpp
- core/Bootstrap.cpp
core/Group.cpp
+ core/HibpOffline.cpp
core/InactivityTimer.cpp
core/Merger.cpp
core/Metadata.cpp
@@ -51,10 +54,8 @@ set(keepassx_SOURCES
core/ScreenLockListenerPrivate.cpp
core/TimeDelta.cpp
core/TimeInfo.cpp
- core/Clock.cpp
core/Tools.cpp
core/Translator.cpp
- core/Base32.cpp
cli/Utils.cpp
cli/TextStream.cpp
crypto/Crypto.cpp
@@ -66,6 +67,7 @@ set(keepassx_SOURCES
crypto/kdf/AesKdf.cpp
crypto/kdf/Argon2Kdf.cpp
format/CsvExporter.cpp
+ format/HtmlExporter.cpp
format/KeePass1Reader.cpp
format/KeePass2.cpp
format/KeePass2RandomStream.cpp
@@ -79,6 +81,11 @@ set(keepassx_SOURCES
format/Kdbx4Reader.cpp
format/Kdbx4Writer.cpp
format/KdbxXmlWriter.cpp
+ format/OpData01.cpp
+ format/OpVaultReader.cpp
+ format/OpVaultReaderAttachments.cpp
+ format/OpVaultReaderBandEntry.cpp
+ format/OpVaultReaderSections.cpp
gui/AboutDialog.cpp
gui/Application.cpp
gui/CategoryListWidget.cpp
@@ -103,6 +110,7 @@ set(keepassx_SOURCES
gui/MainWindow.cpp
gui/MessageBox.cpp
gui/MessageWidget.cpp
+ gui/OpVaultOpenWidget.cpp
gui/PasswordEdit.cpp
gui/PasswordGeneratorWidget.cpp
gui/ApplicationSettingsWidget.cpp
@@ -140,6 +148,8 @@ set(keepassx_SOURCES
gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.cpp
gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp
gui/dbsettings/DatabaseSettingsWidgetMasterKey.cpp
+ gui/dbsettings/DatabaseSettingsWidgetStatistics.cpp
+ gui/dbsettings/DatabaseSettingsPageStatistics.cpp
gui/settings/SettingsWidget.cpp
gui/widgets/ElidedLabel.cpp
gui/widgets/PopupHelpWidget.cpp
@@ -152,6 +162,7 @@ set(keepassx_SOURCES
keys/FileKey.cpp
keys/PasswordKey.cpp
keys/YkChallengeResponseKey.cpp
+ keys/YkChallengeResponseKeyCLI.cpp
streams/HashedBlockStream.cpp
streams/HmacBlockStream.cpp
streams/LayeredStream.cpp
@@ -194,6 +205,9 @@ add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible wit
add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare (requires quazip5 for secure containers)")
add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response")
add_feature_info(UpdateCheck WITH_XC_UPDATECHECK "Automatic update checking")
+if(UNIX AND NOT APPLE)
+ add_feature_info(FdoSecrets WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API.")
+endif()
if(APPLE)
add_feature_info(TouchID WITH_XC_TOUCHID "TouchID integration")
endif()
@@ -204,6 +218,7 @@ add_subdirectory(proxy)
if(WITH_XC_BROWSER)
set(keepassxcbrowser_LIB keepassxcbrowser)
set(keepassx_SOURCES ${keepassx_SOURCES} gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp)
+ set(keepassx_SOURCES ${keepassx_SOURCES} gui/entry/EntryURLModel.cpp)
endif()
add_subdirectory(autotype)
@@ -226,10 +241,16 @@ if(WITH_XC_SSHAGENT)
set(sshagent_LIB sshagent)
endif()
+add_subdirectory(fdosecrets)
+if(WITH_XC_FDOSECRETS)
+ set(fdosecrets_LIB fdosecrets)
+endif()
+
set(autotype_SOURCES
core/Tools.cpp
autotype/AutoType.cpp
autotype/AutoTypeAction.cpp
+ autotype/AutoTypeFilterLineEdit.cpp
autotype/AutoTypeSelectDialog.cpp
autotype/AutoTypeSelectView.cpp
autotype/ShortcutWidget.cpp
@@ -247,7 +268,12 @@ else()
endif()
if(WITH_XC_NETWORKING)
- list(APPEND keepassx_SOURCES updatecheck/UpdateChecker.cpp gui/UpdateCheckDialog.cpp)
+ list(APPEND keepassx_SOURCES
+ core/IconDownloader.cpp
+ core/NetworkManager.cpp
+ gui/UpdateCheckDialog.cpp
+ gui/IconDownloaderDialog.cpp
+ updatecheck/UpdateChecker.cpp)
endif()
if(WITH_XC_TOUCHID)
@@ -269,6 +295,7 @@ target_link_libraries(keepassx_core
autotype
${keepassxcbrowser_LIB}
${qrcode_LIB}
+ ${fdosecrets_LIB}
Qt5::Core
Qt5::Concurrent
Qt5::Network
@@ -362,6 +389,10 @@ install(TARGETS ${PROGNAME}
BUNDLE DESTINATION . COMPONENT Runtime
RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT Runtime)
+if(APPLE OR UNIX)
+ install(FILES ../share/docs/man/keepassxc.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
+endif()
+
if(MINGW)
if(${CMAKE_SIZEOF_VOID_P} EQUAL "8")
set(OUTPUT_FILE_POSTFIX "Win64")
diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp
index 20fabea88..a539d0a03 100644
--- a/src/autotype/AutoType.cpp
+++ b/src/autotype/AutoType.cpp
@@ -37,6 +37,10 @@
#include "core/Tools.h"
#include "gui/MessageBox.h"
+#ifdef Q_OS_MAC
+#include "gui/macutils/MacUtils.h"
+#endif
+
AutoType* AutoType::m_instance = nullptr;
AutoType::AutoType(QObject* parent, bool test)
@@ -214,6 +218,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c
if (hideWindow) {
#if defined(Q_OS_MACOS)
+ macUtils()->raiseLastActiveWindow();
m_plugin->hideOwnWindow();
#else
hideWindow->showMinimized();
@@ -631,9 +636,8 @@ 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.indexIn(windowTitle) != -1);
- } else {
- return WildcardMatcher(windowTitle).match(windowPattern);
}
+ return WildcardMatcher(windowTitle).match(windowPattern);
}
/**
diff --git a/src/autotype/AutoTypeFilterLineEdit.cpp b/src/autotype/AutoTypeFilterLineEdit.cpp
new file mode 100644
index 000000000..d94292d26
--- /dev/null
+++ b/src/autotype/AutoTypeFilterLineEdit.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "AutoTypeFilterLineEdit.h"
+#include <QKeyEvent>
+
+void AutoTypeFilterLineEdit::keyPressEvent(QKeyEvent* event)
+{
+ if (event->key() == Qt::Key_Up) {
+ emit keyUpPressed();
+ } else if (event->key() == Qt::Key_Down) {
+ emit keyDownPressed();
+ } else {
+ QLineEdit::keyPressEvent(event);
+ }
+}
+
+void AutoTypeFilterLineEdit::keyReleaseEvent(QKeyEvent* event)
+{
+ if (event->key() == Qt::Key_Escape) {
+ emit escapeReleased();
+ } else {
+ QLineEdit::keyReleaseEvent(event);
+ }
+}
diff --git a/src/autotype/AutoTypeFilterLineEdit.h b/src/autotype/AutoTypeFilterLineEdit.h
new file mode 100644
index 000000000..6f8ca570d
--- /dev/null
+++ b/src/autotype/AutoTypeFilterLineEdit.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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_AUTOTYPEFILTERLINEEDIT_H
+#define KEEPASSX_AUTOTYPEFILTERLINEEDIT_H
+
+#include <QLineEdit>
+
+class AutoTypeFilterLineEdit : public QLineEdit
+{
+ Q_OBJECT
+
+public:
+ AutoTypeFilterLineEdit(QWidget* widget)
+ : QLineEdit(widget)
+ {
+ }
+
+protected:
+ virtual void keyPressEvent(QKeyEvent* event);
+ virtual void keyReleaseEvent(QKeyEvent* event);
+signals:
+ void keyUpPressed();
+ void keyDownPressed();
+ void escapeReleased();
+};
+
+#endif // KEEPASSX_AUTOTYPEFILTERLINEEDIT_H
diff --git a/src/autotype/AutoTypeSelectDialog.cpp b/src/autotype/AutoTypeSelectDialog.cpp
index 1449f9e02..997858f0d 100644
--- a/src/autotype/AutoTypeSelectDialog.cpp
+++ b/src/autotype/AutoTypeSelectDialog.cpp
@@ -27,6 +27,8 @@
#include <QDialogButtonBox>
#include <QHeaderView>
#include <QLabel>
+#include <QLineEdit>
+#include <QSortFilterProxyModel>
#include <QVBoxLayout>
#include "autotype/AutoTypeSelectView.h"
@@ -38,6 +40,7 @@
AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
: QDialog(parent)
, m_view(new AutoTypeSelectView(this))
+ , m_filterLineEdit(new AutoTypeFilterLineEdit(this))
, m_matchActivatedEmitted(false)
, m_rejected(false)
{
@@ -72,13 +75,31 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
connect(m_view, SIGNAL(clicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex)));
connect(m_view->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(matchRemoved()));
connect(m_view, SIGNAL(rejected()), SLOT(reject()));
+ connect(m_view, SIGNAL(matchTextCopied()), SLOT(reject()));
// clang-format on
+ QSortFilterProxyModel* proxy = qobject_cast<QSortFilterProxyModel*>(m_view->model());
+ if (proxy) {
+ proxy->setFilterKeyColumn(-1);
+ proxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
+ }
+
layout->addWidget(m_view);
+ connect(m_filterLineEdit, SIGNAL(textChanged(QString)), SLOT(filterList(QString)));
+ connect(m_filterLineEdit, SIGNAL(returnPressed()), SLOT(activateCurrentIndex()));
+ connect(m_filterLineEdit, SIGNAL(keyUpPressed()), SLOT(moveSelectionUp()));
+ connect(m_filterLineEdit, SIGNAL(keyDownPressed()), SLOT(moveSelectionDown()));
+ connect(m_filterLineEdit, SIGNAL(escapeReleased()), SLOT(reject()));
+
+ m_filterLineEdit->setPlaceholderText(tr("Search..."));
+ layout->addWidget(m_filterLineEdit);
+
QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, this);
connect(buttonBox, SIGNAL(rejected()), SLOT(reject()));
layout->addWidget(buttonBox);
+
+ m_filterLineEdit->setFocus();
}
void AutoTypeSelectDialog::setMatchList(const QList<AutoTypeMatch>& matchList)
@@ -121,7 +142,43 @@ void AutoTypeSelectDialog::matchRemoved()
return;
}
- if (m_view->model()->rowCount() == 0) {
+ if (m_view->model()->rowCount() == 0 && m_filterLineEdit->text().isEmpty()) {
reject();
}
}
+
+void AutoTypeSelectDialog::filterList(QString filterString)
+{
+ QSortFilterProxyModel* proxy = qobject_cast<QSortFilterProxyModel*>(m_view->model());
+ if (proxy) {
+ proxy->setFilterWildcard(filterString);
+ if (!m_view->currentIndex().isValid()) {
+ m_view->setCurrentIndex(m_view->model()->index(0, 0));
+ }
+ }
+}
+
+void AutoTypeSelectDialog::moveSelectionUp()
+{
+ auto current = m_view->currentIndex();
+ auto previous = current.sibling(current.row() - 1, 0);
+
+ if (previous.isValid()) {
+ m_view->setCurrentIndex(previous);
+ }
+}
+
+void AutoTypeSelectDialog::moveSelectionDown()
+{
+ auto current = m_view->currentIndex();
+ auto next = current.sibling(current.row() + 1, 0);
+
+ if (next.isValid()) {
+ m_view->setCurrentIndex(next);
+ }
+}
+
+void AutoTypeSelectDialog::activateCurrentIndex()
+{
+ emitMatchActivated(m_view->currentIndex());
+}
diff --git a/src/autotype/AutoTypeSelectDialog.h b/src/autotype/AutoTypeSelectDialog.h
index cee3c4087..a22218f1f 100644
--- a/src/autotype/AutoTypeSelectDialog.h
+++ b/src/autotype/AutoTypeSelectDialog.h
@@ -22,6 +22,7 @@
#include <QDialog>
#include <QHash>
+#include "autotype/AutoTypeFilterLineEdit.h"
#include "core/AutoTypeMatch.h"
class AutoTypeSelectView;
@@ -44,9 +45,14 @@ public slots:
private slots:
void emitMatchActivated(const QModelIndex& index);
void matchRemoved();
+ void filterList(QString filterString);
+ void moveSelectionUp();
+ void moveSelectionDown();
+ void activateCurrentIndex();
private:
AutoTypeSelectView* const m_view;
+ AutoTypeFilterLineEdit* const m_filterLineEdit;
bool m_matchActivatedEmitted;
bool m_rejected;
};
diff --git a/src/autotype/mac/AutoTypeMac.cpp b/src/autotype/mac/AutoTypeMac.cpp
index e73e53777..c88ae6fca 100644
--- a/src/autotype/mac/AutoTypeMac.cpp
+++ b/src/autotype/mac/AutoTypeMac.cpp
@@ -17,47 +17,43 @@
*/
#include "AutoTypeMac.h"
+#include "AutoTypeMacKeyCodes.h"
#include "gui/macutils/MacUtils.h"
-#include <ApplicationServices/ApplicationServices.h>
-
-#define HOTKEY_ID 1
#define MAX_WINDOW_TITLE_LENGTH 1024
#define INVALID_KEYCODE 0xFFFF
AutoTypePlatformMac::AutoTypePlatformMac()
- : m_hotkeyRef(nullptr)
- , m_hotkeyId({ 'kpx2', HOTKEY_ID })
+ : m_globalMonitor(nullptr)
{
- EventTypeSpec eventSpec;
- eventSpec.eventClass = kEventClassKeyboard;
- eventSpec.eventKind = kEventHotKeyPressed;
-
- ::InstallApplicationEventHandler(AutoTypePlatformMac::hotkeyHandler, 1, &eventSpec, this, nullptr);
}
-//
-// Keepassx requires mac os 10.7
-//
+/**
+ * Request accessibility permissions required for keyboard control
+ *
+ * @return true on success
+ */
bool AutoTypePlatformMac::isAvailable()
{
- return true;
+ return macUtils()->enableAccessibility();
}
-//
-// Get list of visible window titles
-// see: Quartz Window Services
-//
+/**
+ * Get a list of the currently open window titles
+ *
+ * @return list of window titles
+ */
QStringList AutoTypePlatformMac::windowTitles()
{
QStringList list;
- CFArrayRef windowList = ::CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
- if (windowList != nullptr) {
- CFIndex count = ::CFArrayGetCount(windowList);
+ auto windowList = ::CGWindowListCopyWindowInfo(
+ kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
+ if (windowList) {
+ auto count = ::CFArrayGetCount(windowList);
for (CFIndex i = 0; i < count; i++) {
- CFDictionaryRef window = static_cast<CFDictionaryRef>(::CFArrayGetValueAtIndex(windowList, i));
+ auto window = static_cast<CFDictionaryRef>(::CFArrayGetValueAtIndex(windowList, i));
if (windowLayer(window) != 0) {
continue;
}
@@ -74,24 +70,28 @@ QStringList AutoTypePlatformMac::windowTitles()
return list;
}
-//
-// Get active window process id
-//
+/**
+ * Get active window ID
+ *
+ * @return window ID
+ */
WId AutoTypePlatformMac::activeWindow()
{
return macUtils()->activeWindow();
}
-//
-// Get active window title
-// see: Quartz Window Services
-//
+/**
+ * Get active window title
+ *
+ * @return window title
+ */
QString AutoTypePlatformMac::activeWindowTitle()
{
QString title;
- CFArrayRef windowList = ::CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
- if (windowList != nullptr) {
+ CFArrayRef windowList = ::CGWindowListCopyWindowInfo(
+ kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
+ if (windowList) {
CFIndex count = ::CFArrayGetCount(windowList);
for (CFIndex i = 0; i < count; i++) {
@@ -111,41 +111,62 @@ QString AutoTypePlatformMac::activeWindowTitle()
return title;
}
-//
-// Register global hotkey
-//
+/**
+ * Register global hotkey using NS global event monitor.
+ * Note that this hotkey is not trapped and may trigger
+ * actions in the local application where it is issued.
+ *
+ * @param key key used for hotkey
+ * @param modifiers modifiers required in addition to key
+ * @return true on success
+ */
bool AutoTypePlatformMac::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
{
- uint16 nativeKeyCode = qtToNativeKeyCode(key);
+ auto nativeKeyCode = qtToNativeKeyCode(key);
if (nativeKeyCode == INVALID_KEYCODE) {
qWarning("Invalid key code");
return false;
}
- CGEventFlags nativeModifiers = qtToNativeModifiers(modifiers, false);
- if (::RegisterEventHotKey(nativeKeyCode, nativeModifiers, m_hotkeyId, GetApplicationEventTarget(), 0, &m_hotkeyRef) != noErr) {
- qWarning("Register hotkey failed");
- return false;
- }
-
+ auto nativeModifiers = qtToNativeModifiers(modifiers);
+ m_globalMonitor =
+ macUtils()->addGlobalMonitor(nativeKeyCode, nativeModifiers, this, AutoTypePlatformMac::hotkeyHandler);
return true;
}
-//
-// Unregister global hotkey
-//
+/**
+ * Handle global hotkey presses by emitting the trigger signal
+ *
+ * @param userData pointer to AutoTypePlatform
+ */
+void AutoTypePlatformMac::hotkeyHandler(void* userData)
+{
+ auto* self = static_cast<AutoTypePlatformMac*>(userData);
+ emit self->globalShortcutTriggered();
+}
+
+/**
+ * Unregister a previously registered global hotkey
+ *
+ * @param key unused
+ * @param modifiers unused
+ */
void AutoTypePlatformMac::unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
{
Q_UNUSED(key);
Q_UNUSED(modifiers);
-
- ::UnregisterEventHotKey(m_hotkeyRef);
+ if (m_globalMonitor) {
+ macUtils()->removeGlobalMonitor(m_globalMonitor);
+ m_globalMonitor = nullptr;
+ }
}
+/**
+ * Unused
+ */
int AutoTypePlatformMac::platformEventFilter(void* event)
{
Q_UNUSED(event);
Q_ASSERT(false);
-
return -1;
}
@@ -154,17 +175,21 @@ AutoTypeExecutor* AutoTypePlatformMac::createExecutor()
return new AutoTypeExecutorMac(this);
}
-//
-// Activate window by process id
-//
+/**
+ * Raise the given window ID
+ *
+ * @return true on success
+ */
bool AutoTypePlatformMac::raiseWindow(WId pid)
{
return macUtils()->raiseWindow(pid);
}
-//
-// Activate last active window
-//
+/**
+ * Hide the KeePassXC window
+ *
+ * @return true on success
+ */
bool AutoTypePlatformMac::hideOwnWindow()
{
return macUtils()->hideOwnWindow();
@@ -178,285 +203,287 @@ bool AutoTypePlatformMac::raiseOwnWindow()
return macUtils()->raiseOwnWindow();
}
-//
-// Send unicode character to active window
-// see: Quartz Event Services
-//
+/**
+ * Send provided character as key event to the active window
+ *
+ * @param ch unicode character
+ * @param isKeyDown whether the key is pressed
+ */
void AutoTypePlatformMac::sendChar(const QChar& ch, bool isKeyDown)
{
- CGEventRef keyEvent = ::CGEventCreateKeyboardEvent(nullptr, 0, isKeyDown);
- if (keyEvent != nullptr) {
- UniChar unicode = ch.unicode();
+ auto keyEvent = ::CGEventCreateKeyboardEvent(nullptr, 0, isKeyDown);
+ if (keyEvent) {
+ auto unicode = ch.unicode();
::CGEventKeyboardSetUnicodeString(keyEvent, 1, &unicode);
::CGEventPost(kCGSessionEventTap, keyEvent);
::CFRelease(keyEvent);
}
}
-//
-// Send key code to active window
-// see: Quartz Event Services
-//
-void AutoTypePlatformMac::sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers = 0)
+/**
+ * Send provided Qt key as key event to the active window
+ *
+ * @param key Qt key code
+ * @param isKeyDown whether the key is pressed
+ * @param modifiers any modifiers to apply to key
+ */
+void AutoTypePlatformMac::sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers)
{
- uint16 keyCode = qtToNativeKeyCode(key);
+ auto keyCode = qtToNativeKeyCode(key);
if (keyCode == INVALID_KEYCODE) {
return;
}
- CGEventRef keyEvent = ::CGEventCreateKeyboardEvent(nullptr, keyCode, isKeyDown);
- CGEventFlags nativeModifiers = qtToNativeModifiers(modifiers, true);
- if (keyEvent != nullptr) {
+ auto keyEvent = ::CGEventCreateKeyboardEvent(nullptr, keyCode, isKeyDown);
+ auto nativeModifiers = qtToNativeModifiers(modifiers);
+ if (keyEvent) {
::CGEventSetFlags(keyEvent, nativeModifiers);
::CGEventPost(kCGSessionEventTap, keyEvent);
::CFRelease(keyEvent);
}
}
-//
-// Translate qt key code to mac os key code
-// see: HIToolbox/Events.h
-//
-uint16 AutoTypePlatformMac::qtToNativeKeyCode(Qt::Key key)
+/**
+ * Translate Qt key to macOS key code provided by
+ * AutoTypeMacKeyCodes.h which are derived from
+ * legacy Carbon "HIToolbox/Events.h"
+ *
+ * @param key key to translate
+ * @returns macOS key code
+ */
+CGKeyCode AutoTypePlatformMac::qtToNativeKeyCode(Qt::Key key)
{
switch (key) {
- case Qt::Key_A:
- return kVK_ANSI_A;
- case Qt::Key_B:
- return kVK_ANSI_B;
- case Qt::Key_C:
- return kVK_ANSI_C;
- case Qt::Key_D:
- return kVK_ANSI_D;
- case Qt::Key_E:
- return kVK_ANSI_E;
- case Qt::Key_F:
- return kVK_ANSI_F;
- case Qt::Key_G:
- return kVK_ANSI_G;
- case Qt::Key_H:
- return kVK_ANSI_H;
- case Qt::Key_I:
- return kVK_ANSI_I;
- case Qt::Key_J:
- return kVK_ANSI_J;
- case Qt::Key_K:
- return kVK_ANSI_K;
- case Qt::Key_L:
- return kVK_ANSI_L;
- case Qt::Key_M:
- return kVK_ANSI_M;
- case Qt::Key_N:
- return kVK_ANSI_N;
- case Qt::Key_O:
- return kVK_ANSI_O;
- case Qt::Key_P:
- return kVK_ANSI_P;
- case Qt::Key_Q:
- return kVK_ANSI_Q;
- case Qt::Key_R:
- return kVK_ANSI_R;
- case Qt::Key_S:
- return kVK_ANSI_S;
- case Qt::Key_T:
- return kVK_ANSI_T;
- case Qt::Key_U:
- return kVK_ANSI_U;
- case Qt::Key_V:
- return kVK_ANSI_V;
- case Qt::Key_W:
- return kVK_ANSI_W;
- case Qt::Key_X:
- return kVK_ANSI_X;
- case Qt::Key_Y:
- return kVK_ANSI_Y;
- case Qt::Key_Z:
- return kVK_ANSI_Z;
-
- case Qt::Key_0:
- return kVK_ANSI_0;
- case Qt::Key_1:
- return kVK_ANSI_1;
- case Qt::Key_2:
- return kVK_ANSI_2;
- case Qt::Key_3:
- return kVK_ANSI_3;
- case Qt::Key_4:
- return kVK_ANSI_4;
- case Qt::Key_5:
- return kVK_ANSI_5;
- case Qt::Key_6:
- return kVK_ANSI_6;
- case Qt::Key_7:
- return kVK_ANSI_7;
- case Qt::Key_8:
- return kVK_ANSI_8;
- case Qt::Key_9:
- return kVK_ANSI_9;
-
- case Qt::Key_Equal:
- return kVK_ANSI_Equal;
- case Qt::Key_Minus:
- return kVK_ANSI_Minus;
- case Qt::Key_BracketRight:
- return kVK_ANSI_RightBracket;
- case Qt::Key_BracketLeft:
- return kVK_ANSI_LeftBracket;
- case Qt::Key_QuoteDbl:
- return kVK_ANSI_Quote;
- case Qt::Key_Semicolon:
- return kVK_ANSI_Semicolon;
- case Qt::Key_Backslash:
- return kVK_ANSI_Backslash;
- case Qt::Key_Comma:
- return kVK_ANSI_Comma;
- case Qt::Key_Slash:
- return kVK_ANSI_Slash;
- case Qt::Key_Period:
- return kVK_ANSI_Period;
-
- case Qt::Key_Shift:
- return kVK_Shift;
- case Qt::Key_Control:
- return kVK_Command;
- case Qt::Key_Backspace:
- return kVK_Delete;
- case Qt::Key_Tab:
- case Qt::Key_Backtab:
- return kVK_Tab;
- case Qt::Key_Enter:
- case Qt::Key_Return:
- return kVK_Return;
- case Qt::Key_CapsLock:
- return kVK_CapsLock;
- case Qt::Key_Escape:
- return kVK_Escape;
- case Qt::Key_Space:
- return kVK_Space;
- case Qt::Key_PageUp:
- return kVK_PageUp;
- case Qt::Key_PageDown:
- return kVK_PageDown;
- case Qt::Key_End:
- return kVK_End;
- case Qt::Key_Home:
- return kVK_Home;
- case Qt::Key_Left:
- return kVK_LeftArrow;
- case Qt::Key_Up:
- return kVK_UpArrow;
- case Qt::Key_Right:
- return kVK_RightArrow;
- case Qt::Key_Down:
- return kVK_DownArrow;
- case Qt::Key_Delete:
- return kVK_ForwardDelete;
- case Qt::Key_Help:
- return kVK_Help;
-
- case Qt::Key_F1:
- return kVK_F1;
- case Qt::Key_F2:
- return kVK_F2;
- case Qt::Key_F3:
- return kVK_F3;
- case Qt::Key_F4:
- return kVK_F4;
- case Qt::Key_F5:
- return kVK_F5;
- case Qt::Key_F6:
- return kVK_F6;
- case Qt::Key_F7:
- return kVK_F7;
- case Qt::Key_F8:
- return kVK_F8;
- case Qt::Key_F9:
- return kVK_F9;
- case Qt::Key_F10:
- return kVK_F10;
- case Qt::Key_F11:
- return kVK_F11;
- case Qt::Key_F12:
- return kVK_F12;
- case Qt::Key_F13:
- return kVK_F13;
- case Qt::Key_F14:
- return kVK_F14;
- case Qt::Key_F15:
- return kVK_F15;
- case Qt::Key_F16:
- return kVK_F16;
-
- default:
- Q_ASSERT(false);
- return INVALID_KEYCODE;
+ case Qt::Key_A:
+ return kVK_ANSI_A;
+ case Qt::Key_B:
+ return kVK_ANSI_B;
+ case Qt::Key_C:
+ return kVK_ANSI_C;
+ case Qt::Key_D:
+ return kVK_ANSI_D;
+ case Qt::Key_E:
+ return kVK_ANSI_E;
+ case Qt::Key_F:
+ return kVK_ANSI_F;
+ case Qt::Key_G:
+ return kVK_ANSI_G;
+ case Qt::Key_H:
+ return kVK_ANSI_H;
+ case Qt::Key_I:
+ return kVK_ANSI_I;
+ case Qt::Key_J:
+ return kVK_ANSI_J;
+ case Qt::Key_K:
+ return kVK_ANSI_K;
+ case Qt::Key_L:
+ return kVK_ANSI_L;
+ case Qt::Key_M:
+ return kVK_ANSI_M;
+ case Qt::Key_N:
+ return kVK_ANSI_N;
+ case Qt::Key_O:
+ return kVK_ANSI_O;
+ case Qt::Key_P:
+ return kVK_ANSI_P;
+ case Qt::Key_Q:
+ return kVK_ANSI_Q;
+ case Qt::Key_R:
+ return kVK_ANSI_R;
+ case Qt::Key_S:
+ return kVK_ANSI_S;
+ case Qt::Key_T:
+ return kVK_ANSI_T;
+ case Qt::Key_U:
+ return kVK_ANSI_U;
+ case Qt::Key_V:
+ return kVK_ANSI_V;
+ case Qt::Key_W:
+ return kVK_ANSI_W;
+ case Qt::Key_X:
+ return kVK_ANSI_X;
+ case Qt::Key_Y:
+ return kVK_ANSI_Y;
+ case Qt::Key_Z:
+ return kVK_ANSI_Z;
+
+ case Qt::Key_0:
+ return kVK_ANSI_0;
+ case Qt::Key_1:
+ return kVK_ANSI_1;
+ case Qt::Key_2:
+ return kVK_ANSI_2;
+ case Qt::Key_3:
+ return kVK_ANSI_3;
+ case Qt::Key_4:
+ return kVK_ANSI_4;
+ case Qt::Key_5:
+ return kVK_ANSI_5;
+ case Qt::Key_6:
+ return kVK_ANSI_6;
+ case Qt::Key_7:
+ return kVK_ANSI_7;
+ case Qt::Key_8:
+ return kVK_ANSI_8;
+ case Qt::Key_9:
+ return kVK_ANSI_9;
+
+ case Qt::Key_Equal:
+ return kVK_ANSI_Equal;
+ case Qt::Key_Minus:
+ return kVK_ANSI_Minus;
+ case Qt::Key_BracketRight:
+ return kVK_ANSI_RightBracket;
+ case Qt::Key_BracketLeft:
+ return kVK_ANSI_LeftBracket;
+ case Qt::Key_QuoteDbl:
+ return kVK_ANSI_Quote;
+ case Qt::Key_Semicolon:
+ return kVK_ANSI_Semicolon;
+ case Qt::Key_Backslash:
+ return kVK_ANSI_Backslash;
+ case Qt::Key_Comma:
+ return kVK_ANSI_Comma;
+ case Qt::Key_Slash:
+ return kVK_ANSI_Slash;
+ case Qt::Key_Period:
+ return kVK_ANSI_Period;
+
+ case Qt::Key_Shift:
+ return kVK_Shift;
+ case Qt::Key_Control:
+ return kVK_Command;
+ case Qt::Key_Backspace:
+ return kVK_Delete;
+ case Qt::Key_Tab:
+ case Qt::Key_Backtab:
+ return kVK_Tab;
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ return kVK_Return;
+ case Qt::Key_CapsLock:
+ return kVK_CapsLock;
+ case Qt::Key_Escape:
+ return kVK_Escape;
+ case Qt::Key_Space:
+ return kVK_Space;
+ case Qt::Key_PageUp:
+ return kVK_PageUp;
+ case Qt::Key_PageDown:
+ return kVK_PageDown;
+ case Qt::Key_End:
+ return kVK_End;
+ case Qt::Key_Home:
+ return kVK_Home;
+ case Qt::Key_Left:
+ return kVK_LeftArrow;
+ case Qt::Key_Up:
+ return kVK_UpArrow;
+ case Qt::Key_Right:
+ return kVK_RightArrow;
+ case Qt::Key_Down:
+ return kVK_DownArrow;
+ case Qt::Key_Delete:
+ return kVK_ForwardDelete;
+ case Qt::Key_Help:
+ return kVK_Help;
+
+ case Qt::Key_F1:
+ return kVK_F1;
+ case Qt::Key_F2:
+ return kVK_F2;
+ case Qt::Key_F3:
+ return kVK_F3;
+ case Qt::Key_F4:
+ return kVK_F4;
+ case Qt::Key_F5:
+ return kVK_F5;
+ case Qt::Key_F6:
+ return kVK_F6;
+ case Qt::Key_F7:
+ return kVK_F7;
+ case Qt::Key_F8:
+ return kVK_F8;
+ case Qt::Key_F9:
+ return kVK_F9;
+ case Qt::Key_F10:
+ return kVK_F10;
+ case Qt::Key_F11:
+ return kVK_F11;
+ case Qt::Key_F12:
+ return kVK_F12;
+ case Qt::Key_F13:
+ return kVK_F13;
+ case Qt::Key_F14:
+ return kVK_F14;
+ case Qt::Key_F15:
+ return kVK_F15;
+ case Qt::Key_F16:
+ return kVK_F16;
+
+ default:
+ return INVALID_KEYCODE;
}
}
-//
-// Translate qt key modifiers to mac os modifiers
-// see: https://doc.qt.io/qt-5/osx-issues.html#special-keys
-//
-CGEventFlags AutoTypePlatformMac::qtToNativeModifiers(Qt::KeyboardModifiers modifiers, bool native)
+/**
+ * Translate Qt key modifiers to macOS key modifiers
+ * provided by the Core Graphics component
+ *
+ * @param modifiers Qt keyboard modifier(s)
+ * @returns macOS key modifier(s)
+ */
+CGEventFlags AutoTypePlatformMac::qtToNativeModifiers(Qt::KeyboardModifiers modifiers)
{
- CGEventFlags nativeModifiers = CGEventFlags(0);
-
- CGEventFlags shiftMod = CGEventFlags(shiftKey);
- CGEventFlags cmdMod = CGEventFlags(cmdKey);
- CGEventFlags optionMod = CGEventFlags(optionKey);
- CGEventFlags controlMod = CGEventFlags(controlKey);
-
- if (native) {
- shiftMod = kCGEventFlagMaskShift;
- cmdMod = kCGEventFlagMaskCommand;
- optionMod = kCGEventFlagMaskAlternate;
- controlMod = kCGEventFlagMaskControl;
- }
-
+ auto nativeModifiers = CGEventFlags(0);
if (modifiers & Qt::ShiftModifier) {
- nativeModifiers = CGEventFlags(nativeModifiers | shiftMod);
+ nativeModifiers = CGEventFlags(nativeModifiers | kCGEventFlagMaskShift);
}
if (modifiers & Qt::ControlModifier) {
- nativeModifiers = CGEventFlags(nativeModifiers | cmdMod);
+ nativeModifiers = CGEventFlags(nativeModifiers | kCGEventFlagMaskCommand);
}
if (modifiers & Qt::AltModifier) {
- nativeModifiers = CGEventFlags(nativeModifiers | optionMod);
+ nativeModifiers = CGEventFlags(nativeModifiers | kCGEventFlagMaskAlternate);
}
if (modifiers & Qt::MetaModifier) {
- nativeModifiers = CGEventFlags(nativeModifiers | controlMod);
+ nativeModifiers = CGEventFlags(nativeModifiers | kCGEventFlagMaskControl);
}
return nativeModifiers;
}
-//
-// Get window layer/level
-//
+/**
+ * Get window layer / level
+ *
+ * @param window macOS window ref
+ * @returns layer number or -1 if window not found
+ */
int AutoTypePlatformMac::windowLayer(CFDictionaryRef window)
{
int layer;
- CFNumberRef layerRef = static_cast<CFNumberRef>(::CFDictionaryGetValue(window, kCGWindowLayer));
- if (layerRef != nullptr
- && ::CFNumberGetValue(layerRef, kCFNumberIntType, &layer)) {
+ auto layerRef = static_cast<CFNumberRef>(::CFDictionaryGetValue(window, kCGWindowLayer));
+ if (layerRef && ::CFNumberGetValue(layerRef, kCFNumberIntType, &layer)) {
return layer;
}
return -1;
}
-//
-// Get window title
-//
+/**
+ * Get window title for macOS window ref
+ *
+ * @param window macOS window ref
+ * @returns window title if found
+ */
QString AutoTypePlatformMac::windowTitle(CFDictionaryRef window)
{
char buffer[MAX_WINDOW_TITLE_LENGTH];
QString title;
- CFStringRef titleRef = static_cast<CFStringRef>(::CFDictionaryGetValue(window, kCGWindowName));
- if (titleRef != nullptr
- && ::CFStringGetCString(titleRef, buffer, MAX_WINDOW_TITLE_LENGTH, kCFStringEncodingUTF8)) {
+ auto titleRef = static_cast<CFStringRef>(::CFDictionaryGetValue(window, kCGWindowName));
+ if (titleRef && ::CFStringGetCString(titleRef, buffer, MAX_WINDOW_TITLE_LENGTH, kCFStringEncodingUTF8)) {
title = QString::fromUtf8(buffer);
}
@@ -464,24 +491,6 @@ QString AutoTypePlatformMac::windowTitle(CFDictionaryRef window)
}
//
-// Carbon hotkey handler
-//
-OSStatus AutoTypePlatformMac::hotkeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData)
-{
- Q_UNUSED(nextHandler);
-
- AutoTypePlatformMac *self = static_cast<AutoTypePlatformMac *>(userData);
- EventHotKeyID hotkeyId;
-
- if (::GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, nullptr, sizeof(hotkeyId), nullptr, &hotkeyId) == noErr
- && hotkeyId.id == HOTKEY_ID) {
- emit self->globalShortcutTriggered();
- }
-
- return noErr;
-}
-
-//
// ------------------------------ AutoTypeExecutorMac ------------------------------
//
@@ -502,7 +511,7 @@ void AutoTypeExecutorMac::execKey(AutoTypeKey* action)
m_platform->sendKey(action->key, false);
}
-void AutoTypeExecutorMac::execClearField(AutoTypeClearField* action = nullptr)
+void AutoTypeExecutorMac::execClearField(AutoTypeClearField* action)
{
Q_UNUSED(action);
diff --git a/src/autotype/mac/AutoTypeMac.h b/src/autotype/mac/AutoTypeMac.h
index 55963da51..904046e33 100644
--- a/src/autotype/mac/AutoTypeMac.h
+++ b/src/autotype/mac/AutoTypeMac.h
@@ -19,12 +19,12 @@
#ifndef KEEPASSX_AUTOTYPEMAC_H
#define KEEPASSX_AUTOTYPEMAC_H
-#include <Carbon/Carbon.h>
+#include <ApplicationServices/ApplicationServices.h>
#include <QtPlugin>
#include <memory>
-#include "autotype/AutoTypePlatformPlugin.h"
#include "autotype/AutoTypeAction.h"
+#include "autotype/AutoTypePlatformPlugin.h"
class AutoTypePlatformMac : public QObject, public AutoTypePlatformInterface
{
@@ -48,20 +48,19 @@ public:
bool raiseOwnWindow() override;
void sendChar(const QChar& ch, bool isKeyDown);
- void sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers);
+ void sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers = 0);
signals:
void globalShortcutTriggered();
private:
- EventHotKeyRef m_hotkeyRef;
- EventHotKeyID m_hotkeyId;
-
- static uint16 qtToNativeKeyCode(Qt::Key key);
- static CGEventFlags qtToNativeModifiers(Qt::KeyboardModifiers modifiers, bool native);
+ static void hotkeyHandler(void* userData);
+ static CGKeyCode qtToNativeKeyCode(Qt::Key key);
+ static CGEventFlags qtToNativeModifiers(Qt::KeyboardModifiers modifiers);
static int windowLayer(CFDictionaryRef window);
static QString windowTitle(CFDictionaryRef window);
- static OSStatus hotkeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData);
+
+ void* m_globalMonitor;
};
class AutoTypeExecutorMac : public AutoTypeExecutor
@@ -77,4 +76,4 @@ private:
AutoTypePlatformMac* const m_platform;
};
-#endif // KEEPASSX_AUTOTYPEMAC_H
+#endif // KEEPASSX_AUTOTYPEMAC_H
diff --git a/src/autotype/mac/AutoTypeMacKeyCodes.h b/src/autotype/mac/AutoTypeMacKeyCodes.h
new file mode 100644
index 000000000..c89cf0346
--- /dev/null
+++ b/src/autotype/mac/AutoTypeMacKeyCodes.h
@@ -0,0 +1,160 @@
+//
+// Taken from HIToolbox/Events.h
+//
+
+/*
+ * Summary:
+ * Virtual keycodes
+ *
+ * Discussion:
+ * These constants are the virtual keycodes defined originally in
+ * Inside Mac Volume V, pg. V-191. They identify physical keys on a
+ * keyboard. Those constants with "ANSI" in the name are labeled
+ * according to the key position on an ANSI-standard US keyboard.
+ * For example, kVK_ANSI_A indicates the virtual keycode for the key
+ * with the letter 'A' in the US keyboard layout. Other keyboard
+ * layouts may have the 'A' key label on a different physical key;
+ * in this case, pressing 'A' will generate a different virtual
+ * keycode.
+ */
+
+#ifndef KEEPASSXC_AUTOTYPEMAC_KEYCODES_H
+#define KEEPASSXC_AUTOTYPEMAC_KEYCODES_H
+
+// clang-format off
+enum {
+ kVK_ANSI_A = 0x00,
+ kVK_ANSI_S = 0x01,
+ kVK_ANSI_D = 0x02,
+ kVK_ANSI_F = 0x03,
+ kVK_ANSI_H = 0x04,
+ kVK_ANSI_G = 0x05,
+ kVK_ANSI_Z = 0x06,
+ kVK_ANSI_X = 0x07,
+ kVK_ANSI_C = 0x08,
+ kVK_ANSI_V = 0x09,
+ kVK_ANSI_B = 0x0B,
+ kVK_ANSI_Q = 0x0C,
+ kVK_ANSI_W = 0x0D,
+ kVK_ANSI_E = 0x0E,
+ kVK_ANSI_R = 0x0F,
+ kVK_ANSI_Y = 0x10,
+ kVK_ANSI_T = 0x11,
+ kVK_ANSI_1 = 0x12,
+ kVK_ANSI_2 = 0x13,
+ kVK_ANSI_3 = 0x14,
+ kVK_ANSI_4 = 0x15,
+ kVK_ANSI_6 = 0x16,
+ kVK_ANSI_5 = 0x17,
+ kVK_ANSI_Equal = 0x18,
+ kVK_ANSI_9 = 0x19,
+ kVK_ANSI_7 = 0x1A,
+ kVK_ANSI_Minus = 0x1B,
+ kVK_ANSI_8 = 0x1C,
+ kVK_ANSI_0 = 0x1D,
+ kVK_ANSI_RightBracket = 0x1E,
+ kVK_ANSI_O = 0x1F,
+ kVK_ANSI_U = 0x20,
+ kVK_ANSI_LeftBracket = 0x21,
+ kVK_ANSI_I = 0x22,
+ kVK_ANSI_P = 0x23,
+ kVK_ANSI_L = 0x25,
+ kVK_ANSI_J = 0x26,
+ kVK_ANSI_Quote = 0x27,
+ kVK_ANSI_K = 0x28,
+ kVK_ANSI_Semicolon = 0x29,
+ kVK_ANSI_Backslash = 0x2A,
+ kVK_ANSI_Comma = 0x2B,
+ kVK_ANSI_Slash = 0x2C,
+ kVK_ANSI_N = 0x2D,
+ kVK_ANSI_M = 0x2E,
+ kVK_ANSI_Period = 0x2F,
+ kVK_ANSI_Grave = 0x32,
+ kVK_ANSI_KeypadDecimal = 0x41,
+ kVK_ANSI_KeypadMultiply = 0x43,
+ kVK_ANSI_KeypadPlus = 0x45,
+ kVK_ANSI_KeypadClear = 0x47,
+ kVK_ANSI_KeypadDivide = 0x4B,
+ kVK_ANSI_KeypadEnter = 0x4C,
+ kVK_ANSI_KeypadMinus = 0x4E,
+ kVK_ANSI_KeypadEquals = 0x51,
+ kVK_ANSI_Keypad0 = 0x52,
+ kVK_ANSI_Keypad1 = 0x53,
+ kVK_ANSI_Keypad2 = 0x54,
+ kVK_ANSI_Keypad3 = 0x55,
+ kVK_ANSI_Keypad4 = 0x56,
+ kVK_ANSI_Keypad5 = 0x57,
+ kVK_ANSI_Keypad6 = 0x58,
+ kVK_ANSI_Keypad7 = 0x59,
+ kVK_ANSI_Keypad8 = 0x5B,
+ kVK_ANSI_Keypad9 = 0x5C
+};
+
+/* keycodes for keys that are independent of keyboard layout*/
+enum {
+ kVK_Return = 0x24,
+ kVK_Tab = 0x30,
+ kVK_Space = 0x31,
+ kVK_Delete = 0x33,
+ kVK_Escape = 0x35,
+ kVK_Command = 0x37,
+ kVK_Shift = 0x38,
+ kVK_CapsLock = 0x39,
+ kVK_Option = 0x3A,
+ kVK_Control = 0x3B,
+ kVK_RightCommand = 0x36,
+ kVK_RightShift = 0x3C,
+ kVK_RightOption = 0x3D,
+ kVK_RightControl = 0x3E,
+ kVK_Function = 0x3F,
+ kVK_F17 = 0x40,
+ kVK_VolumeUp = 0x48,
+ kVK_VolumeDown = 0x49,
+ kVK_Mute = 0x4A,
+ kVK_F18 = 0x4F,
+ kVK_F19 = 0x50,
+ kVK_F20 = 0x5A,
+ kVK_F5 = 0x60,
+ kVK_F6 = 0x61,
+ kVK_F7 = 0x62,
+ kVK_F3 = 0x63,
+ kVK_F8 = 0x64,
+ kVK_F9 = 0x65,
+ kVK_F11 = 0x67,
+ kVK_F13 = 0x69,
+ kVK_F16 = 0x6A,
+ kVK_F14 = 0x6B,
+ kVK_F10 = 0x6D,
+ kVK_F12 = 0x6F,
+ kVK_F15 = 0x71,
+ kVK_Help = 0x72,
+ kVK_Home = 0x73,
+ kVK_PageUp = 0x74,
+ kVK_ForwardDelete = 0x75,
+ kVK_F4 = 0x76,
+ kVK_End = 0x77,
+ kVK_F2 = 0x78,
+ kVK_PageDown = 0x79,
+ kVK_F1 = 0x7A,
+ kVK_LeftArrow = 0x7B,
+ kVK_RightArrow = 0x7C,
+ kVK_DownArrow = 0x7D,
+ kVK_UpArrow = 0x7E
+};
+
+/* ISO keyboards only*/
+enum {
+ kVK_ISO_Section = 0x0A
+};
+
+/* JIS keyboards only*/
+enum {
+ kVK_JIS_Yen = 0x5D,
+ kVK_JIS_Underscore = 0x5E,
+ kVK_JIS_KeypadComma = 0x5F,
+ kVK_JIS_Eisu = 0x66,
+ kVK_JIS_Kana = 0x68
+};
+// clang-format on
+
+#endif
diff --git a/src/autotype/mac/CMakeLists.txt b/src/autotype/mac/CMakeLists.txt
index 7427450a1..0179b4a0c 100644
--- a/src/autotype/mac/CMakeLists.txt
+++ b/src/autotype/mac/CMakeLists.txt
@@ -1,7 +1,7 @@
set(autotype_mac_SOURCES AutoTypeMac.cpp)
add_library(keepassx-autotype-cocoa MODULE ${autotype_mac_SOURCES})
-set_target_properties(keepassx-autotype-cocoa PROPERTIES LINK_FLAGS "-framework Foundation -framework AppKit -framework Carbon")
+set_target_properties(keepassx-autotype-cocoa PROPERTIES LINK_FLAGS "-framework Foundation -framework AppKit")
target_link_libraries(keepassx-autotype-cocoa ${PROGNAME} Qt5::Core Qt5::Widgets)
if(WITH_APP_BUNDLE)
diff --git a/src/browser/BrowserAccessControlDialog.cpp b/src/browser/BrowserAccessControlDialog.cpp
index 9a10e555f..2571610eb 100644
--- a/src/browser/BrowserAccessControlDialog.cpp
+++ b/src/browser/BrowserAccessControlDialog.cpp
@@ -59,3 +59,8 @@ void BrowserAccessControlDialog::setRemember(bool r)
{
m_ui->rememberDecisionCheckBox->setChecked(r);
}
+
+void BrowserAccessControlDialog::setHTTPAuth(bool httpAuth)
+{
+ m_ui->rememberDecisionCheckBox->setVisible(!httpAuth);
+}
diff --git a/src/browser/BrowserAccessControlDialog.h b/src/browser/BrowserAccessControlDialog.h
index 4c93a54fc..79aba9c4b 100644
--- a/src/browser/BrowserAccessControlDialog.h
+++ b/src/browser/BrowserAccessControlDialog.h
@@ -41,6 +41,7 @@ public:
void setItems(const QList<Entry*>& items);
bool remember() const;
void setRemember(bool r);
+ void setHTTPAuth(bool httpAuth);
private:
QScopedPointer<Ui::BrowserAccessControlDialog> m_ui;
diff --git a/src/browser/BrowserAccessControlDialog.ui b/src/browser/BrowserAccessControlDialog.ui
index 29715314d..55914bfec 100755
--- a/src/browser/BrowserAccessControlDialog.ui
+++ b/src/browser/BrowserAccessControlDialog.ui
@@ -48,6 +48,9 @@
</item>
<item>
<widget class="QPushButton" name="allowButton">
+ <property name="accessibleName">
+ <string>Allow access</string>
+ </property>
<property name="text">
<string>Allow</string>
</property>
@@ -55,6 +58,9 @@
</item>
<item>
<widget class="QPushButton" name="denyButton">
+ <property name="accessibleName">
+ <string>Deny access</string>
+ </property>
<property name="text">
<string>Deny</string>
</property>
diff --git a/src/browser/BrowserAction.cpp b/src/browser/BrowserAction.cpp
index 1a4cbf5ec..20b2fc975 100644
--- a/src/browser/BrowserAction.cpp
+++ b/src/browser/BrowserAction.cpp
@@ -149,6 +149,16 @@ QJsonObject BrowserAction::handleGetDatabaseHash(const QJsonObject& json, const
QJsonObject message = buildMessage(newNonce);
message["hash"] = hash;
+
+ // Update a legacy database hash if found
+ const QJsonArray hashes = decrypted.value("connectedKeys").toArray();
+ if (!hashes.isEmpty()) {
+ const QString legacyHash = getLegacyDatabaseHash();
+ if (hashes.contains(legacyHash)) {
+ message["oldHash"] = legacyHash;
+ }
+ }
+
return buildResponse(action, message, newNonce);
}
@@ -278,18 +288,18 @@ QJsonObject BrowserAction::handleGetLogins(const QJsonObject& json, const QStrin
QJsonObject BrowserAction::handleGeneratePassword(const QJsonObject& json, const QString& action)
{
- const QString nonce = json.value("nonce").toString();
- const QString password = browserSettings()->generatePassword();
+ auto nonce = json.value("nonce").toString();
+ auto password = browserSettings()->generatePassword();
if (nonce.isEmpty() || password.isEmpty()) {
return QJsonObject();
}
+ // For backwards compatibility
+ password["login"] = password["entropy"];
+
QJsonArray arr;
- QJsonObject passwd;
- passwd["login"] = QString::number(password.length() * 8); // bits;
- passwd["password"] = password;
- arr.append(passwd);
+ arr.append(password);
const QString newNonce = incrementNonce(nonce);
@@ -329,10 +339,11 @@ QJsonObject BrowserAction::handleSetLogin(const QJsonObject& json, const QString
const QString groupUuid = decrypted.value("groupUuid").toString();
const QString realm;
+ BrowserService::ReturnValue result = BrowserService::ReturnValue::Success;
if (uuid.isEmpty()) {
m_browserService.addEntry(id, login, password, url, submitUrl, realm, group, groupUuid);
} else {
- m_browserService.updateEntry(id, uuid, login, password, url, submitUrl);
+ result = m_browserService.updateEntry(id, uuid, login, password, url, submitUrl);
}
const QString newNonce = incrementNonce(nonce);
@@ -340,7 +351,7 @@ QJsonObject BrowserAction::handleSetLogin(const QJsonObject& json, const QString
QJsonObject message = buildMessage(newNonce);
message["count"] = QJsonValue::Null;
message["entries"] = QJsonValue::Null;
- message["error"] = "";
+ message["error"] = getReturnValue(result);
message["hash"] = hash;
return buildResponse(action, message, newNonce);
@@ -513,10 +524,31 @@ QString BrowserAction::getErrorMessage(const int errorCode) const
}
}
+QString BrowserAction::getReturnValue(const BrowserService::ReturnValue returnValue) const
+{
+ switch (returnValue) {
+ case BrowserService::ReturnValue::Success:
+ return QString("success");
+ case BrowserService::ReturnValue::Error:
+ return QString("error");
+ case BrowserService::ReturnValue::Canceled:
+ return QString("canceled");
+ }
+ return QString("error");
+}
+
QString BrowserAction::getDatabaseHash()
{
QMutexLocker locker(&m_mutex);
QByteArray hash =
+ QCryptographicHash::hash(m_browserService.getDatabaseRootUuid().toUtf8(), QCryptographicHash::Sha256).toHex();
+ return QString(hash);
+}
+
+QString BrowserAction::getLegacyDatabaseHash()
+{
+ QMutexLocker locker(&m_mutex);
+ QByteArray hash =
QCryptographicHash::hash(
(m_browserService.getDatabaseRootUuid() + m_browserService.getDatabaseRecycleBinUuid()).toUtf8(),
QCryptographicHash::Sha256)
diff --git a/src/browser/BrowserAction.h b/src/browser/BrowserAction.h
index 3c8df5ffc..a8af0915e 100644
--- a/src/browser/BrowserAction.h
+++ b/src/browser/BrowserAction.h
@@ -73,7 +73,9 @@ private:
QJsonObject buildResponse(const QString& action, const QJsonObject& message, const QString& nonce);
QJsonObject getErrorReply(const QString& action, const int errorCode) const;
QString getErrorMessage(const int errorCode) const;
+ QString getReturnValue(const BrowserService::ReturnValue returnValue) const;
QString getDatabaseHash();
+ QString getLegacyDatabaseHash();
QString encryptMessage(const QJsonObject& message, const QString& nonce);
QJsonObject decryptMessage(const QString& message, const QString& nonce);
diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp
index e212fc6b4..a5bb921da 100644
--- a/src/browser/BrowserOptionDialog.cpp
+++ b/src/browser/BrowserOptionDialog.cpp
@@ -45,7 +45,7 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent)
m_ui->extensionLabel->setOpenExternalLinks(true);
m_ui->extensionLabel->setText(
tr("KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2. %3")
- .arg("<a href=\"https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/\">Firefox</a>",
+ .arg("<a href=\"https://addons.mozilla.org/firefox/addon/keepassxc-browser/\">Firefox</a>",
"<a href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\">"
"Google Chrome / Chromium / Vivaldi / Brave</a>",
snapInstructions));
@@ -53,12 +53,6 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent)
m_ui->scriptWarningWidget->setVisible(false);
m_ui->scriptWarningWidget->setAutoHideTimeout(-1);
- m_ui->scriptWarningWidget->showMessage(
- tr("<b>Warning</b>, the keepassxc-proxy application was not found!"
- "<br />Please check the KeePassXC installation directory or confirm the custom path in advanced options."
- "<br />Browser integration WILL NOT WORK without the proxy application."
- "<br />Expected Path: "),
- MessageWidget::Warning);
m_ui->warningWidget->showMessage(tr("<b>Warning:</b> The following options can be dangerous!"),
MessageWidget::Warning);
@@ -116,6 +110,7 @@ void BrowserOptionDialog::loadSettings()
m_ui->httpAuthPermission->setChecked(settings->httpAuthPermission());
m_ui->searchInAllDatabases->setChecked(settings->searchInAllDatabases());
m_ui->supportKphFields->setChecked(settings->supportKphFields());
+ m_ui->noMigrationPrompt->setChecked(settings->noMigrationPrompt());
m_ui->supportBrowserProxy->setChecked(settings->supportBrowserProxy());
m_ui->useCustomProxy->setChecked(settings->useCustomProxy());
m_ui->customProxyLocation->setText(settings->customProxyLocation());
@@ -153,9 +148,13 @@ void BrowserOptionDialog::loadSettings()
// Check for native messaging host location errors
QString path;
if (!settings->checkIfProxyExists(path)) {
- QString text = m_ui->scriptWarningWidget->text();
- text.append(path);
- m_ui->scriptWarningWidget->setText(text);
+ auto text =
+ tr("<b>Warning</b>, the keepassxc-proxy application was not found!"
+ "<br />Please check the KeePassXC installation directory or confirm the custom path in advanced options."
+ "<br />Browser integration WILL NOT WORK without the proxy application."
+ "<br />Expected Path: %1")
+ .arg(path);
+ m_ui->scriptWarningWidget->showMessage(text, MessageWidget::Warning);
m_ui->scriptWarningWidget->setVisible(true);
} else {
m_ui->scriptWarningWidget->setVisible(false);
@@ -183,6 +182,7 @@ void BrowserOptionDialog::saveSettings()
settings->setHttpAuthPermission(m_ui->httpAuthPermission->isChecked());
settings->setSearchInAllDatabases(m_ui->searchInAllDatabases->isChecked());
settings->setSupportKphFields(m_ui->supportKphFields->isChecked());
+ settings->setNoMigrationPrompt(m_ui->noMigrationPrompt->isChecked());
settings->setChromeSupport(m_ui->chromeSupport->isChecked());
settings->setChromiumSupport(m_ui->chromiumSupport->isChecked());
diff --git a/src/browser/BrowserOptionDialog.ui b/src/browser/BrowserOptionDialog.ui
index 0229649f1..638c400aa 100755
--- a/src/browser/BrowserOptionDialog.ui
+++ b/src/browser/BrowserOptionDialog.ui
@@ -35,7 +35,7 @@
<string>This is required for accessing your databases with KeePassXC-Browser</string>
</property>
<property name="text">
- <string>Enable KeepassXC browser integration</string>
+ <string>Enable browser integration</string>
</property>
</widget>
</item>
@@ -60,6 +60,13 @@
</widget>
</item>
<item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Browsers installed as snaps are currently not supported.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLabel" name="extensionLabel"/>
</item>
<item>
@@ -297,7 +304,7 @@
<item>
<widget class="QCheckBox" name="searchInAllDatabases">
<property name="toolTip">
- <string>Only the selected database has to be connected with a client.</string>
+ <string>All databases connected to the extension will return matching credentials.</string>
</property>
<property name="text">
<string extracomment="Credentials mean login data requested via browser extension">Searc&amp;h in all opened databases for matching credentials</string>
@@ -315,6 +322,16 @@
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="noMigrationPrompt">
+ <property name="toolTip">
+ <string>Don't display the popup suggesting migration of legacy KeePassHTTP settings.</string>
+ </property>
+ <property name="text">
+ <string>&amp;Do not prompt for KeePassHTTP settings migration.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QCheckBox" name="updateBinaryPath">
<property name="toolTip">
<string>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</string>
@@ -348,6 +365,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="customProxyLocation">
+ <property name="accessibleName">
+ <string>Custom proxy location field</string>
+ </property>
<property name="maxLength">
<number>999</number>
</property>
@@ -358,6 +378,9 @@
</item>
<item>
<widget class="QPushButton" name="customProxyLocationBrowseButton">
+ <property name="accessibleName">
+ <string>Browser for custom proxy file</string>
+ </property>
<property name="text">
<string extracomment="Button for opening file dialog">Browse...</string>
</property>
diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp
index 3916b99ad..2e5088c8a 100644
--- a/src/browser/BrowserService.cpp
+++ b/src/browser/BrowserService.cpp
@@ -17,6 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <QCheckBox>
#include <QInputDialog>
#include <QJsonArray>
#include <QMessageBox>
@@ -40,15 +41,20 @@
#include "gui/macutils/MacUtils.h"
#endif
-const char BrowserService::KEEPASSXCBROWSER_NAME[] = "KeePassXC-Browser Settings";
-const char BrowserService::KEEPASSXCBROWSER_OLD_NAME[] = "keepassxc-browser Settings";
-const char BrowserService::ASSOCIATE_KEY_PREFIX[] = "KPXC_BROWSER_";
-static const char KEEPASSXCBROWSER_GROUP_NAME[] = "KeePassXC-Browser Passwords";
+const QString BrowserService::KEEPASSXCBROWSER_NAME = QStringLiteral("KeePassXC-Browser Settings");
+const QString BrowserService::KEEPASSXCBROWSER_OLD_NAME = QStringLiteral("keepassxc-browser Settings");
+const QString BrowserService::ASSOCIATE_KEY_PREFIX = QStringLiteral("KPXC_BROWSER_");
+static const QString KEEPASSXCBROWSER_GROUP_NAME = QStringLiteral("KeePassXC-Browser Passwords");
static int KEEPASSXCBROWSER_DEFAULT_ICON = 1;
// These are for the settings and password conversion
-const char BrowserService::LEGACY_ASSOCIATE_KEY_PREFIX[] = "Public Key: ";
-static const char KEEPASSHTTP_NAME[] = "KeePassHttp Settings";
-static const char KEEPASSHTTP_GROUP_NAME[] = "KeePassHttp Passwords";
+const QString BrowserService::LEGACY_ASSOCIATE_KEY_PREFIX = QStringLiteral("Public Key: ");
+static const QString KEEPASSHTTP_NAME = QStringLiteral("KeePassHttp Settings");
+static const QString KEEPASSHTTP_GROUP_NAME = QStringLiteral("KeePassHttp Passwords");
+// Extra entry related options saved in custom data
+const QString BrowserService::OPTION_SKIP_AUTO_SUBMIT = QStringLiteral("BrowserSkipAutoSubmit");
+const QString BrowserService::OPTION_HIDE_ENTRY = QStringLiteral("BrowserHideEntry");
+// Multiple URL's
+const QString BrowserService::ADDITIONAL_URL = QStringLiteral("KP2A_URL");
BrowserService::BrowserService(DatabaseTabWidget* parent)
: m_dbTabWidget(parent)
@@ -298,9 +304,9 @@ QString BrowserService::storeKey(const QString& key)
QInputDialog keyDialog;
connect(m_dbTabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), &keyDialog, SLOT(reject()));
keyDialog.setWindowTitle(tr("KeePassXC: New key association request"));
- keyDialog.setLabelText(tr("You have received an association request for the above key.\n\n"
- "If you would like to allow it access to your KeePassXC database,\n"
- "give it a unique name to identify and accept it."));
+ keyDialog.setLabelText(tr("You have received an association request for the following database:\n%1\n\n"
+ "Give the connection a unique name or ID, for example:\nchrome-laptop.")
+ .arg(db->metadata()->name().toHtmlEscaped()));
keyDialog.setOkButtonText(tr("Save and allow access"));
keyDialog.setWindowFlags(keyDialog.windowFlags() | Qt::WindowStaysOnTopHint);
raiseWindow();
@@ -316,7 +322,7 @@ QString BrowserService::storeKey(const QString& key)
return {};
}
- contains = db->metadata()->customData()->contains(QLatin1String(ASSOCIATE_KEY_PREFIX) + id);
+ contains = db->metadata()->customData()->contains(ASSOCIATE_KEY_PREFIX + id);
if (contains) {
dialogResult = MessageBox::warning(nullptr,
tr("KeePassXC: Overwrite existing key?"),
@@ -329,7 +335,7 @@ QString BrowserService::storeKey(const QString& key)
} while (contains && dialogResult == MessageBox::Cancel);
hideWindow();
- db->metadata()->customData()->set(QLatin1String(ASSOCIATE_KEY_PREFIX) + id, key);
+ db->metadata()->customData()->set(ASSOCIATE_KEY_PREFIX + id, key);
return id;
}
@@ -340,7 +346,7 @@ QString BrowserService::getKey(const QString& id)
return {};
}
- return db->metadata()->customData()->value(QLatin1String(ASSOCIATE_KEY_PREFIX) + id);
+ return db->metadata()->customData()->value(ASSOCIATE_KEY_PREFIX + id);
}
QJsonArray BrowserService::findMatchingEntries(const QString& id,
@@ -373,7 +379,12 @@ QJsonArray BrowserService::findMatchingEntries(const QString& id,
// Check entries for authorization
QList<Entry*> pwEntriesToConfirm;
QList<Entry*> pwEntries;
- for (Entry* entry : searchEntries(url, keyList)) {
+ for (auto* entry : searchEntries(url, keyList)) {
+ if (entry->customData()->contains(BrowserService::OPTION_HIDE_ENTRY)
+ && entry->customData()->value(BrowserService::OPTION_HIDE_ENTRY) == "true") {
+ continue;
+ }
+
// HTTP Basic Auth always needs a confirmation
if (!ignoreHttpAuth && httpAuth) {
pwEntriesToConfirm.append(entry);
@@ -399,7 +410,7 @@ QJsonArray BrowserService::findMatchingEntries(const QString& id,
}
// Confirm entries
- if (confirmEntries(pwEntriesToConfirm, url, host, submitHost, realm)) {
+ if (confirmEntries(pwEntriesToConfirm, url, host, submitUrl, realm, httpAuth)) {
pwEntries.append(pwEntriesToConfirm);
}
@@ -416,8 +427,8 @@ QJsonArray BrowserService::findMatchingEntries(const QString& id,
pwEntries = sortEntries(pwEntries, host, submitUrl);
// Fill the list
- for (Entry* entry : pwEntries) {
- result << prepareEntry(entry);
+ for (auto* entry : pwEntries) {
+ result.append(prepareEntry(entry));
}
return result;
@@ -489,17 +500,19 @@ void BrowserService::addEntry(const QString& id,
config.save(entry);
}
-void BrowserService::updateEntry(const QString& id,
- const QString& uuid,
- const QString& login,
- const QString& password,
- const QString& url,
- const QString& submitUrl)
+BrowserService::ReturnValue BrowserService::updateEntry(const QString& id,
+ const QString& uuid,
+ const QString& login,
+ const QString& password,
+ const QString& url,
+ const QString& submitUrl)
{
+ ReturnValue result = ReturnValue::Error;
if (thread() != QThread::currentThread()) {
QMetaObject::invokeMethod(this,
"updateEntry",
Qt::BlockingQueuedConnection,
+ Q_RETURN_ARG(ReturnValue, result),
Q_ARG(QString, id),
Q_ARG(QString, uuid),
Q_ARG(QString, login),
@@ -510,14 +523,14 @@ void BrowserService::updateEntry(const QString& id,
auto db = selectedDatabase();
if (!db) {
- return;
+ return ReturnValue::Error;
}
Entry* entry = db->rootGroup()->findEntryByUuid(Tools::hexToUuid(uuid));
if (!entry) {
// If entry is not found for update, add a new one to the selected database
addEntry(id, login, password, url, submitUrl, "", "", "", db);
- return;
+ return ReturnValue::Success;
}
// Check if the entry password is a reference. If so, update the original entry instead
@@ -526,14 +539,14 @@ void BrowserService::updateEntry(const QString& id,
if (!referenceUuid.isNull()) {
entry = db->rootGroup()->findEntryByUuid(referenceUuid);
if (!entry) {
- return;
+ return ReturnValue::Error;
}
}
}
QString username = entry->username();
if (username.isEmpty()) {
- return;
+ return ReturnValue::Error;
}
if (username.compare(login, Qt::CaseSensitive) != 0
@@ -557,10 +570,15 @@ void BrowserService::updateEntry(const QString& id,
}
entry->setPassword(password);
entry->endUpdate();
+ result = ReturnValue::Success;
+ } else {
+ result = ReturnValue::Canceled;
}
hideWindow();
}
+
+ return result;
}
QList<Entry*>
@@ -572,22 +590,30 @@ BrowserService::searchEntries(const QSharedPointer<Database>& db, const QString&
return entries;
}
- for (Entry* entry : EntrySearcher().search(baseDomain(hostname), rootGroup)) {
- QString entryUrl = entry->url();
- QUrl entryQUrl(entryUrl);
- QString entryScheme = entryQUrl.scheme();
- QUrl qUrl(url);
-
- // Ignore entry if port or scheme defined in the URL doesn't match
- if ((entryQUrl.port() > 0 && entryQUrl.port() != qUrl.port())
- || (browserSettings()->matchUrlScheme() && !entryScheme.isEmpty()
- && entryScheme.compare(qUrl.scheme()) != 0)) {
+ for (const auto& group : rootGroup->groupsRecursive(true)) {
+ if (group->isRecycled() || !group->resolveSearchingEnabled()) {
continue;
}
- // Filter to match hostname in URL field
- if ((!entryUrl.isEmpty() && hostname.contains(entryUrl))
- || (matchUrlScheme(entryUrl) && hostname.endsWith(entryQUrl.host()))) {
+ for (auto* entry : group->entries()) {
+ if (entry->isRecycled()) {
+ continue;
+ }
+
+ // Search for additional URL's starting with KP2A_URL
+ if (entry->attributes()->keys().contains(ADDITIONAL_URL)) {
+ for (const auto& key : entry->attributes()->keys()) {
+ if (key.startsWith(ADDITIONAL_URL) && handleURL(entry->attributes()->value(key), hostname, url)) {
+ entries.append(entry);
+ continue;
+ }
+ }
+ }
+
+ if (!handleURL(entry->url(), hostname, url)) {
+ continue;
+ }
+
entries.append(entry);
}
}
@@ -597,6 +623,17 @@ BrowserService::searchEntries(const QSharedPointer<Database>& db, const QString&
QList<Entry*> BrowserService::searchEntries(const QString& url, const StringPairList& keyList)
{
+ // Check if database is connected with KeePassXC-Browser
+ auto databaseConnected = [&](const QSharedPointer<Database>& db) {
+ for (const StringPair& keyPair : keyList) {
+ QString key = db->metadata()->customData()->value(ASSOCIATE_KEY_PREFIX + keyPair.first);
+ if (!key.isEmpty() && keyPair.second == key) {
+ return true;
+ }
+ }
+ return false;
+ };
+
// Get the list of databases to search
QList<QSharedPointer<Database>> databases;
if (browserSettings()->searchInAllDatabases()) {
@@ -604,19 +641,16 @@ QList<Entry*> BrowserService::searchEntries(const QString& url, const StringPair
for (int i = 0; i < count; ++i) {
if (auto* dbWidget = qobject_cast<DatabaseWidget*>(m_dbTabWidget->widget(i))) {
if (const auto& db = dbWidget->database()) {
- // Check if database is connected with KeePassXC-Browser
- for (const StringPair& keyPair : keyList) {
- QString key =
- db->metadata()->customData()->value(QLatin1String(ASSOCIATE_KEY_PREFIX) + keyPair.first);
- if (!key.isEmpty() && keyPair.second == key) {
- databases << db;
- }
+ if (databaseConnected(db)) {
+ databases << db;
}
}
}
}
} else if (const auto& db = getDatabase()) {
- databases << db;
+ if (databaseConnected(db)) {
+ databases << db;
+ }
}
// Search entries matching the hostname
@@ -644,7 +678,7 @@ void BrowserService::convertAttributesToCustomData(const QSharedPointer<Database
int counter = 0;
int keyCounter = 0;
- for (Entry* entry : entries) {
+ for (auto* entry : entries) {
if (progress.wasCanceled()) {
return;
}
@@ -697,12 +731,9 @@ void BrowserService::convertAttributesToCustomData(const QSharedPointer<Database
return;
}
- const QString keePassBrowserGroupName = QLatin1String(KEEPASSXCBROWSER_GROUP_NAME);
- const QString keePassHttpGroupName = QLatin1String(KEEPASSHTTP_GROUP_NAME);
-
- for (Group* g : rootGroup->groupsRecursive(true)) {
- if (g->name() == keePassHttpGroupName) {
- g->setName(keePassBrowserGroupName);
+ for (auto* g : rootGroup->groupsRecursive(true)) {
+ if (g->name() == KEEPASSHTTP_GROUP_NAME) {
+ g->setName(KEEPASSXCBROWSER_GROUP_NAME);
break;
}
}
@@ -721,7 +752,7 @@ QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QStrin
// Build map of prioritized entries
QMultiMap<int, Entry*> priorities;
- for (Entry* entry : pwEntries) {
+ for (auto* entry : pwEntries) {
priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl), entry);
}
@@ -755,8 +786,9 @@ QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QStrin
bool BrowserService::confirmEntries(QList<Entry*>& pwEntriesToConfirm,
const QString& url,
const QString& host,
- const QString& submitHost,
- const QString& realm)
+ const QString& submitUrl,
+ const QString& realm,
+ const bool httpAuth)
{
if (pwEntriesToConfirm.isEmpty() || m_dialogActive) {
return false;
@@ -765,17 +797,19 @@ bool BrowserService::confirmEntries(QList<Entry*>& pwEntriesToConfirm,
m_dialogActive = true;
BrowserAccessControlDialog accessControlDialog;
connect(m_dbTabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), &accessControlDialog, SLOT(reject()));
- accessControlDialog.setUrl(url);
+ accessControlDialog.setUrl(!submitUrl.isEmpty() ? submitUrl : url);
accessControlDialog.setItems(pwEntriesToConfirm);
+ accessControlDialog.setHTTPAuth(httpAuth);
raiseWindow();
accessControlDialog.show();
accessControlDialog.activateWindow();
accessControlDialog.raise();
+ const QString submitHost = QUrl(submitUrl).host();
int res = accessControlDialog.exec();
if (accessControlDialog.remember()) {
- for (Entry* entry : pwEntriesToConfirm) {
+ for (auto* entry : pwEntriesToConfirm) {
BrowserEntryConfig config;
config.load(entry);
if (res == QDialog::Accepted) {
@@ -820,14 +854,18 @@ QJsonObject BrowserService::prepareEntry(const Entry* entry)
res["expired"] = "true";
}
+ if (entry->customData()->contains(BrowserService::OPTION_SKIP_AUTO_SUBMIT)) {
+ res["skipAutoSubmit"] = entry->customData()->value(BrowserService::OPTION_SKIP_AUTO_SUBMIT);
+ }
+
if (browserSettings()->supportKphFields()) {
const EntryAttributes* attr = entry->attributes();
QJsonArray stringFields;
- for (const QString& key : attr->keys()) {
- if (key.startsWith(QLatin1String("KPH: "))) {
+ for (const auto& key : attr->keys()) {
+ if (key.startsWith("KPH: ")) {
QJsonObject sField;
sField[key] = entry->resolveMultiplePlaceholders(attr->value(key));
- stringFields << sField;
+ stringFields.append(sField);
}
}
res["stringFields"] = stringFields;
@@ -869,18 +907,15 @@ Group* BrowserService::getDefaultEntryGroup(const QSharedPointer<Database>& sele
return nullptr;
}
- const QString groupName =
- QLatin1String(KEEPASSXCBROWSER_GROUP_NAME);
-
for (auto* g : rootGroup->groupsRecursive(true)) {
- if (g->name() == groupName && !g->isRecycled()) {
+ if (g->name() == KEEPASSXCBROWSER_GROUP_NAME && !g->isRecycled()) {
return db->rootGroup()->findGroupByUuid(g->uuid());
}
}
auto* group = new Group();
group->setUuid(QUuid::createUuid());
- group->setName(groupName);
+ group->setName(KEEPASSXCBROWSER_GROUP_NAME);
group->setIcon(KEEPASSXCBROWSER_DEFAULT_ICON);
group->setParent(rootGroup);
return group;
@@ -958,6 +993,26 @@ bool BrowserService::removeFirstDomain(QString& hostname)
return false;
}
+bool BrowserService::handleURL(const QString& entryUrl, const QString& hostname, const QString& url)
+{
+ QUrl entryQUrl(entryUrl);
+ QString entryScheme = entryQUrl.scheme();
+ QUrl qUrl(url);
+
+ // Ignore entry if port or scheme defined in the URL doesn't match
+ if ((entryQUrl.port() > 0 && entryQUrl.port() != qUrl.port())
+ || (browserSettings()->matchUrlScheme() && !entryScheme.isEmpty() && entryScheme.compare(qUrl.scheme()) != 0)) {
+ return false;
+ }
+
+ // Filter to match hostname in URL field
+ if ((!entryUrl.isEmpty() && hostname.contains(entryUrl))
+ || (matchUrlScheme(entryUrl) && hostname.endsWith(entryQUrl.host()))) {
+ return true;
+ }
+ return false;
+};
+
/**
* Gets the base domain of URL.
*
@@ -1051,9 +1106,8 @@ int BrowserService::moveKeysToCustomData(Entry* entry, const QSharedPointer<Data
publicKey.remove(LEGACY_ASSOCIATE_KEY_PREFIX);
// Add key to database custom data
- if (db && !db->metadata()->customData()->contains(QLatin1String(ASSOCIATE_KEY_PREFIX) + publicKey)) {
- db->metadata()->customData()->set(QLatin1String(ASSOCIATE_KEY_PREFIX) + publicKey,
- entry->attributes()->value(key));
+ if (db && !db->metadata()->customData()->contains(ASSOCIATE_KEY_PREFIX + publicKey)) {
+ db->metadata()->customData()->set(ASSOCIATE_KEY_PREFIX + publicKey, entry->attributes()->value(key));
++keyCounter;
}
}
@@ -1064,6 +1118,10 @@ int BrowserService::moveKeysToCustomData(Entry* entry, const QSharedPointer<Data
bool BrowserService::checkLegacySettings()
{
+ if (!browserSettings()->isEnabled() || browserSettings()->noMigrationPrompt()) {
+ return false;
+ }
+
auto db = getDatabase();
if (!db) {
return false;
@@ -1083,13 +1141,21 @@ bool BrowserService::checkLegacySettings()
return false;
}
+ auto* checkbox = new QCheckBox(tr("Don't show this warning again"));
+ QObject::connect(checkbox, &QCheckBox::stateChanged, [&](int state) {
+ browserSettings()->setNoMigrationPrompt(static_cast<Qt::CheckState>(state) == Qt::CheckState::Checked);
+ });
+
auto dialogResult =
MessageBox::warning(nullptr,
tr("KeePassXC: Legacy browser integration settings detected"),
tr("Your KeePassXC-Browser settings need to be moved into the database settings.\n"
"This is necessary to maintain your current browser connections.\n"
"Would you like to migrate your existing settings now?"),
- MessageBox::Yes | MessageBox::No);
+ MessageBox::Yes | MessageBox::No,
+ MessageBox::NoButton,
+ MessageBox::Raise,
+ checkbox);
return dialogResult == MessageBox::Yes;
}
diff --git a/src/browser/BrowserService.h b/src/browser/BrowserService.h
index 77d94b6bd..81d3ed317 100644
--- a/src/browser/BrowserService.h
+++ b/src/browser/BrowserService.h
@@ -38,6 +38,13 @@ class BrowserService : public QObject
Q_OBJECT
public:
+ enum ReturnValue
+ {
+ Success,
+ Error,
+ Canceled
+ };
+
explicit BrowserService(DatabaseTabWidget* parent);
bool isDatabaseOpened() const;
@@ -61,10 +68,13 @@ public:
void convertAttributesToCustomData(const QSharedPointer<Database>& currentDb = {});
public:
- static const char KEEPASSXCBROWSER_NAME[];
- static const char KEEPASSXCBROWSER_OLD_NAME[];
- static const char ASSOCIATE_KEY_PREFIX[];
- static const char LEGACY_ASSOCIATE_KEY_PREFIX[];
+ static const QString KEEPASSXCBROWSER_NAME;
+ static const QString KEEPASSXCBROWSER_OLD_NAME;
+ static const QString ASSOCIATE_KEY_PREFIX;
+ static const QString LEGACY_ASSOCIATE_KEY_PREFIX;
+ static const QString OPTION_SKIP_AUTO_SUBMIT;
+ static const QString OPTION_HIDE_ENTRY;
+ static const QString ADDITIONAL_URL;
public slots:
QJsonArray findMatchingEntries(const QString& id,
@@ -74,12 +84,12 @@ public slots:
const StringPairList& keyList,
const bool httpAuth = false);
QString storeKey(const QString& key);
- void updateEntry(const QString& id,
- const QString& uuid,
- const QString& login,
- const QString& password,
- const QString& url,
- const QString& submitUrl);
+ ReturnValue updateEntry(const QString& id,
+ const QString& uuid,
+ const QString& login,
+ const QString& password,
+ const QString& url,
+ const QString& submitUrl);
void databaseLocked(DatabaseWidget* dbWidget);
void databaseUnlocked(DatabaseWidget* dbWidget);
void activateDatabaseChanged(DatabaseWidget* dbWidget);
@@ -110,8 +120,9 @@ private:
bool confirmEntries(QList<Entry*>& pwEntriesToConfirm,
const QString& url,
const QString& host,
- const QString& submitHost,
- const QString& realm);
+ const QString& submitUrl,
+ const QString& realm,
+ const bool httpAuth);
QJsonObject prepareEntry(const Entry* entry);
Access checkAccess(const Entry* entry, const QString& host, const QString& submitHost, const QString& realm);
Group* getDefaultEntryGroup(const QSharedPointer<Database>& selectedDb = {});
@@ -119,6 +130,7 @@ private:
sortPriority(const Entry* entry, const QString& host, const QString& submitUrl, const QString& baseSubmitUrl) const;
bool matchUrlScheme(const QString& url);
bool removeFirstDomain(QString& hostname);
+ bool handleURL(const QString& entryUrl, const QString& hostname, const QString& url);
QString baseDomain(const QString& url) const;
QSharedPointer<Database> getDatabase();
QSharedPointer<Database> selectedDatabase();
diff --git a/src/browser/BrowserSettings.cpp b/src/browser/BrowserSettings.cpp
index f44c5e802..046734268 100644
--- a/src/browser/BrowserSettings.cpp
+++ b/src/browser/BrowserSettings.cpp
@@ -151,6 +151,16 @@ void BrowserSettings::setSupportKphFields(bool supportKphFields)
config()->set("Browser/SupportKphFields", supportKphFields);
}
+bool BrowserSettings::noMigrationPrompt()
+{
+ return config()->get("Browser/NoMigrationPrompt", false).toBool();
+}
+
+void BrowserSettings::setNoMigrationPrompt(bool prompt)
+{
+ config()->set("Browser/NoMigrationPrompt", prompt);
+}
+
bool BrowserSettings::supportBrowserProxy()
{
return config()->get("Browser/SupportBrowserProxy", true).toBool();
@@ -250,13 +260,13 @@ void BrowserSettings::setVivaldiSupport(bool enabled)
bool BrowserSettings::braveSupport()
{
- return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::BRAVE);
+ return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::BRAVE);
}
void BrowserSettings::setBraveSupport(bool enabled)
{
- m_hostInstaller.installBrowser(
- HostInstaller::SupportedBrowsers::BRAVE, enabled, supportBrowserProxy(), customProxyLocation());
+ m_hostInstaller.installBrowser(
+ HostInstaller::SupportedBrowsers::BRAVE, enabled, supportBrowserProxy(), customProxyLocation());
}
bool BrowserSettings::torBrowserSupport()
@@ -512,19 +522,23 @@ PasswordGenerator::GeneratorFlags BrowserSettings::passwordGeneratorFlags()
return flags;
}
-QString BrowserSettings::generatePassword()
+QJsonObject BrowserSettings::generatePassword()
{
+ QJsonObject password;
if (generatorType() == 0) {
m_passwordGenerator.setLength(passwordLength());
m_passwordGenerator.setCharClasses(passwordCharClasses());
m_passwordGenerator.setFlags(passwordGeneratorFlags());
- return m_passwordGenerator.generatePassword();
+ const QString pw = m_passwordGenerator.generatePassword();
+ password["entropy"] = m_passwordGenerator.estimateEntropy(pw);
+ password["password"] = pw;
} else {
- m_passPhraseGenerator.setDefaultWordList();
m_passPhraseGenerator.setWordCount(passPhraseWordCount());
m_passPhraseGenerator.setWordSeparator(passPhraseWordSeparator());
- return m_passPhraseGenerator.generatePassphrase();
+ password["entropy"] = m_passPhraseGenerator.estimateEntropy();
+ password["password"] = m_passPhraseGenerator.generatePassphrase();
}
+ return password;
}
void BrowserSettings::updateBinaryPaths(const QString& customProxyLocation)
diff --git a/src/browser/BrowserSettings.h b/src/browser/BrowserSettings.h
index b47e92866..0fa2359ee 100644
--- a/src/browser/BrowserSettings.h
+++ b/src/browser/BrowserSettings.h
@@ -55,6 +55,8 @@ public:
void setHttpAuthPermission(bool httpAuthPermission);
bool supportKphFields();
void setSupportKphFields(bool supportKphFields);
+ bool noMigrationPrompt();
+ void setNoMigrationPrompt(bool prompt);
bool supportBrowserProxy();
void setSupportBrowserProxy(bool enabled);
@@ -119,7 +121,7 @@ public:
void setPasswordLength(int length);
PasswordGenerator::CharClasses passwordCharClasses();
PasswordGenerator::GeneratorFlags passwordGeneratorFlags();
- QString generatePassword();
+ QJsonObject generatePassword();
void updateBinaryPaths(const QString& customProxyLocation = QString());
bool checkIfProxyExists(QString& path);
diff --git a/src/browser/HostInstaller.cpp b/src/browser/HostInstaller.cpp
index 20c554566..4928ba64e 100644
--- a/src/browser/HostInstaller.cpp
+++ b/src/browser/HostInstaller.cpp
@@ -40,13 +40,6 @@ HostInstaller::HostInstaller()
, TARGET_DIR_VIVALDI("/Library/Application Support/Vivaldi/NativeMessagingHosts")
, TARGET_DIR_TOR_BROWSER("/Library/Application Support/TorBrowser-Data/Browser/Mozilla/NativeMessagingHosts")
, TARGET_DIR_BRAVE("/Library/Application Support/BraveSoftware/Brave-Browser/NativeMessagingHosts")
-#elif defined(Q_OS_LINUX)
- , TARGET_DIR_CHROME("/.config/google-chrome/NativeMessagingHosts")
- , TARGET_DIR_CHROMIUM("/.config/chromium/NativeMessagingHosts")
- , TARGET_DIR_FIREFOX("/.mozilla/native-messaging-hosts")
- , TARGET_DIR_VIVALDI("/.config/vivaldi/NativeMessagingHosts")
- , TARGET_DIR_TOR_BROWSER("/.tor-browser/app/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts")
- , TARGET_DIR_BRAVE("/.config/BraveSoftware/Brave-Browser/NativeMessagingHosts")
#elif defined(Q_OS_WIN)
// clang-format off
, TARGET_DIR_CHROME("HKEY_CURRENT_USER\\Software\\Google\\Chrome\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser")
@@ -56,6 +49,13 @@ HostInstaller::HostInstaller()
, TARGET_DIR_VIVALDI(TARGET_DIR_CHROME)
, TARGET_DIR_TOR_BROWSER(TARGET_DIR_FIREFOX)
, TARGET_DIR_BRAVE(TARGET_DIR_CHROME)
+#else
+ , TARGET_DIR_CHROME("/.config/google-chrome/NativeMessagingHosts")
+ , TARGET_DIR_CHROMIUM("/.config/chromium/NativeMessagingHosts")
+ , TARGET_DIR_FIREFOX("/.mozilla/native-messaging-hosts")
+ , TARGET_DIR_VIVALDI("/.config/vivaldi/NativeMessagingHosts")
+ , TARGET_DIR_TOR_BROWSER("/.tor-browser/app/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts")
+ , TARGET_DIR_BRAVE("/.config/BraveSoftware/Brave-Browser/NativeMessagingHosts")
#endif
{
}
@@ -109,9 +109,7 @@ void HostInstaller::installBrowser(SupportedBrowsers browser,
#ifdef Q_OS_WIN
// Create a registry key
QSettings settings(getTargetPath(browser), QSettings::NativeFormat);
- if (!registryEntryFound(settings)) {
- settings.setValue("Default", getPath(browser));
- }
+ settings.setValue("Default", getPath(browser));
#endif
// Always create the script file
QJsonObject script = constructFile(browser, proxy, location);
@@ -128,9 +126,7 @@ void HostInstaller::installBrowser(SupportedBrowsers browser,
#ifdef Q_OS_WIN
// Remove the registry entry
QSettings settings(getTargetPath(browser), QSettings::NativeFormat);
- if (registryEntryFound(settings)) {
- settings.remove("Default");
- }
+ settings.remove("Default");
#endif
}
}
@@ -171,7 +167,7 @@ QString HostInstaller::getTargetPath(SupportedBrowsers browser) const
case SupportedBrowsers::TOR_BROWSER:
return TARGET_DIR_TOR_BROWSER;
case SupportedBrowsers::BRAVE:
- return TARGET_DIR_BRAVE;
+ return TARGET_DIR_BRAVE;
default:
return QString();
}
@@ -194,11 +190,11 @@ QString HostInstaller::getBrowserName(SupportedBrowsers browser) const
case SupportedBrowsers::FIREFOX:
return "firefox";
case SupportedBrowsers::VIVALDI:
- return "vivaldi";
+ return "vivaldi";
case SupportedBrowsers::TOR_BROWSER:
return "tor-browser";
case SupportedBrowsers::BRAVE:
- return "brave";
+ return "brave";
default:
return QString();
}
@@ -299,9 +295,9 @@ QJsonObject HostInstaller::constructFile(SupportedBrowsers browser, const bool&
QJsonObject script;
script["name"] = HOST_NAME;
- script["description"] = "KeePassXC integration with native messaging support";
+ script["description"] = QString("KeePassXC integration with native messaging support");
script["path"] = path;
- script["type"] = "stdio";
+ script["type"] = QString("stdio");
QJsonArray arr;
if (browser == SupportedBrowsers::FIREFOX || browser == SupportedBrowsers::TOR_BROWSER) {
diff --git a/src/browser/NativeMessagingBase.cpp b/src/browser/NativeMessagingBase.cpp
index 33592ce3a..b44875b14 100644
--- a/src/browser/NativeMessagingBase.cpp
+++ b/src/browser/NativeMessagingBase.cpp
@@ -104,7 +104,7 @@ void NativeMessagingBase::readNativeMessages()
{
#ifdef Q_OS_WIN
quint32 length = 0;
- while (m_running.load() && !std::cin.eof()) {
+ while (m_running.load() != 0 && !std::cin.eof()) {
length = 0;
std::cin.read(reinterpret_cast<char*>(&length), 4);
readStdIn(length);
diff --git a/src/browser/NativeMessagingBase.h b/src/browser/NativeMessagingBase.h
index 7a099a4ac..b68208c68 100644
--- a/src/browser/NativeMessagingBase.h
+++ b/src/browser/NativeMessagingBase.h
@@ -19,7 +19,7 @@
#ifndef NATIVEMESSAGINGBASE_H
#define NATIVEMESSAGINGBASE_H
-#include <QAtomicInteger>
+#include <QAtomicInt>
#include <QFuture>
#include <QJsonDocument>
#include <QJsonObject>
@@ -60,7 +60,7 @@ protected:
QString getLocalServerPath() const;
protected:
- QAtomicInteger<quint8> m_running;
+ QAtomicInt m_running;
QSharedPointer<QSocketNotifier> m_notifier;
QFuture<void> m_future;
};
diff --git a/src/browser/NativeMessagingHost.cpp b/src/browser/NativeMessagingHost.cpp
index 5d2383b2b..a6c321215 100644
--- a/src/browser/NativeMessagingHost.cpp
+++ b/src/browser/NativeMessagingHost.cpp
@@ -35,9 +35,9 @@ NativeMessagingHost::NativeMessagingHost(DatabaseTabWidget* parent, const bool e
{
m_localServer.reset(new QLocalServer(this));
m_localServer->setSocketOptions(QLocalServer::UserAccessOption);
- m_running.store(false);
+ m_running.store(0);
- if (browserSettings()->isEnabled() && !m_running) {
+ if (browserSettings()->isEnabled() && m_running.load() == 0) {
run();
}
@@ -59,7 +59,7 @@ int NativeMessagingHost::init()
void NativeMessagingHost::run()
{
QMutexLocker locker(&m_mutex);
- if (!m_running.load() && init() == -1) {
+ if (m_running.load() == 0 && init() == -1) {
return;
}
@@ -69,7 +69,7 @@ void NativeMessagingHost::run()
browserSettings()->useCustomProxy() ? browserSettings()->customProxyLocation() : "");
}
- m_running.store(true);
+ m_running.store(1);
#ifdef Q_OS_WIN
m_future =
QtConcurrent::run(this, static_cast<void (NativeMessagingHost::*)()>(&NativeMessagingHost::readNativeMessages));
@@ -100,7 +100,7 @@ void NativeMessagingHost::stop()
databaseLocked();
QMutexLocker locker(&m_mutex);
m_socketList.clear();
- m_running.testAndSetOrdered(true, false);
+ m_running.testAndSetOrdered(1, 0);
m_future.waitForFinished();
m_localServer->close();
}
@@ -210,13 +210,13 @@ void NativeMessagingHost::disconnectSocket()
void NativeMessagingHost::databaseLocked()
{
QJsonObject response;
- response["action"] = "database-locked";
+ response["action"] = QString("database-locked");
sendReplyToAllClients(response);
}
void NativeMessagingHost::databaseUnlocked()
{
QJsonObject response;
- response["action"] = "database-unlocked";
+ response["action"] = QString("database-unlocked");
sendReplyToAllClients(response);
}
diff --git a/src/cli/Add.cpp b/src/cli/Add.cpp
index 975d549e5..8f2fea742 100644
--- a/src/cli/Add.cpp
+++ b/src/cli/Add.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,8 +20,7 @@
#include "Add.h"
-#include <QCommandLineParser>
-
+#include "cli/Generate.h"
#include "cli/TextStream.h"
#include "cli/Utils.h"
#include "core/Database.h"
@@ -29,127 +28,102 @@
#include "core/Group.h"
#include "core/PasswordGenerator.h"
+const QCommandLineOption Add::UsernameOption = QCommandLineOption(QStringList() << "u"
+ << "username",
+ QObject::tr("Username for the entry."),
+ QObject::tr("username"));
+
+const QCommandLineOption Add::UrlOption =
+ QCommandLineOption(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL"));
+
+const QCommandLineOption Add::PasswordPromptOption =
+ QCommandLineOption(QStringList() << "p"
+ << "password-prompt",
+ QObject::tr("Prompt for the entry's password."));
+
+const QCommandLineOption Add::GenerateOption = QCommandLineOption(QStringList() << "g"
+ << "generate",
+ QObject::tr("Generate a password for the entry."));
+
Add::Add()
{
name = QString("add");
description = QObject::tr("Add a new entry to a database.");
+ options.append(Add::UsernameOption);
+ options.append(Add::UrlOption);
+ options.append(Add::PasswordPromptOption);
+ positionalArguments.append({QString("entry"), QObject::tr("Path of the entry to add."), QString("")});
+
+ // Password generation options.
+ options.append(Add::GenerateOption);
+ options.append(Generate::PasswordLengthOption);
+ options.append(Generate::LowerCaseOption);
+ options.append(Generate::UpperCaseOption);
+ options.append(Generate::NumbersOption);
+ options.append(Generate::SpecialCharsOption);
+ options.append(Generate::ExtendedAsciiOption);
+ options.append(Generate::ExcludeCharsOption);
+ options.append(Generate::ExcludeSimilarCharsOption);
+ options.append(Generate::IncludeEveryGroupOption);
}
-Add::~Add()
-{
-}
-
-int Add::execute(const QStringList& arguments)
+int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
TextStream inputTextStream(Utils::STDIN, QIODevice::ReadOnly);
TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
-
- QCommandLineOption username(QStringList() << "u"
- << "username",
- QObject::tr("Username for the entry."),
- QObject::tr("username"));
- parser.addOption(username);
-
- QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL"));
- parser.addOption(url);
-
- QCommandLineOption prompt(QStringList() << "p"
- << "password-prompt",
- QObject::tr("Prompt for the entry's password."));
- parser.addOption(prompt);
-
- QCommandLineOption generate(QStringList() << "g"
- << "generate",
- QObject::tr("Generate a password for the entry."));
- parser.addOption(generate);
-
- QCommandLineOption length(QStringList() << "l"
- << "password-length",
- QObject::tr("Length for the generated password."),
- QObject::tr("length"));
- parser.addOption(length);
-
- parser.addPositionalArgument("entry", QObject::tr("Path of the entry to add."));
-
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "add [options]");
- return EXIT_FAILURE;
- }
+ const QStringList args = parser->positionalArguments();
+ auto& entryPath = args.at(1);
- const QString& databasePath = args.at(0);
- const QString& entryPath = args.at(1);
-
- auto db = Utils::unlockDatabase(databasePath,
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
+ // Cannot use those 2 options at the same time!
+ if (parser->isSet(Add::GenerateOption) && parser->isSet(Add::PasswordPromptOption)) {
+ errorTextStream << QObject::tr("Cannot generate a password and prompt at the same time!") << endl;
return EXIT_FAILURE;
}
- // Validating the password length here, before we actually create
+ // Validating the password generator here, before we actually create
// the entry.
- QString passwordLength = parser.value(length);
- if (!passwordLength.isEmpty() && !passwordLength.toInt()) {
- errorTextStream << QObject::tr("Invalid value for password length %1.").arg(passwordLength) << endl;
- return EXIT_FAILURE;
+ QSharedPointer<PasswordGenerator> passwordGenerator;
+ if (parser->isSet(Add::GenerateOption)) {
+ passwordGenerator = Generate::createGenerator(parser);
+ if (passwordGenerator.isNull()) {
+ return EXIT_FAILURE;
+ }
}
- Entry* entry = db->rootGroup()->addEntryWithPath(entryPath);
+ Entry* entry = database->rootGroup()->addEntryWithPath(entryPath);
if (!entry) {
errorTextStream << QObject::tr("Could not create entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
- if (!parser.value("username").isEmpty()) {
- entry->setUsername(parser.value("username"));
+ if (!parser->value(Add::UsernameOption).isEmpty()) {
+ entry->setUsername(parser->value(Add::UsernameOption));
}
- if (!parser.value("url").isEmpty()) {
- entry->setUrl(parser.value("url"));
+ if (!parser->value(Add::UrlOption).isEmpty()) {
+ entry->setUrl(parser->value(Add::UrlOption));
}
- if (parser.isSet(prompt)) {
- if (!parser.isSet(Command::QuietOption)) {
+ if (parser->isSet(Add::PasswordPromptOption)) {
+ if (!parser->isSet(Command::QuietOption)) {
outputTextStream << QObject::tr("Enter password for new entry: ") << flush;
}
- QString password = Utils::getPassword(parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
+ QString password = Utils::getPassword(parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
entry->setPassword(password);
- } else if (parser.isSet(generate)) {
- PasswordGenerator passwordGenerator;
-
- if (passwordLength.isEmpty()) {
- passwordGenerator.setLength(PasswordGenerator::DefaultLength);
- } else {
- passwordGenerator.setLength(passwordLength.toInt());
- }
-
- passwordGenerator.setCharClasses(PasswordGenerator::DefaultCharset);
- passwordGenerator.setFlags(PasswordGenerator::DefaultFlags);
- QString password = passwordGenerator.generatePassword();
+ } else if (parser->isSet(Add::GenerateOption)) {
+ QString password = passwordGenerator->generatePassword();
entry->setPassword(password);
}
QString errorMessage;
- if (!db->save(databasePath, &errorMessage, true, false)) {
+ if (!database->save(&errorMessage, true, false)) {
errorTextStream << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
- if (!parser.isSet(Command::QuietOption)) {
+ if (!parser->isSet(Command::QuietOption)) {
outputTextStream << QObject::tr("Successfully added entry %1.").arg(entry->title()) << endl;
}
return EXIT_SUCCESS;
diff --git a/src/cli/Add.h b/src/cli/Add.h
index dd0c3d8b5..2d9cf9710 100644
--- a/src/cli/Add.h
+++ b/src/cli/Add.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,14 +18,20 @@
#ifndef KEEPASSXC_ADD_H
#define KEEPASSXC_ADD_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class Add : public Command
+class Add : public DatabaseCommand
{
public:
Add();
- ~Add();
- int execute(const QStringList& arguments) override;
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption UsernameOption;
+ static const QCommandLineOption UrlOption;
+ static const QCommandLineOption PasswordPromptOption;
+ static const QCommandLineOption GenerateOption;
+ static const QCommandLineOption PasswordLengthOption;
};
#endif // KEEPASSXC_ADD_H
diff --git a/src/cli/AddGroup.cpp b/src/cli/AddGroup.cpp
new file mode 100644
index 000000000..cd005cc3d
--- /dev/null
+++ b/src/cli/AddGroup.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 <cstdlib>
+#include <stdio.h>
+
+#include "AddGroup.h"
+
+#include "cli/TextStream.h"
+#include "cli/Utils.h"
+#include "core/Database.h"
+#include "core/Entry.h"
+#include "core/Group.h"
+
+AddGroup::AddGroup()
+{
+ name = QString("mkdir");
+ description = QObject::tr("Adds a new group to a database.");
+ positionalArguments.append({QString("group"), QObject::tr("Path of the group to add."), QString("")});
+}
+
+AddGroup::~AddGroup()
+{
+}
+
+int AddGroup::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
+{
+ TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ const QStringList args = parser->positionalArguments();
+ const QString& groupPath = args.at(1);
+
+ QStringList pathParts = groupPath.split("/");
+ QString groupName = pathParts.takeLast();
+ QString parentGroupPath = pathParts.join("/");
+
+ Group* group = database->rootGroup()->findGroupByPath(groupPath);
+ if (group) {
+ errorTextStream << QObject::tr("Group %1 already exists!").arg(groupPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ Group* parentGroup = database->rootGroup()->findGroupByPath(parentGroupPath);
+ if (!parentGroup) {
+ errorTextStream << QObject::tr("Group %1 not found.").arg(parentGroupPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ Group* newGroup = new Group();
+ newGroup->setUuid(QUuid::createUuid());
+ newGroup->setName(groupName);
+ newGroup->setParent(parentGroup);
+
+ QString errorMessage;
+ if (!database->save(&errorMessage, true, false)) {
+ errorTextStream << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (!parser->isSet(Command::QuietOption)) {
+ outputTextStream << QObject::tr("Successfully added group %1.").arg(groupName) << endl;
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/AddGroup.h b/src/cli/AddGroup.h
new file mode 100644
index 000000000..9976d5894
--- /dev/null
+++ b/src/cli/AddGroup.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_ADDGROUP_H
+#define KEEPASSXC_ADDGROUP_H
+
+#include "DatabaseCommand.h"
+
+class AddGroup : public DatabaseCommand
+{
+public:
+ AddGroup();
+ ~AddGroup();
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
+};
+
+#endif // KEEPASSXC_ADDGROUP_H
diff --git a/src/cli/Analyze.cpp b/src/cli/Analyze.cpp
new file mode 100644
index 000000000..3e6edcebf
--- /dev/null
+++ b/src/cli/Analyze.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "Analyze.h"
+#include "cli/Utils.h"
+#include "core/HibpOffline.h"
+
+#include <QCommandLineParser>
+#include <QFile>
+#include <QString>
+
+#include "cli/TextStream.h"
+#include "core/Group.h"
+#include "core/Tools.h"
+
+const QCommandLineOption Analyze::HIBPDatabaseOption = QCommandLineOption(
+ {"H", "hibp"},
+ QObject::tr("Check if any passwords have been publicly leaked. FILENAME must be the path of a file listing "
+ "SHA-1 hashes of leaked passwords in HIBP format, as available from "
+ "https://haveibeenpwned.com/Passwords."),
+ QObject::tr("FILENAME"));
+
+Analyze::Analyze()
+{
+ name = QString("analyze");
+ description = QObject::tr("Analyze passwords for weaknesses and problems.");
+ options.append(Analyze::HIBPDatabaseOption);
+}
+
+int Analyze::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
+{
+ TextStream inputTextStream(Utils::STDIN, QIODevice::ReadOnly);
+ TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ QString hibpDatabase = parser->value(Analyze::HIBPDatabaseOption);
+ QFile hibpFile(hibpDatabase);
+ if (!hibpFile.open(QFile::ReadOnly)) {
+ errorTextStream << QObject::tr("Failed to open HIBP file %1: %2").arg(hibpDatabase).arg(hibpFile.errorString())
+ << endl;
+ return EXIT_FAILURE;
+ }
+
+ outputTextStream << QObject::tr("Evaluating database entries against HIBP file, this will take a while...");
+
+ QList<QPair<const Entry*, int>> findings;
+ QString error;
+ if (!HibpOffline::report(database, hibpFile, findings, &error)) {
+ errorTextStream << error << endl;
+ return EXIT_FAILURE;
+ }
+
+ for (auto& finding : findings) {
+ printHibpFinding(finding.first, finding.second, outputTextStream);
+ }
+
+ return EXIT_SUCCESS;
+}
+
+void Analyze::printHibpFinding(const Entry* entry, int count, QTextStream& out)
+{
+ QString path = entry->title();
+ for (auto g = entry->group(); g && g != g->database()->rootGroup(); g = g->parentGroup()) {
+ path.prepend("/").prepend(g->name());
+ }
+
+ out << QObject::tr("Password for '%1' has been leaked %2 time(s)!", "", count).arg(path).arg(count) << endl;
+}
diff --git a/src/cli/Analyze.h b/src/cli/Analyze.h
new file mode 100644
index 000000000..fbd3dff3c
--- /dev/null
+++ b/src/cli/Analyze.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_ANALYZE_H
+#define KEEPASSXC_ANALYZE_H
+
+#include "DatabaseCommand.h"
+
+class Analyze : public DatabaseCommand
+{
+public:
+ Analyze();
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption HIBPDatabaseOption;
+
+private:
+ void printHibpFinding(const Entry* entry, int count, QTextStream& out);
+};
+
+#endif // KEEPASSXC_HIBP_H
diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt
index 2f4a7275e..f5c90df8d 100644
--- a/src/cli/CMakeLists.txt
+++ b/src/cli/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (C) 2017 KeePassXC Team
+# Copyright (C) 2019 KeePassXC Team
#
# 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
@@ -15,23 +15,40 @@
set(cli_SOURCES
Add.cpp
+ AddGroup.cpp
+ Analyze.cpp
Clip.cpp
+ Close.cpp
Create.cpp
Command.cpp
+ DatabaseCommand.cpp
Diceware.cpp
Edit.cpp
Estimate.cpp
- Extract.cpp
+ Exit.cpp
+ Export.cpp
Generate.cpp
+ Help.cpp
+ Import.cpp
List.cpp
Locate.cpp
Merge.cpp
+ Move.cpp
+ Open.cpp
Remove.cpp
+ RemoveGroup.cpp
Show.cpp)
add_library(cli STATIC ${cli_SOURCES})
target_link_libraries(cli Qt5::Core Qt5::Widgets)
+find_package(Readline)
+
+if (READLINE_FOUND)
+ target_compile_definitions(cli PUBLIC USE_READLINE)
+ target_link_libraries(cli readline)
+endif()
+
add_executable(keepassxc-cli keepassxc-cli.cpp)
target_link_libraries(keepassxc-cli
cli
@@ -48,6 +65,12 @@ install(TARGETS keepassxc-cli
BUNDLE DESTINATION . COMPONENT Runtime
RUNTIME DESTINATION ${CLI_INSTALL_DIR} COMPONENT Runtime)
+if(MINGW)
+ install(CODE "include(BundleUtilities)
+ fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/keepassxc-cli.exe\" \"\" \"\")"
+ COMPONENT Runtime)
+endif()
+
if(APPLE AND WITH_APP_BUNDLE)
add_custom_command(TARGET keepassxc-cli
POST_BUILD
@@ -82,6 +105,8 @@ if(APPLE AND WITH_APP_BUNDLE)
"@executable_path/../Frameworks/libyubikey.0.dylib"
-change /usr/local/opt/ykpers/lib/libykpers-1.1.dylib
"@executable_path/../Frameworks/libykpers-1.1.dylib"
+ -change /usr/local/opt/quazip/lib/libquazip.1.dylib
+ "@executable_path/../Frameworks/libquazip.1.dylib"
keepassxc-cli
COMMENT "Changing linking of keepassxc-cli")
@@ -94,5 +119,5 @@ if(APPLE AND WITH_APP_BUNDLE)
endif()
if(APPLE OR UNIX)
- install(FILES keepassxc-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
+ install(FILES ../../share/docs/man/keepassxc-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
endif()
diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp
index e1e74c682..2b1dfdc1b 100644
--- a/src/cli/Clip.cpp
+++ b/src/cli/Clip.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -22,80 +22,48 @@
#include "Clip.h"
-#include <QCommandLineParser>
-
#include "cli/TextStream.h"
#include "cli/Utils.h"
#include "core/Database.h"
#include "core/Entry.h"
#include "core/Group.h"
+const QCommandLineOption Clip::TotpOption = QCommandLineOption(QStringList() << "t"
+ << "totp",
+ QObject::tr("Copy the current TOTP to the clipboard."));
+
Clip::Clip()
{
name = QString("clip");
description = QObject::tr("Copy an entry's password to the clipboard.");
+ options.append(Clip::TotpOption);
+ positionalArguments.append(
+ {QString("entry"), QObject::tr("Path of the entry to clip.", "clip = copy to clipboard"), QString("")});
+ optionalArguments.append(
+ {QString("timeout"), QObject::tr("Timeout in seconds before clearing the clipboard."), QString("[timeout]")});
}
-Clip::~Clip()
-{
-}
-
-int Clip::execute(const QStringList& arguments)
+int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
-
- QCommandLineOption totp(QStringList() << "t"
- << "totp",
- QObject::tr("Copy the current TOTP to the clipboard."));
- parser.addOption(totp);
- parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.", "clip = copy to clipboard"));
- parser.addPositionalArgument(
- "timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), "[timeout]");
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2 && args.size() != 3) {
- errorTextStream << parser.helpText().replace("[options]", "clip [options]");
- return EXIT_FAILURE;
- }
-
- auto db = Utils::unlockDatabase(args.at(0),
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
- return EXIT_FAILURE;
+ const QStringList args = parser->positionalArguments();
+ QString entryPath = args.at(1);
+ QString timeout;
+ if (args.size() == 3) {
+ timeout = args.at(2);
}
-
- return clipEntry(db, args.at(1), args.value(2), parser.isSet(totp), parser.isSet(Command::QuietOption));
-}
-
-int Clip::clipEntry(const QSharedPointer<Database>& database,
- const QString& entryPath,
- const QString& timeout,
- bool clipTotp,
- bool silent)
-{
+ bool clipTotp = parser->isSet(Clip::TotpOption);
TextStream errorTextStream(Utils::STDERR);
int timeoutSeconds = 0;
- if (!timeout.isEmpty() && !timeout.toInt()) {
+ if (!timeout.isEmpty() && timeout.toInt() <= 0) {
errorTextStream << QObject::tr("Invalid timeout value %1.").arg(timeout) << endl;
return EXIT_FAILURE;
} else if (!timeout.isEmpty()) {
timeoutSeconds = timeout.toInt();
}
- TextStream outputTextStream(silent ? Utils::DEVNULL : Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream outputTextStream(parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
+ QIODevice::WriteOnly);
Entry* entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
errorTextStream << QObject::tr("Entry %1 not found.").arg(entryPath) << endl;
diff --git a/src/cli/Clip.h b/src/cli/Clip.h
index 65a616955..b171c8689 100644
--- a/src/cli/Clip.h
+++ b/src/cli/Clip.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,19 +18,16 @@
#ifndef KEEPASSXC_CLIP_H
#define KEEPASSXC_CLIP_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class Clip : public Command
+class Clip : public DatabaseCommand
{
public:
Clip();
- ~Clip();
- int execute(const QStringList& arguments) override;
- int clipEntry(const QSharedPointer<Database>& database,
- const QString& entryPath,
- const QString& timeout,
- bool clipTotp,
- bool silent);
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption TotpOption;
};
#endif // KEEPASSXC_CLIP_H
diff --git a/src/cli/Close.cpp b/src/cli/Close.cpp
new file mode 100644
index 000000000..4ff3bcdad
--- /dev/null
+++ b/src/cli/Close.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "Close.h"
+
+#include <QCommandLineParser>
+#include <QtGlobal>
+
+#include "DatabaseCommand.h"
+#include "TextStream.h"
+#include "Utils.h"
+
+Close::Close()
+{
+ name = QString("close");
+ description = QObject::tr("Close the currently opened database.");
+}
+
+int Close::execute(const QStringList& arguments)
+{
+ Q_UNUSED(arguments)
+ currentDatabase.reset(nullptr);
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Extract.h b/src/cli/Close.h
index 1a4f6288b..afc91f9c6 100644
--- a/src/cli/Extract.h
+++ b/src/cli/Close.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -15,17 +15,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef KEEPASSXC_EXTRACT_H
-#define KEEPASSXC_EXTRACT_H
+#ifndef KEEPASSXC_CLOSE_H
+#define KEEPASSXC_CLOSE_H
+
+#include <QStringList>
#include "Command.h"
-class Extract : public Command
+class Close : public Command
{
public:
- Extract();
- ~Extract();
+ Close();
int execute(const QStringList& arguments) override;
};
-#endif // KEEPASSXC_EXTRACT_H
+#endif // KEEPASSXC_CLOSE_H
diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp
index e64dd4aaa..4d3bf8270 100644
--- a/src/cli/Command.cpp
+++ b/src/cli/Command.cpp
@@ -1,103 +1,197 @@
-/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
- *
- * 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 <cstdlib>
-#include <stdio.h>
-
-#include <QMap>
-
-#include "Command.h"
-
-#include "Add.h"
-#include "Clip.h"
-#include "Create.h"
-#include "Diceware.h"
-#include "Edit.h"
-#include "Estimate.h"
-#include "Extract.h"
-#include "Generate.h"
-#include "List.h"
-#include "Locate.h"
-#include "Merge.h"
-#include "Remove.h"
-#include "Show.h"
-
-const QCommandLineOption Command::QuietOption =
- QCommandLineOption(QStringList() << "q"
- << "quiet",
- QObject::tr("Silence password prompt and other secondary outputs."));
-
-const QCommandLineOption Command::KeyFileOption = QCommandLineOption(QStringList() << "k"
- << "key-file",
- QObject::tr("Key file of the database."),
- QObject::tr("path"));
-
-const QCommandLineOption Command::NoPasswordOption =
- QCommandLineOption(QStringList() << "no-password",
- QObject::tr("Deactivate password key for the database."));
-
-QMap<QString, Command*> commands;
-
-Command::~Command()
-{
-}
-
-QString Command::getDescriptionLine()
-{
-
- QString response = name;
- QString space(" ");
- QString spaces = space.repeated(15 - name.length());
- response = response.append(spaces);
- response = response.append(description);
- response = response.append("\n");
- return response;
-}
-
-void populateCommands()
-{
- if (commands.isEmpty()) {
- commands.insert(QString("add"), new Add());
- commands.insert(QString("clip"), new Clip());
- commands.insert(QString("create"), new Create());
- commands.insert(QString("diceware"), new Diceware());
- commands.insert(QString("edit"), new Edit());
- commands.insert(QString("estimate"), new Estimate());
- commands.insert(QString("extract"), new Extract());
- commands.insert(QString("generate"), new Generate());
- commands.insert(QString("locate"), new Locate());
- commands.insert(QString("ls"), new List());
- commands.insert(QString("merge"), new Merge());
- commands.insert(QString("rm"), new Remove());
- commands.insert(QString("show"), new Show());
- }
-}
-
-Command* Command::getCommand(const QString& commandName)
-{
- populateCommands();
- if (commands.contains(commandName)) {
- return commands[commandName];
- }
- return nullptr;
-}
-
-QList<Command*> Command::getCommands()
-{
- populateCommands();
- return commands.values();
-}
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 <cstdio>
+#include <cstdlib>
+#include <utility>
+
+#include <QMap>
+
+#include "Command.h"
+
+#include "Add.h"
+#include "AddGroup.h"
+#include "Analyze.h"
+#include "Clip.h"
+#include "Close.h"
+#include "Create.h"
+#include "Diceware.h"
+#include "Edit.h"
+#include "Estimate.h"
+#include "Exit.h"
+#include "Export.h"
+#include "Generate.h"
+#include "Help.h"
+#include "Import.h"
+#include "List.h"
+#include "Locate.h"
+#include "Merge.h"
+#include "Move.h"
+#include "Open.h"
+#include "Remove.h"
+#include "RemoveGroup.h"
+#include "Show.h"
+#include "TextStream.h"
+#include "Utils.h"
+
+const QCommandLineOption Command::HelpOption = QCommandLineOption(QStringList()
+#ifdef Q_OS_WIN
+ << QStringLiteral("?")
+#endif
+ << QStringLiteral("h") << QStringLiteral("help"),
+ QObject::tr("Display this help."));
+
+const QCommandLineOption Command::QuietOption =
+ QCommandLineOption(QStringList() << "q"
+ << "quiet",
+ QObject::tr("Silence password prompt and other secondary outputs."));
+
+const QCommandLineOption Command::KeyFileOption = QCommandLineOption(QStringList() << "k"
+ << "key-file",
+ QObject::tr("Key file of the database."),
+ QObject::tr("path"));
+
+const QCommandLineOption Command::NoPasswordOption =
+ QCommandLineOption(QStringList() << "no-password", QObject::tr("Deactivate password key for the database."));
+
+const QCommandLineOption Command::YubiKeyOption =
+ QCommandLineOption(QStringList() << "y"
+ << "yubikey",
+ QObject::tr("Yubikey slot used to encrypt the database."),
+ QObject::tr("slot"));
+
+namespace
+{
+
+ QSharedPointer<QCommandLineParser> buildParser(Command* command)
+ {
+ auto parser = QSharedPointer<QCommandLineParser>(new QCommandLineParser());
+ parser->setApplicationDescription(command->description);
+ for (const CommandLineArgument& positionalArgument : command->positionalArguments) {
+ parser->addPositionalArgument(
+ positionalArgument.name, positionalArgument.description, positionalArgument.syntax);
+ }
+ for (const CommandLineArgument& optionalArgument : command->optionalArguments) {
+ parser->addPositionalArgument(optionalArgument.name, optionalArgument.description, optionalArgument.syntax);
+ }
+ for (const QCommandLineOption& option : command->options) {
+ parser->addOption(option);
+ }
+ parser->addOption(Command::HelpOption);
+ return parser;
+ }
+
+} // namespace
+
+Command::Command()
+ : currentDatabase(nullptr)
+{
+ options.append(Command::QuietOption);
+}
+
+Command::~Command()
+{
+}
+
+QString Command::getDescriptionLine()
+{
+ QString response = name;
+ QString space(" ");
+ QString spaces = space.repeated(15 - name.length());
+ response = response.append(spaces);
+ response = response.append(description);
+ response = response.append("\n");
+ return response;
+}
+
+QString Command::getHelpText()
+{
+ return buildParser(this)->helpText().replace("[options]", name + " [options]");
+}
+
+QSharedPointer<QCommandLineParser> Command::getCommandLineParser(const QStringList& arguments)
+{
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+ QSharedPointer<QCommandLineParser> parser = buildParser(this);
+
+ if (!parser->parse(arguments)) {
+ errorTextStream << parser->errorText() << "\n\n";
+ errorTextStream << getHelpText();
+ return {};
+ }
+ if (parser->positionalArguments().size() < positionalArguments.size()) {
+ errorTextStream << getHelpText();
+ return {};
+ }
+ if (parser->positionalArguments().size() > (positionalArguments.size() + optionalArguments.size())) {
+ errorTextStream << getHelpText();
+ return {};
+ }
+ if (parser->isSet(HelpOption)) {
+ errorTextStream << getHelpText();
+ return {};
+ }
+ return parser;
+}
+
+namespace Commands
+{
+ QMap<QString, QSharedPointer<Command>> s_commands;
+
+ void setupCommands(bool interactive)
+ {
+ s_commands.clear();
+
+ s_commands.insert(QStringLiteral("add"), QSharedPointer<Command>(new Add()));
+ s_commands.insert(QStringLiteral("analyze"), QSharedPointer<Command>(new Analyze()));
+ s_commands.insert(QStringLiteral("clip"), QSharedPointer<Command>(new Clip()));
+ s_commands.insert(QStringLiteral("close"), QSharedPointer<Command>(new Close()));
+ s_commands.insert(QStringLiteral("create"), QSharedPointer<Command>(new Create()));
+ s_commands.insert(QStringLiteral("diceware"), QSharedPointer<Command>(new Diceware()));
+ s_commands.insert(QStringLiteral("edit"), QSharedPointer<Command>(new Edit()));
+ s_commands.insert(QStringLiteral("estimate"), QSharedPointer<Command>(new Estimate()));
+ s_commands.insert(QStringLiteral("generate"), QSharedPointer<Command>(new Generate()));
+ s_commands.insert(QStringLiteral("help"), QSharedPointer<Command>(new Help()));
+ s_commands.insert(QStringLiteral("locate"), QSharedPointer<Command>(new Locate()));
+ s_commands.insert(QStringLiteral("ls"), QSharedPointer<Command>(new List()));
+ s_commands.insert(QStringLiteral("merge"), QSharedPointer<Command>(new Merge()));
+ s_commands.insert(QStringLiteral("mkdir"), QSharedPointer<Command>(new AddGroup()));
+ s_commands.insert(QStringLiteral("mv"), QSharedPointer<Command>(new Move()));
+ s_commands.insert(QStringLiteral("open"), QSharedPointer<Command>(new Open()));
+ s_commands.insert(QStringLiteral("rm"), QSharedPointer<Command>(new Remove()));
+ s_commands.insert(QStringLiteral("rmdir"), QSharedPointer<Command>(new RemoveGroup()));
+ s_commands.insert(QStringLiteral("show"), QSharedPointer<Command>(new Show()));
+
+ if (interactive) {
+ s_commands.insert(QStringLiteral("exit"), QSharedPointer<Command>(new Exit("exit")));
+ s_commands.insert(QStringLiteral("quit"), QSharedPointer<Command>(new Exit("quit")));
+ } else {
+ s_commands.insert(QStringLiteral("export"), QSharedPointer<Command>(new Export()));
+ s_commands.insert(QStringLiteral("import"), QSharedPointer<Command>(new Import()));
+ }
+ }
+
+ QList<QSharedPointer<Command>> getCommands()
+ {
+ return s_commands.values();
+ }
+
+ QSharedPointer<Command> getCommand(const QString& commandName)
+ {
+ return s_commands.value(commandName);
+ }
+} // namespace Commands
diff --git a/src/cli/Command.h b/src/cli/Command.h
index 30af61702..4381bf187 100644
--- a/src/cli/Command.h
+++ b/src/cli/Command.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -19,6 +19,7 @@
#define KEEPASSXC_COMMAND_H
#include <QCommandLineOption>
+#include <QCommandLineParser>
#include <QList>
#include <QObject>
#include <QString>
@@ -26,21 +27,44 @@
#include "core/Database.h"
+// At the moment, there's no QT class for the positional arguments
+// like there is for the options (QCommandLineOption).
+struct CommandLineArgument
+{
+ QString name;
+ QString description;
+ QString syntax;
+};
+
class Command
{
public:
+ Command();
virtual ~Command();
virtual int execute(const QStringList& arguments) = 0;
QString name;
QString description;
- QString getDescriptionLine();
+ QSharedPointer<Database> currentDatabase;
+ QList<CommandLineArgument> positionalArguments;
+ QList<CommandLineArgument> optionalArguments;
+ QList<QCommandLineOption> options;
- static QList<Command*> getCommands();
- static Command* getCommand(const QString& commandName);
+ QString getDescriptionLine();
+ QSharedPointer<QCommandLineParser> getCommandLineParser(const QStringList& arguments);
+ QString getHelpText();
+ static const QCommandLineOption HelpOption;
static const QCommandLineOption QuietOption;
static const QCommandLineOption KeyFileOption;
static const QCommandLineOption NoPasswordOption;
+ static const QCommandLineOption YubiKeyOption;
};
+namespace Commands
+{
+ void setupCommands(bool interactive);
+ QList<QSharedPointer<Command>> getCommands();
+ QSharedPointer<Command> getCommand(const QString& commandName);
+} // namespace Commands
+
#endif // KEEPASSXC_COMMAND_H
diff --git a/src/cli/Create.cpp b/src/cli/Create.cpp
index 80dcb5691..fbdebaf47 100644
--- a/src/cli/Create.cpp
+++ b/src/cli/Create.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,7 +18,6 @@
#include <cstdlib>
#include <stdio.h>
-#include <QCommandLineParser>
#include <QFileInfo>
#include <QString>
#include <QTextStream>
@@ -35,10 +34,8 @@ Create::Create()
{
name = QString("create");
description = QObject::tr("Create a new database.");
-}
-
-Create::~Create()
-{
+ positionalArguments.append({QString("database"), QObject::tr("Path of the database."), QString("")});
+ options.append(Command::KeyFileOption);
}
/**
@@ -59,21 +56,13 @@ int Create::execute(const QStringList& arguments)
QTextStream out(Utils::STDOUT, QIODevice::WriteOnly);
QTextStream err(Utils::STDERR, QIODevice::WriteOnly);
- QCommandLineParser parser;
-
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addOption(Command::KeyFileOption);
-
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() < 1) {
- out << parser.helpText().replace("[options]", "create [options]");
+ QSharedPointer<QCommandLineParser> parser = getCommandLineParser(arguments);
+ if (parser.isNull()) {
return EXIT_FAILURE;
}
+ const QStringList args = parser->positionalArguments();
+
const QString& databaseFilename = args.at(0);
if (QFileInfo::exists(databaseFilename)) {
err << QObject::tr("File %1 already exists.").arg(databaseFilename) << endl;
@@ -82,14 +71,14 @@ int Create::execute(const QStringList& arguments)
auto key = QSharedPointer<CompositeKey>::create();
- auto password = getPasswordFromStdin();
+ auto password = Utils::getPasswordFromStdin();
if (!password.isNull()) {
key->addKey(password);
}
QSharedPointer<FileKey> fileKey;
- if (parser.isSet(Command::KeyFileOption)) {
- if (!loadFileKey(parser.value(Command::KeyFileOption), fileKey)) {
+ if (parser->isSet(Command::KeyFileOption)) {
+ if (!loadFileKey(parser->value(Command::KeyFileOption), fileKey)) {
err << QObject::tr("Loading the key file failed") << endl;
return EXIT_FAILURE;
}
@@ -104,42 +93,21 @@ int Create::execute(const QStringList& arguments)
return EXIT_FAILURE;
}
- Database db;
- db.setKey(key);
+ QSharedPointer<Database> db(new Database);
+ db->setKey(key);
QString errorMessage;
- if (!db.save(databaseFilename, &errorMessage, true, false)) {
+ if (!db->saveAs(databaseFilename, &errorMessage, true, false)) {
err << QObject::tr("Failed to save the database: %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Successfully created new database.") << endl;
+ currentDatabase = db;
return EXIT_SUCCESS;
}
/**
- * Read optional password from stdin.
- *
- * @return Pointer to the PasswordKey or null if passwordkey is skipped
- * by user
- */
-QSharedPointer<PasswordKey> Create::getPasswordFromStdin()
-{
- QSharedPointer<PasswordKey> passwordKey;
- QTextStream out(Utils::STDOUT, QIODevice::WriteOnly);
-
- out << QObject::tr("Insert password to encrypt database (Press enter to leave blank): ");
- out.flush();
- QString password = Utils::getPassword();
-
- if (!password.isEmpty()) {
- passwordKey = QSharedPointer<PasswordKey>(new PasswordKey(password));
- }
-
- return passwordKey;
-}
-
-/**
* Load a key file from disk. When the path specified does not exist a
* new file will be generated. No folders will be generated so the parent
* folder of the specified file nees to exist
diff --git a/src/cli/Create.h b/src/cli/Create.h
index 85993eaeb..1c5696a6e 100644
--- a/src/cli/Create.h
+++ b/src/cli/Create.h
@@ -21,18 +21,14 @@
#include "Command.h"
#include "keys/FileKey.h"
-#include "keys/PasswordKey.h"
class Create : public Command
{
public:
Create();
- ~Create();
- int execute(const QStringList& arguments);
+ int execute(const QStringList& arguments) override;
private:
- QSharedPointer<PasswordKey> getPasswordFromStdin();
- QSharedPointer<FileKey> getFileKeyFromStdin();
bool loadFileKey(const QString& path, QSharedPointer<FileKey>& fileKey);
};
diff --git a/src/cli/DatabaseCommand.cpp b/src/cli/DatabaseCommand.cpp
new file mode 100644
index 000000000..56e565baa
--- /dev/null
+++ b/src/cli/DatabaseCommand.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "DatabaseCommand.h"
+
+#include "Utils.h"
+
+DatabaseCommand::DatabaseCommand()
+{
+ positionalArguments.append({QString("database"), QObject::tr("Path of the database."), QString("")});
+ options.append(Command::KeyFileOption);
+ options.append(Command::NoPasswordOption);
+#ifdef WITH_XC_YUBIKEY
+ options.append(Command::YubiKeyOption);
+#endif
+}
+
+int DatabaseCommand::execute(const QStringList& arguments)
+{
+ QStringList amendedArgs(arguments);
+ if (currentDatabase) {
+ amendedArgs.insert(1, currentDatabase->filePath());
+ }
+ QSharedPointer<QCommandLineParser> parser = getCommandLineParser(amendedArgs);
+
+ if (parser.isNull()) {
+ return EXIT_FAILURE;
+ }
+
+ QStringList args = parser->positionalArguments();
+ auto db = currentDatabase;
+ if (!db) {
+ // It would be nice to update currentDatabase here, but the CLI tests frequently
+ // re-use Command objects to exercise non-interactive behavior. Updating the current
+ // database confuses these tests. Because of this, we leave it up to the interactive
+ // mode implementation in the main command loop to update currentDatabase
+ // (see keepassxc-cli.cpp).
+ db = Utils::unlockDatabase(args.at(0),
+ !parser->isSet(Command::NoPasswordOption),
+ parser->value(Command::KeyFileOption),
+#ifdef WITH_XC_YUBIKEY
+ parser->value(Command::YubiKeyOption),
+#else
+ "",
+#endif
+ parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
+ Utils::STDERR);
+ if (!db) {
+ return EXIT_FAILURE;
+ }
+ }
+
+ return executeWithDatabase(db, parser);
+}
diff --git a/src/cli/DatabaseCommand.h b/src/cli/DatabaseCommand.h
new file mode 100644
index 000000000..61847ffa2
--- /dev/null
+++ b/src/cli/DatabaseCommand.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_DATABASECOMMAND_H
+#define KEEPASSXC_DATABASECOMMAND_H
+
+#include <QCommandLineOption>
+
+#include "Command.h"
+#include "Utils.h"
+#include "core/Database.h"
+
+class DatabaseCommand : public Command
+{
+public:
+ DatabaseCommand();
+ int execute(const QStringList& arguments) override;
+ virtual int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) = 0;
+};
+
+#endif // KEEPASSXC_DATABASECOMMAND_H
diff --git a/src/cli/Diceware.cpp b/src/cli/Diceware.cpp
index c663cfc39..ef1e10a80 100644
--- a/src/cli/Diceware.cpp
+++ b/src/cli/Diceware.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,65 +20,61 @@
#include "Diceware.h"
-#include <QCommandLineParser>
-
#include "Utils.h"
#include "cli/TextStream.h"
#include "core/PassphraseGenerator.h"
+const QCommandLineOption Diceware::WordCountOption =
+ QCommandLineOption(QStringList() << "W"
+ << "words",
+ QObject::tr("Word count for the diceware passphrase."),
+ QObject::tr("count", "CLI parameter"));
+
+const QCommandLineOption Diceware::WordListOption =
+ QCommandLineOption(QStringList() << "w"
+ << "word-list",
+ QObject::tr("Wordlist for the diceware generator.\n[Default: EFF English]"),
+ QObject::tr("path"));
+
Diceware::Diceware()
{
name = QString("diceware");
description = QObject::tr("Generate a new random diceware passphrase.");
-}
-
-Diceware::~Diceware()
-{
+ options.append(Diceware::WordCountOption);
+ options.append(Diceware::WordListOption);
}
int Diceware::execute(const QStringList& arguments)
{
- TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- QCommandLineOption words(QStringList() << "W"
- << "words",
- QObject::tr("Word count for the diceware passphrase."),
- QObject::tr("count", "CLI parameter"));
- parser.addOption(words);
- QCommandLineOption wordlistFile(QStringList() << "w"
- << "word-list",
- QObject::tr("Wordlist for the diceware generator.\n[Default: EFF English]"),
- QObject::tr("path"));
- parser.addOption(wordlistFile);
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (!args.isEmpty()) {
- errorTextStream << parser.helpText().replace("[options]", "diceware [options]");
+ QSharedPointer<QCommandLineParser> parser = getCommandLineParser(arguments);
+ if (parser.isNull()) {
return EXIT_FAILURE;
}
+ TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
PassphraseGenerator dicewareGenerator;
- if (parser.value(words).isEmpty()) {
+ QString wordCount = parser->value(Diceware::WordCountOption);
+ if (wordCount.isEmpty()) {
dicewareGenerator.setWordCount(PassphraseGenerator::DefaultWordCount);
+ } else if (wordCount.toInt() <= 0) {
+ errorTextStream << QObject::tr("Invalid word count %1").arg(wordCount) << endl;
+ return EXIT_FAILURE;
} else {
- int wordcount = parser.value(words).toInt();
- dicewareGenerator.setWordCount(wordcount);
+ dicewareGenerator.setWordCount(wordCount.toInt());
}
- if (!parser.value(wordlistFile).isEmpty()) {
- dicewareGenerator.setWordList(parser.value(wordlistFile));
- } else {
- dicewareGenerator.setDefaultWordList();
+ QString wordListFile = parser->value(Diceware::WordListOption);
+ if (!wordListFile.isEmpty()) {
+ dicewareGenerator.setWordList(wordListFile);
}
if (!dicewareGenerator.isValid()) {
- outputTextStream << parser.helpText().replace("[options]", "diceware [options]");
+ // We already validated the word count input so if the generator is invalid, it
+ // must be because the word list is too small.
+ errorTextStream << QObject::tr("The word list is too small (< 1000 items)") << endl;
return EXIT_FAILURE;
}
diff --git a/src/cli/Diceware.h b/src/cli/Diceware.h
index f439681b7..efb2d56ef 100644
--- a/src/cli/Diceware.h
+++ b/src/cli/Diceware.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -24,8 +24,11 @@ class Diceware : public Command
{
public:
Diceware();
- ~Diceware();
+
int execute(const QStringList& arguments) override;
+
+ static const QCommandLineOption WordCountOption;
+ static const QCommandLineOption WordListOption;
};
#endif // KEEPASSXC_DICEWARE_H
diff --git a/src/cli/Edit.cpp b/src/cli/Edit.cpp
index 59cedd7c9..30dccf15e 100644
--- a/src/cli/Edit.cpp
+++ b/src/cli/Edit.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,8 +20,8 @@
#include "Edit.h"
-#include <QCommandLineParser>
-
+#include "cli/Add.h"
+#include "cli/Generate.h"
#include "cli/TextStream.h"
#include "cli/Utils.h"
#include "core/Database.h"
@@ -29,144 +29,107 @@
#include "core/Group.h"
#include "core/PasswordGenerator.h"
+const QCommandLineOption Edit::TitleOption = QCommandLineOption(QStringList() << "t"
+ << "title",
+ QObject::tr("Title for the entry."),
+ QObject::tr("title"));
+
Edit::Edit()
{
name = QString("edit");
description = QObject::tr("Edit an entry.");
+ // Using some of the options from the Add command since they are the same.
+ options.append(Add::UsernameOption);
+ options.append(Add::UrlOption);
+ options.append(Add::PasswordPromptOption);
+ options.append(Edit::TitleOption);
+ positionalArguments.append({QString("entry"), QObject::tr("Path of the entry to edit."), QString("")});
+
+ // Password generation options.
+ options.append(Add::GenerateOption);
+ options.append(Generate::PasswordLengthOption);
+ options.append(Generate::LowerCaseOption);
+ options.append(Generate::UpperCaseOption);
+ options.append(Generate::NumbersOption);
+ options.append(Generate::SpecialCharsOption);
+ options.append(Generate::ExtendedAsciiOption);
+ options.append(Generate::ExcludeCharsOption);
+ options.append(Generate::ExcludeSimilarCharsOption);
+ options.append(Generate::IncludeEveryGroupOption);
}
-Edit::~Edit()
-{
-}
-
-int Edit::execute(const QStringList& arguments)
+int Edit::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
- TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream outputTextStream(parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
+ QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
-
- QCommandLineOption username(QStringList() << "u"
- << "username",
- QObject::tr("Username for the entry."),
- QObject::tr("username"));
- parser.addOption(username);
-
- QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL"));
- parser.addOption(url);
-
- QCommandLineOption title(QStringList() << "t"
- << "title",
- QObject::tr("Title for the entry."),
- QObject::tr("title"));
- parser.addOption(title);
-
- QCommandLineOption prompt(QStringList() << "p"
- << "password-prompt",
- QObject::tr("Prompt for the entry's password."));
- parser.addOption(prompt);
-
- QCommandLineOption generate(QStringList() << "g"
- << "generate",
- QObject::tr("Generate a password for the entry."));
- parser.addOption(generate);
-
- QCommandLineOption length(QStringList() << "l"
- << "password-length",
- QObject::tr("Length for the generated password."),
- QObject::tr("length"));
- parser.addOption(length);
-
- parser.addPositionalArgument("entry", QObject::tr("Path of the entry to edit."));
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "edit [options]");
- return EXIT_FAILURE;
- }
-
- const QString& databasePath = args.at(0);
+ const QStringList args = parser->positionalArguments();
const QString& entryPath = args.at(1);
- auto db = Utils::unlockDatabase(databasePath,
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
+ // Cannot use those 2 options at the same time!
+ if (parser->isSet(Add::GenerateOption) && parser->isSet(Add::PasswordPromptOption)) {
+ errorTextStream << QObject::tr("Cannot generate a password and prompt at the same time!") << endl;
return EXIT_FAILURE;
}
- QString passwordLength = parser.value(length);
- if (!passwordLength.isEmpty() && !passwordLength.toInt()) {
- errorTextStream << QObject::tr("Invalid value for password length: %1").arg(passwordLength) << endl;
- return EXIT_FAILURE;
+ // Validating the password generator here, before we actually start
+ // the update.
+ QSharedPointer<PasswordGenerator> passwordGenerator;
+ bool generate = parser->isSet(Add::GenerateOption);
+ if (generate) {
+ passwordGenerator = Generate::createGenerator(parser);
+ if (passwordGenerator.isNull()) {
+ return EXIT_FAILURE;
+ }
}
- Entry* entry = db->rootGroup()->findEntryByPath(entryPath);
+ Entry* entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
errorTextStream << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
- if (parser.value("username").isEmpty() && parser.value("url").isEmpty() && parser.value("title").isEmpty()
- && !parser.isSet(prompt) && !parser.isSet(generate)) {
+ QString username = parser->value(Add::UsernameOption);
+ QString url = parser->value(Add::UrlOption);
+ QString title = parser->value(Edit::TitleOption);
+ bool prompt = parser->isSet(Add::PasswordPromptOption);
+ if (username.isEmpty() && url.isEmpty() && title.isEmpty() && !prompt && !generate) {
errorTextStream << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
entry->beginUpdate();
- if (!parser.value("title").isEmpty()) {
- entry->setTitle(parser.value("title"));
+ if (!title.isEmpty()) {
+ entry->setTitle(title);
}
- if (!parser.value("username").isEmpty()) {
- entry->setUsername(parser.value("username"));
+ if (!username.isEmpty()) {
+ entry->setUsername(username);
}
- if (!parser.value("url").isEmpty()) {
- entry->setUrl(parser.value("url"));
+ if (!url.isEmpty()) {
+ entry->setUrl(url);
}
- if (parser.isSet(prompt)) {
- if (!parser.isSet(Command::QuietOption)) {
- outputTextStream << QObject::tr("Enter new password for entry: ") << flush;
- }
- QString password = Utils::getPassword(parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
+ if (prompt) {
+ outputTextStream << QObject::tr("Enter new password for entry: ") << flush;
+ QString password = Utils::getPassword(parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
entry->setPassword(password);
- } else if (parser.isSet(generate)) {
- PasswordGenerator passwordGenerator;
-
- if (passwordLength.isEmpty()) {
- passwordGenerator.setLength(PasswordGenerator::DefaultLength);
- } else {
- passwordGenerator.setLength(static_cast<size_t>(passwordLength.toInt()));
- }
-
- passwordGenerator.setCharClasses(PasswordGenerator::DefaultCharset);
- passwordGenerator.setFlags(PasswordGenerator::DefaultFlags);
- QString password = passwordGenerator.generatePassword();
+ } else if (generate) {
+ QString password = passwordGenerator->generatePassword();
entry->setPassword(password);
}
entry->endUpdate();
QString errorMessage;
- if (!db->save(databasePath, &errorMessage, true, false)) {
+ if (!database->save(&errorMessage, true, false)) {
errorTextStream << QObject::tr("Writing the database failed: %1").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
- if (!parser.isSet(Command::QuietOption)) {
- outputTextStream << QObject::tr("Successfully edited entry %1.").arg(entry->title()) << endl;
- }
+ outputTextStream << QObject::tr("Successfully edited entry %1.").arg(entry->title()) << endl;
return EXIT_SUCCESS;
}
diff --git a/src/cli/Edit.h b/src/cli/Edit.h
index 001b5abaf..089a7d886 100644
--- a/src/cli/Edit.h
+++ b/src/cli/Edit.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,14 +18,15 @@
#ifndef KEEPASSXC_EDIT_H
#define KEEPASSXC_EDIT_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class Edit : public Command
+class Edit : public DatabaseCommand
{
public:
Edit();
- ~Edit();
- int execute(const QStringList& arguments) override;
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption TitleOption;
};
#endif // KEEPASSXC_EDIT_H
diff --git a/src/cli/Estimate.cpp b/src/cli/Estimate.cpp
index c278b50f3..a84e23963 100644
--- a/src/cli/Estimate.cpp
+++ b/src/cli/Estimate.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,8 +18,6 @@
#include "Estimate.h"
#include "cli/Utils.h"
-#include <QCommandLineParser>
-
#include "cli/TextStream.h"
#include <stdio.h>
#include <stdlib.h>
@@ -33,16 +31,20 @@
#endif
#endif
+const QCommandLineOption Estimate::AdvancedOption =
+ QCommandLineOption(QStringList() << "a"
+ << "advanced",
+ QObject::tr("Perform advanced analysis on the password."));
+
Estimate::Estimate()
{
name = QString("estimate");
+ optionalArguments.append(
+ {QString("password"), QObject::tr("Password for which to estimate the entropy."), QString("[password]")});
+ options.append(Estimate::AdvancedOption);
description = QObject::tr("Estimate the entropy of a password.");
}
-Estimate::~Estimate()
-{
-}
-
static void estimate(const char* pwd, bool advanced)
{
TextStream out(Utils::STDOUT, QIODevice::WriteOnly);
@@ -156,25 +158,14 @@ static void estimate(const char* pwd, bool advanced)
int Estimate::execute(const QStringList& arguments)
{
- TextStream inputTextStream(Utils::STDIN, QIODevice::ReadOnly);
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("password", QObject::tr("Password for which to estimate the entropy."), "[password]");
- QCommandLineOption advancedOption(QStringList() << "a"
- << "advanced",
- QObject::tr("Perform advanced analysis on the password."));
- parser.addOption(advancedOption);
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() > 1) {
- errorTextStream << parser.helpText().replace("[options]", "estimate [options]");
+ QSharedPointer<QCommandLineParser> parser = getCommandLineParser(arguments);
+ if (parser.isNull()) {
return EXIT_FAILURE;
}
+ TextStream inputTextStream(Utils::STDIN, QIODevice::ReadOnly);
+ const QStringList args = parser->positionalArguments();
+
QString password;
if (args.size() == 1) {
password = args.at(0);
@@ -182,6 +173,6 @@ int Estimate::execute(const QStringList& arguments)
password = inputTextStream.readLine();
}
- estimate(password.toLatin1(), parser.isSet(advancedOption));
+ estimate(password.toLatin1(), parser->isSet(Estimate::AdvancedOption));
return EXIT_SUCCESS;
}
diff --git a/src/cli/Estimate.h b/src/cli/Estimate.h
index c15fed9b3..ac88490df 100644
--- a/src/cli/Estimate.h
+++ b/src/cli/Estimate.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -24,8 +24,9 @@ class Estimate : public Command
{
public:
Estimate();
- ~Estimate();
int execute(const QStringList& arguments) override;
+
+ static const QCommandLineOption AdvancedOption;
};
#endif // KEEPASSXC_ESTIMATE_H
diff --git a/src/cli/Exit.cpp b/src/cli/Exit.cpp
new file mode 100644
index 000000000..768088e4d
--- /dev/null
+++ b/src/cli/Exit.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "Exit.h"
+
+#include <QCommandLineParser>
+#include <QObject>
+#include <QtGlobal>
+
+Exit::Exit(const QString& name)
+{
+ this->name = name;
+ description = QObject::tr("Exit interactive mode.");
+}
+
+int Exit::execute(const QStringList& arguments)
+{
+ Q_UNUSED(arguments)
+ // A placeholder only, behavior is implemented in keepassxc-cli.cpp.
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Exit.h b/src/cli/Exit.h
new file mode 100644
index 000000000..8b0ce41f7
--- /dev/null
+++ b/src/cli/Exit.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_EXIT_H
+#define KEEPASSXC_EXIT_H
+
+#include <QString>
+#include <QStringList>
+
+#include "Command.h"
+
+class Exit : public Command
+{
+public:
+ Exit(const QString& name);
+ int execute(const QStringList& arguments) override;
+};
+
+#endif // KEEPASSXC_EXIT_H
diff --git a/src/cli/Export.cpp b/src/cli/Export.cpp
new file mode 100644
index 000000000..8f63323d7
--- /dev/null
+++ b/src/cli/Export.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 <cstdlib>
+#include <stdio.h>
+
+#include "Export.h"
+
+#include "cli/TextStream.h"
+#include "cli/Utils.h"
+#include "core/Database.h"
+#include "format/CsvExporter.h"
+
+const QCommandLineOption Export::FormatOption =
+ QCommandLineOption(QStringList() << "f"
+ << "format",
+ QObject::tr("Format to use when exporting. Available choices are xml or csv. Defaults to xml."),
+ QStringLiteral("xml|csv"));
+
+Export::Export()
+{
+ name = QStringLiteral("export");
+ options.append(Export::FormatOption);
+ description = QObject::tr("Exports the content of a database to standard output in the specified format.");
+}
+
+int Export::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
+{
+ TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ QString format = parser->value(Export::FormatOption);
+ if (format.isEmpty() || format == QStringLiteral("xml")) {
+ QByteArray xmlData;
+ QString errorMessage;
+ if (!database->extract(xmlData, &errorMessage)) {
+ errorTextStream << QObject::tr("Unable to export database to XML: %1").arg(errorMessage) << endl;
+ return EXIT_FAILURE;
+ }
+ outputTextStream << xmlData.constData() << endl;
+ } else if (format == QStringLiteral("csv")) {
+ CsvExporter csvExporter;
+ outputTextStream << csvExporter.exportDatabase(database);
+ } else {
+ errorTextStream << QObject::tr("Unsupported format %1").arg(format) << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Export.h b/src/cli/Export.h
new file mode 100644
index 000000000..f7f5b8682
--- /dev/null
+++ b/src/cli/Export.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_EXPORT_H
+#define KEEPASSXC_EXPORT_H
+
+#include "DatabaseCommand.h"
+
+class Export : public DatabaseCommand
+{
+public:
+ Export();
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption FormatOption;
+};
+
+#endif // KEEPASSXC_EXPORT_H
diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp
deleted file mode 100644
index 2e4e6f9cd..000000000
--- a/src/cli/Extract.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
- *
- * 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 <cstdlib>
-#include <stdio.h>
-
-#include "Extract.h"
-
-#include <QCommandLineParser>
-#include <QFile>
-
-#include "cli/TextStream.h"
-#include "cli/Utils.h"
-#include "core/Database.h"
-#include "format/KeePass2Reader.h"
-#include "keys/CompositeKey.h"
-#include "keys/FileKey.h"
-#include "keys/PasswordKey.h"
-
-Extract::Extract()
-{
- name = QString("extract");
- description = QObject::tr("Extract and print the content of a database.");
-}
-
-Extract::~Extract()
-{
-}
-
-int Extract::execute(const QStringList& arguments)
-{
- TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database to extract."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 1) {
- errorTextStream << parser.helpText().replace("[options]", "extract [options]");
- return EXIT_FAILURE;
- }
-
- auto compositeKey = QSharedPointer<CompositeKey>::create();
-
- if (!parser.isSet(Command::NoPasswordOption)) {
- if (!parser.isSet(Command::QuietOption)) {
- outputTextStream << QObject::tr("Insert password to unlock %1: ").arg(args.at(0)) << flush;
- }
-
- QString line = Utils::getPassword(parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
- auto passwordKey = QSharedPointer<PasswordKey>::create();
- passwordKey->setPassword(line);
- compositeKey->addKey(passwordKey);
- }
-
- QString keyFilePath = parser.value(Command::KeyFileOption);
- if (!keyFilePath.isEmpty()) {
- // LCOV_EXCL_START
- auto fileKey = QSharedPointer<FileKey>::create();
- QString errorMsg;
- if (!fileKey->load(keyFilePath, &errorMsg)) {
- errorTextStream << QObject::tr("Failed to load key file %1: %2").arg(keyFilePath, errorMsg) << endl;
- return EXIT_FAILURE;
- }
-
- if (fileKey->type() != FileKey::Hashed) {
- errorTextStream << QObject::tr("WARNING: You are using a legacy key file format which may become\n"
- "unsupported in the future.\n\n"
- "Please consider generating a new key file.")
- << endl;
- }
- // LCOV_EXCL_STOP
-
- compositeKey->addKey(fileKey);
- }
-
- const QString& databaseFilename = args.at(0);
- QFile dbFile(databaseFilename);
- if (!dbFile.exists()) {
- errorTextStream << QObject::tr("File %1 does not exist.").arg(databaseFilename) << endl;
- return EXIT_FAILURE;
- }
- if (!dbFile.open(QIODevice::ReadOnly)) {
- errorTextStream << QObject::tr("Unable to open file %1.").arg(databaseFilename) << endl;
- return EXIT_FAILURE;
- }
-
- KeePass2Reader reader;
- reader.setSaveXml(true);
- auto db = QSharedPointer<Database>::create();
- reader.readDatabase(&dbFile, compositeKey, db.data());
-
- QByteArray xmlData = reader.reader()->xmlData();
-
- if (reader.hasError()) {
- if (xmlData.isEmpty()) {
- errorTextStream << QObject::tr("Error while reading the database:\n%1").arg(reader.errorString()) << endl;
- } else {
- errorTextStream << QObject::tr("Error while parsing the database:\n%1").arg(reader.errorString()) << endl;
- }
- return EXIT_FAILURE;
- }
-
- outputTextStream << xmlData.constData() << endl;
-
- return EXIT_SUCCESS;
-}
diff --git a/src/cli/Generate.cpp b/src/cli/Generate.cpp
index e8ca90275..dc4add242 100644
--- a/src/cli/Generate.cpp
+++ b/src/cli/Generate.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -19,120 +19,134 @@
#include <stdio.h>
#include "Generate.h"
+
+#include "cli/TextStream.h"
#include "cli/Utils.h"
-#include <QCommandLineParser>
+const QCommandLineOption Generate::PasswordLengthOption =
+ QCommandLineOption(QStringList() << "L"
+ << "length",
+ QObject::tr("Length of the generated password"),
+ QObject::tr("length"));
-#include "cli/TextStream.h"
-#include "core/PasswordGenerator.h"
+const QCommandLineOption Generate::LowerCaseOption = QCommandLineOption(QStringList() << "l"
+ << "lower",
+ QObject::tr("Use lowercase characters"));
+
+const QCommandLineOption Generate::UpperCaseOption = QCommandLineOption(QStringList() << "U"
+ << "upper",
+ QObject::tr("Use uppercase characters"));
+
+const QCommandLineOption Generate::NumbersOption = QCommandLineOption(QStringList() << "n"
+ << "numeric",
+ QObject::tr("Use numbers"));
+
+const QCommandLineOption Generate::SpecialCharsOption = QCommandLineOption(QStringList() << "s"
+ << "special",
+ QObject::tr("Use special characters"));
+
+const QCommandLineOption Generate::ExtendedAsciiOption = QCommandLineOption(QStringList() << "e"
+ << "extended",
+ QObject::tr("Use extended ASCII"));
+
+const QCommandLineOption Generate::ExcludeCharsOption = QCommandLineOption(QStringList() << "x"
+ << "exclude",
+ QObject::tr("Exclude character set"),
+ QObject::tr("chars"));
+const QCommandLineOption Generate::ExcludeSimilarCharsOption =
+ QCommandLineOption(QStringList() << "exclude-similar", QObject::tr("Exclude similar looking characters"));
+
+const QCommandLineOption Generate::IncludeEveryGroupOption =
+ QCommandLineOption(QStringList() << "every-group", QObject::tr("Include characters from every selected group"));
Generate::Generate()
{
name = QString("generate");
description = QObject::tr("Generate a new random password.");
+ options.append(Generate::PasswordLengthOption);
+ options.append(Generate::LowerCaseOption);
+ options.append(Generate::UpperCaseOption);
+ options.append(Generate::NumbersOption);
+ options.append(Generate::SpecialCharsOption);
+ options.append(Generate::ExtendedAsciiOption);
+ options.append(Generate::ExcludeCharsOption);
+ options.append(Generate::ExcludeSimilarCharsOption);
+ options.append(Generate::IncludeEveryGroupOption);
}
-Generate::~Generate()
-{
-}
-
-int Generate::execute(const QStringList& arguments)
+/**
+ * Creates a password generator instance using the command line options
+ * of the parser object.
+ */
+QSharedPointer<PasswordGenerator> Generate::createGenerator(QSharedPointer<QCommandLineParser> parser)
{
- TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- QCommandLineOption len(QStringList() << "L"
- << "length",
- QObject::tr("Length of the generated password"),
- QObject::tr("length"));
- parser.addOption(len);
- QCommandLineOption lower(QStringList() << "l"
- << "lower",
- QObject::tr("Use lowercase characters"));
- parser.addOption(lower);
- QCommandLineOption upper(QStringList() << "u"
- << "upper",
- QObject::tr("Use uppercase characters"));
- parser.addOption(upper);
- QCommandLineOption numeric(QStringList() << "n"
- << "numeric",
- QObject::tr("Use numbers."));
- parser.addOption(numeric);
- QCommandLineOption special(QStringList() << "s"
- << "special",
- QObject::tr("Use special characters"));
- parser.addOption(special);
- QCommandLineOption extended(QStringList() << "e"
- << "extended",
- QObject::tr("Use extended ASCII"));
- parser.addOption(extended);
- QCommandLineOption exclude(QStringList() << "x"
- << "exclude",
- QObject::tr("Exclude character set"),
- QObject::tr("chars"));
- parser.addOption(exclude);
- QCommandLineOption exclude_similar(QStringList() << "exclude-similar",
- QObject::tr("Exclude similar looking characters"));
- parser.addOption(exclude_similar);
- QCommandLineOption every_group(QStringList() << "every-group",
- QObject::tr("Include characters from every selected group"));
- parser.addOption(every_group);
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (!args.isEmpty()) {
- errorTextStream << parser.helpText().replace("[options]", "generate [options]");
- return EXIT_FAILURE;
- }
-
- PasswordGenerator passwordGenerator;
-
- if (parser.value(len).isEmpty()) {
- passwordGenerator.setLength(PasswordGenerator::DefaultLength);
+ QSharedPointer<PasswordGenerator> passwordGenerator = QSharedPointer<PasswordGenerator>(new PasswordGenerator());
+ QString passwordLength = parser->value(Generate::PasswordLengthOption);
+ if (passwordLength.isEmpty()) {
+ passwordGenerator->setLength(PasswordGenerator::DefaultLength);
+ } else if (passwordLength.toInt() <= 0) {
+ errorTextStream << QObject::tr("Invalid password length %1").arg(passwordLength) << endl;
+ return QSharedPointer<PasswordGenerator>(nullptr);
} else {
- passwordGenerator.setLength(parser.value(len).toInt());
+ passwordGenerator->setLength(passwordLength.toInt());
}
PasswordGenerator::CharClasses classes = 0x0;
- if (parser.isSet(lower)) {
+ if (parser->isSet(Generate::LowerCaseOption)) {
classes |= PasswordGenerator::LowerLetters;
}
- if (parser.isSet(upper)) {
+ if (parser->isSet(Generate::UpperCaseOption)) {
classes |= PasswordGenerator::UpperLetters;
}
- if (parser.isSet(numeric)) {
+ if (parser->isSet(Generate::NumbersOption)) {
classes |= PasswordGenerator::Numbers;
}
- if (parser.isSet(special)) {
+ if (parser->isSet(Generate::SpecialCharsOption)) {
classes |= PasswordGenerator::SpecialCharacters;
}
- if (parser.isSet(extended)) {
+ if (parser->isSet(Generate::ExtendedAsciiOption)) {
classes |= PasswordGenerator::EASCII;
}
PasswordGenerator::GeneratorFlags flags = 0x0;
- if (parser.isSet(exclude_similar)) {
+ if (parser->isSet(Generate::ExcludeSimilarCharsOption)) {
flags |= PasswordGenerator::ExcludeLookAlike;
}
- if (parser.isSet(every_group)) {
+ if (parser->isSet(Generate::IncludeEveryGroupOption)) {
flags |= PasswordGenerator::CharFromEveryGroup;
}
- passwordGenerator.setCharClasses(classes);
- passwordGenerator.setFlags(flags);
- passwordGenerator.setExcludedChars(parser.value(exclude));
+ // The default charset will be used if no explicit class
+ // option was set.
+ passwordGenerator->setCharClasses(classes);
+ passwordGenerator->setFlags(flags);
+ passwordGenerator->setExcludedChars(parser->value(Generate::ExcludeCharsOption));
+
+ if (!passwordGenerator->isValid()) {
+ errorTextStream << QObject::tr("Invalid password generator after applying all options") << endl;
+ return QSharedPointer<PasswordGenerator>(nullptr);
+ }
- if (!passwordGenerator.isValid()) {
- errorTextStream << parser.helpText().replace("[options]", "generate [options]");
+ return passwordGenerator;
+}
+
+int Generate::execute(const QStringList& arguments)
+{
+ QSharedPointer<QCommandLineParser> parser = getCommandLineParser(arguments);
+ if (parser.isNull()) {
return EXIT_FAILURE;
}
- QString password = passwordGenerator.generatePassword();
+ QSharedPointer<PasswordGenerator> passwordGenerator = Generate::createGenerator(parser);
+ if (passwordGenerator.isNull()) {
+ return EXIT_FAILURE;
+ }
+
+ TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ QString password = passwordGenerator->generatePassword();
outputTextStream << password << endl;
return EXIT_SUCCESS;
diff --git a/src/cli/Generate.h b/src/cli/Generate.h
index 64ef81623..c850ef1be 100644
--- a/src/cli/Generate.h
+++ b/src/cli/Generate.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,12 +20,25 @@
#include "Command.h"
+#include "core/PasswordGenerator.h"
+
class Generate : public Command
{
public:
Generate();
- ~Generate();
int execute(const QStringList& arguments) override;
+
+ static QSharedPointer<PasswordGenerator> createGenerator(QSharedPointer<QCommandLineParser> parser);
+
+ static const QCommandLineOption PasswordLengthOption;
+ static const QCommandLineOption LowerCaseOption;
+ static const QCommandLineOption UpperCaseOption;
+ static const QCommandLineOption NumbersOption;
+ static const QCommandLineOption SpecialCharsOption;
+ static const QCommandLineOption ExtendedAsciiOption;
+ static const QCommandLineOption ExcludeCharsOption;
+ static const QCommandLineOption ExcludeSimilarCharsOption;
+ static const QCommandLineOption IncludeEveryGroupOption;
};
#endif // KEEPASSXC_GENERATE_H
diff --git a/src/cli/Help.cpp b/src/cli/Help.cpp
new file mode 100644
index 000000000..193f55dd7
--- /dev/null
+++ b/src/cli/Help.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "Help.h"
+
+#include "Command.h"
+#include "TextStream.h"
+#include "Utils.h"
+
+Help::Help()
+{
+ name = QString("help");
+ description = QObject::tr("Display command help.");
+}
+
+int Help::execute(const QStringList& arguments)
+{
+ TextStream out(Utils::STDERR, QIODevice::WriteOnly);
+ QSharedPointer<Command> command;
+ if (arguments.size() > 1 && (command = Commands::getCommand(arguments.at(1)))) {
+ out << command->getHelpText();
+ } else {
+ out << "\n\n" << QObject::tr("Available commands:") << "\n";
+ for (auto& cmd : Commands::getCommands()) {
+ out << cmd->getDescriptionLine();
+ }
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Help.h b/src/cli/Help.h
new file mode 100644
index 000000000..162f8ba98
--- /dev/null
+++ b/src/cli/Help.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_HELP_H
+#define KEEPASSXC_HELP_H
+
+#include "Command.h"
+
+class Help : public Command
+{
+public:
+ Help();
+ ~Help() override = default;
+ int execute(const QStringList& arguments) override;
+};
+
+#endif // KEEPASSXC_HELP_H
diff --git a/src/cli/Import.cpp b/src/cli/Import.cpp
new file mode 100644
index 000000000..ff6fb266b
--- /dev/null
+++ b/src/cli/Import.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 <cstdlib>
+#include <stdio.h>
+
+#include <QFileInfo>
+#include <QString>
+#include <QTextStream>
+
+#include "Import.h"
+
+#include "cli/TextStream.h"
+#include "cli/Utils.h"
+#include "core/Database.h"
+#include "keys/CompositeKey.h"
+#include "keys/Key.h"
+
+/**
+ * Create a database file from an XML export of another database.
+ * A password can be specified to encrypt the database.
+ * If none is specified the function will fail.
+ *
+ * If the database is being saved in a non existant directory, the
+ * function will fail.
+ *
+ * @return EXIT_SUCCESS on success, or EXIT_FAILURE on failure
+ */
+Import::Import()
+{
+ name = QString("import");
+ description = QObject::tr("Import the contents of an XML database.");
+ positionalArguments.append({QString("xml"), QObject::tr("Path of the XML database export."), QString("")});
+ positionalArguments.append({QString("database"), QObject::tr("Path of the new database."), QString("")});
+}
+
+int Import::execute(const QStringList& arguments)
+{
+ QSharedPointer<QCommandLineParser> parser = getCommandLineParser(arguments);
+ if (parser.isNull()) {
+ return EXIT_FAILURE;
+ }
+
+ TextStream outputTextStream(parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
+ QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ const QStringList args = parser->positionalArguments();
+ const QString xmlExportPath = args.at(0);
+ const QString dbPath = args.at(1);
+
+ if (QFileInfo::exists(dbPath)) {
+ errorTextStream << QObject::tr("File %1 already exists.").arg(dbPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ auto key = QSharedPointer<CompositeKey>::create();
+
+ auto password = Utils::getPasswordFromStdin();
+ if (!password.isNull()) {
+ key->addKey(password);
+ }
+
+ if (key->isEmpty()) {
+ errorTextStream << QObject::tr("No key is set. Aborting database creation.") << endl;
+ return EXIT_FAILURE;
+ }
+
+ QString errorMessage;
+ Database db;
+ db.setKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2));
+ db.setKey(key);
+
+ if (!db.import(xmlExportPath, &errorMessage)) {
+ errorTextStream << QObject::tr("Unable to import XML database export %1").arg(errorMessage) << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (!db.saveAs(dbPath, &errorMessage, true, false)) {
+ errorTextStream << QObject::tr("Failed to save the database: %1.").arg(errorMessage) << endl;
+ return EXIT_FAILURE;
+ }
+
+ outputTextStream << QObject::tr("Successfully imported database.") << endl;
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Import.h b/src/cli/Import.h
new file mode 100644
index 000000000..0f899ac12
--- /dev/null
+++ b/src/cli/Import.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_IMPORT_H
+#define KEEPASSXC_IMPORT_H
+
+#include "Command.h"
+
+class Import : public Command
+{
+public:
+ Import();
+ int execute(const QStringList& arguments) override;
+};
+
+#endif // KEEPASSXC_IMPORT_H
diff --git a/src/cli/List.cpp b/src/cli/List.cpp
index 52797470c..62e67aed8 100644
--- a/src/cli/List.cpp
+++ b/src/cli/List.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -21,81 +21,52 @@
#include "List.h"
#include "cli/Utils.h"
-#include <QCommandLineParser>
-
#include "cli/TextStream.h"
#include "core/Database.h"
#include "core/Entry.h"
#include "core/Group.h"
+const QCommandLineOption List::RecursiveOption =
+ QCommandLineOption(QStringList() << "R"
+ << "recursive",
+ QObject::tr("Recursively list the elements of the group."));
+
+const QCommandLineOption List::FlattenOption = QCommandLineOption(QStringList() << "f"
+ << "flatten",
+ QObject::tr("Flattens the output to single lines."));
+
List::List()
{
name = QString("ls");
description = QObject::tr("List database entries.");
+ options.append(List::RecursiveOption);
+ options.append(List::FlattenOption);
+ optionalArguments.append(
+ {QString("group"), QObject::tr("Path of the group to list. Default is /"), QString("[group]")});
}
-List::~List()
-{
-}
-
-int List::execute(const QStringList& arguments)
-{
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addPositionalArgument("group", QObject::tr("Path of the group to list. Default is /"), "[group]");
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
-
- QCommandLineOption recursiveOption(QStringList() << "R"
- << "recursive",
- QObject::tr("Recursively list the elements of the group."));
- parser.addOption(recursiveOption);
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 1 && args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "ls [options]");
- return EXIT_FAILURE;
- }
-
- bool recursive = parser.isSet(recursiveOption);
-
- auto db = Utils::unlockDatabase(args.at(0),
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
- return EXIT_FAILURE;
- }
-
- if (args.size() == 2) {
- return listGroup(db.data(), recursive, args.at(1));
- }
- return listGroup(db.data(), recursive);
-}
-
-int List::listGroup(Database* database, bool recursive, const QString& groupPath)
+int List::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
- if (groupPath.isEmpty()) {
- outputTextStream << database->rootGroup()->print(recursive) << flush;
+ const QStringList args = parser->positionalArguments();
+ bool recursive = parser->isSet(List::RecursiveOption);
+ bool flatten = parser->isSet(List::FlattenOption);
+
+ // No group provided, defaulting to root group.
+ if (args.size() == 1) {
+ outputTextStream << database->rootGroup()->print(recursive, flatten) << flush;
return EXIT_SUCCESS;
}
+ QString groupPath = args.at(1);
Group* group = database->rootGroup()->findGroupByPath(groupPath);
if (!group) {
errorTextStream << QObject::tr("Cannot find group %1.").arg(groupPath) << endl;
return EXIT_FAILURE;
}
- outputTextStream << group->print(recursive) << flush;
+ outputTextStream << group->print(recursive, flatten) << flush;
return EXIT_SUCCESS;
}
diff --git a/src/cli/List.h b/src/cli/List.h
index 92ade262b..2f09b6727 100644
--- a/src/cli/List.h
+++ b/src/cli/List.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,15 +18,17 @@
#ifndef KEEPASSXC_LIST_H
#define KEEPASSXC_LIST_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class List : public Command
+class List : public DatabaseCommand
{
public:
List();
- ~List();
- int execute(const QStringList& arguments) override;
- int listGroup(Database* database, bool recursive, const QString& groupPath = {});
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption RecursiveOption;
+ static const QCommandLineOption FlattenOption;
};
#endif // KEEPASSXC_LIST_H
diff --git a/src/cli/Locate.cpp b/src/cli/Locate.cpp
index af5f24196..eeb37d803 100644
--- a/src/cli/Locate.cpp
+++ b/src/cli/Locate.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,7 +20,6 @@
#include "Locate.h"
-#include <QCommandLineParser>
#include <QStringList>
#include "cli/TextStream.h"
@@ -34,46 +33,14 @@ Locate::Locate()
{
name = QString("locate");
description = QObject::tr("Find entries quickly.");
+ positionalArguments.append({QString("term"), QObject::tr("Search term."), QString("")});
}
-Locate::~Locate()
+int Locate::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
-}
-
-int Locate::execute(const QStringList& arguments)
-{
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addPositionalArgument("term", QObject::tr("Search term."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "locate [options]");
- return EXIT_FAILURE;
- }
-
- auto db = Utils::unlockDatabase(args.at(0),
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
- return EXIT_FAILURE;
- }
- return locateEntry(db.data(), args.at(1));
-}
-
-int Locate::locateEntry(Database* database, const QString& searchTerm)
-{
+ const QStringList args = parser->positionalArguments();
+ QString searchTerm = args.at(1);
TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
diff --git a/src/cli/Locate.h b/src/cli/Locate.h
index ae32951b9..66419614e 100644
--- a/src/cli/Locate.h
+++ b/src/cli/Locate.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,15 +18,14 @@
#ifndef KEEPASSXC_LOCATE_H
#define KEEPASSXC_LOCATE_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class Locate : public Command
+class Locate : public DatabaseCommand
{
public:
Locate();
- ~Locate();
- int execute(const QStringList& arguments) override;
- int locateEntry(Database* database, const QString& searchTerm);
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
};
#endif // KEEPASSXC_LOCATE_H
diff --git a/src/cli/Merge.cpp b/src/cli/Merge.cpp
index 2356f5d3a..f02794a4b 100644
--- a/src/cli/Merge.cpp
+++ b/src/cli/Merge.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -15,79 +15,69 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "Merge.h"
+#include <cstdlib>
-#include <QCommandLineParser>
+#include "Merge.h"
#include "cli/TextStream.h"
#include "cli/Utils.h"
#include "core/Database.h"
#include "core/Merger.h"
-#include <cstdlib>
+const QCommandLineOption Merge::SameCredentialsOption =
+ QCommandLineOption(QStringList() << "s"
+ << "same-credentials",
+ QObject::tr("Use the same credentials for both database files."));
+const QCommandLineOption Merge::KeyFileFromOption =
+ QCommandLineOption(QStringList() << "k"
+ << "key-file-from",
+ QObject::tr("Key file of the database to merge from."),
+ QObject::tr("path"));
+
+const QCommandLineOption Merge::NoPasswordFromOption =
+ QCommandLineOption(QStringList() << "no-password-from",
+ QObject::tr("Deactivate password key for the database to merge from."));
+
+const QCommandLineOption Merge::DryRunOption =
+ QCommandLineOption(QStringList() << "dry-run",
+ QObject::tr("Only print the changes detected by the merge operation."));
+
+const QCommandLineOption Merge::YubiKeyFromOption(QStringList() << "yubikey-from",
+ QObject::tr("Yubikey slot for the second database."),
+ QObject::tr("slot"));
Merge::Merge()
{
name = QString("merge");
description = QObject::tr("Merge two databases.");
+ options.append(Merge::SameCredentialsOption);
+ options.append(Merge::KeyFileFromOption);
+ options.append(Merge::NoPasswordFromOption);
+ options.append(Merge::DryRunOption);
+#ifdef WITH_XC_YUBIKEY
+ options.append(Merge::YubiKeyFromOption);
+#endif
+ positionalArguments.append({QString("database2"), QObject::tr("Path of the database to merge from."), QString("")});
}
-Merge::~Merge()
-{
-}
-
-int Merge::execute(const QStringList& arguments)
+int Merge::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
- TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream outputTextStream(parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
+ QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database1", QObject::tr("Path of the database to merge into."));
- parser.addPositionalArgument("database2", QObject::tr("Path of the database to merge from."));
- parser.addOption(Command::QuietOption);
-
- QCommandLineOption samePasswordOption(QStringList() << "s"
- << "same-credentials",
- QObject::tr("Use the same credentials for both database files."));
- parser.addOption(samePasswordOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
-
- QCommandLineOption keyFileFromOption(QStringList() << "f"
- << "key-file-from",
- QObject::tr("Key file of the database to merge from."),
- QObject::tr("path"));
- parser.addOption(keyFileFromOption);
-
- QCommandLineOption noPasswordFromOption(QStringList() << "no-password-from",
- QObject::tr("Deactivate password key for the database to merge from."));
- parser.addOption(noPasswordFromOption);
-
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "merge [options]");
- return EXIT_FAILURE;
- }
+ const QStringList args = parser->positionalArguments();
- auto db1 = Utils::unlockDatabase(args.at(0),
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db1) {
- return EXIT_FAILURE;
- }
+ auto& toDatabasePath = args.at(0);
+ auto& fromDatabasePath = args.at(1);
QSharedPointer<Database> db2;
- if (!parser.isSet("same-credentials")) {
- db2 = Utils::unlockDatabase(args.at(1),
- !parser.isSet(noPasswordFromOption),
- parser.value(keyFileFromOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
+ if (!parser->isSet(Merge::SameCredentialsOption)) {
+ db2 = Utils::unlockDatabase(fromDatabasePath,
+ !parser->isSet(Merge::NoPasswordFromOption),
+ parser->value(Merge::KeyFileFromOption),
+ parser->value(Merge::YubiKeyFromOption),
+ parser->isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);
if (!db2) {
return EXIT_FAILURE;
@@ -95,26 +85,29 @@ int Merge::execute(const QStringList& arguments)
} else {
db2 = QSharedPointer<Database>::create();
QString errorMessage;
- if (!db2->open(args.at(1), db1->key(), &errorMessage, false)) {
+ if (!db2->open(fromDatabasePath, database->key(), &errorMessage, false)) {
errorTextStream << QObject::tr("Error reading merge file:\n%1").arg(errorMessage);
return EXIT_FAILURE;
}
}
- Merger merger(db2.data(), db1.data());
- bool databaseChanged = merger.merge();
+ Merger merger(db2.data(), database.data());
+ QStringList changeList = merger.merge();
- if (databaseChanged) {
+ for (auto& mergeChange : changeList) {
+ outputTextStream << "\t" << mergeChange << endl;
+ }
+
+ if (!changeList.isEmpty() && !parser->isSet(Merge::DryRunOption)) {
QString errorMessage;
- if (!db1->save(args.at(0), &errorMessage, true, false)) {
+ if (!database->save(&errorMessage, true, false)) {
errorTextStream << QObject::tr("Unable to save database to file : %1").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
- if (!parser.isSet(Command::QuietOption)) {
- outputTextStream << "Successfully merged the database files." << endl;
- }
- } else if (!parser.isSet(Command::QuietOption)) {
- outputTextStream << "Database was not modified by merge operation." << endl;
+ outputTextStream << QObject::tr("Successfully merged %1 into %2.").arg(fromDatabasePath, toDatabasePath)
+ << endl;
+ } else {
+ outputTextStream << QObject::tr("Database was not modified by merge operation.") << endl;
}
return EXIT_SUCCESS;
diff --git a/src/cli/Merge.h b/src/cli/Merge.h
index 1f138b65f..e9d19f1fc 100644
--- a/src/cli/Merge.h
+++ b/src/cli/Merge.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,14 +18,20 @@
#ifndef KEEPASSXC_MERGE_H
#define KEEPASSXC_MERGE_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class Merge : public Command
+class Merge : public DatabaseCommand
{
public:
Merge();
- ~Merge();
- int execute(const QStringList& arguments) override;
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+
+ static const QCommandLineOption SameCredentialsOption;
+ static const QCommandLineOption KeyFileFromOption;
+ static const QCommandLineOption NoPasswordFromOption;
+ static const QCommandLineOption YubiKeyFromOption;
+ static const QCommandLineOption DryRunOption;
};
#endif // KEEPASSXC_MERGE_H
diff --git a/src/cli/Move.cpp b/src/cli/Move.cpp
new file mode 100644
index 000000000..7a18383ed
--- /dev/null
+++ b/src/cli/Move.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 <cstdlib>
+#include <stdio.h>
+
+#include "Move.h"
+
+#include "cli/TextStream.h"
+#include "cli/Utils.h"
+#include "core/Database.h"
+#include "core/Entry.h"
+#include "core/Group.h"
+
+Move::Move()
+{
+ name = QString("mv");
+ description = QObject::tr("Moves an entry to a new group.");
+ positionalArguments.append({QString("entry"), QObject::tr("Path of the entry to move."), QString("")});
+ positionalArguments.append({QString("group"), QObject::tr("Path of the destination group."), QString("")});
+}
+
+Move::~Move()
+{
+}
+
+int Move::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
+{
+ TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ const QStringList args = parser->positionalArguments();
+ const QString& entryPath = args.at(1);
+ const QString& destinationPath = args.at(2);
+
+ Entry* entry = database->rootGroup()->findEntryByPath(entryPath);
+ if (!entry) {
+ errorTextStream << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ Group* destinationGroup = database->rootGroup()->findGroupByPath(destinationPath);
+ if (!destinationGroup) {
+ errorTextStream << QObject::tr("Could not find group with path %1.").arg(destinationPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (destinationGroup == entry->parent()) {
+ errorTextStream << QObject::tr("Entry is already in group %1.").arg(destinationPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ entry->beginUpdate();
+ entry->setGroup(destinationGroup);
+ entry->endUpdate();
+
+ QString errorMessage;
+ if (!database->save(&errorMessage, true, false)) {
+ errorTextStream << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
+ return EXIT_FAILURE;
+ }
+
+ outputTextStream << QObject::tr("Successfully moved entry %1 to group %2.").arg(entry->title(), destinationPath)
+ << endl;
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Move.h b/src/cli/Move.h
new file mode 100644
index 000000000..c506085a5
--- /dev/null
+++ b/src/cli/Move.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_MOVE_H
+#define KEEPASSXC_MOVE_H
+
+#include "DatabaseCommand.h"
+
+class Move : public DatabaseCommand
+{
+public:
+ Move();
+ ~Move();
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
+};
+
+#endif // KEEPASSXC_MOVE_H
diff --git a/src/cli/Open.cpp b/src/cli/Open.cpp
new file mode 100644
index 000000000..c4e9a79ad
--- /dev/null
+++ b/src/cli/Open.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "Open.h"
+
+#include <QCommandLineParser>
+
+#include "DatabaseCommand.h"
+#include "TextStream.h"
+#include "Utils.h"
+
+Open::Open()
+{
+ name = QString("open");
+ description = QObject::tr("Open a database.");
+}
+
+int Open::execute(const QStringList& arguments)
+{
+ currentDatabase.reset(nullptr);
+ return this->DatabaseCommand::execute(arguments);
+}
+
+int Open::executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser)
+{
+ Q_UNUSED(parser)
+ currentDatabase = db;
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/Open.h b/src/cli/Open.h
new file mode 100644
index 000000000..786c4d09f
--- /dev/null
+++ b/src/cli/Open.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_OPEN_H
+#define KEEPASSXC_OPEN_H
+
+#include "DatabaseCommand.h"
+
+class Open : public DatabaseCommand
+{
+public:
+ Open();
+ int execute(const QStringList& arguments) override;
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
+};
+
+#endif // KEEPASSXC_OPEN_H
diff --git a/src/cli/Remove.cpp b/src/cli/Remove.cpp
index bb2374e9a..e0dc0d58a 100644
--- a/src/cli/Remove.cpp
+++ b/src/cli/Remove.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,10 +20,6 @@
#include "Remove.h"
-#include <QCommandLineParser>
-#include <QCoreApplication>
-#include <QStringList>
-
#include "cli/TextStream.h"
#include "cli/Utils.h"
#include "core/Database.h"
@@ -36,46 +32,14 @@ Remove::Remove()
{
name = QString("rm");
description = QString("Remove an entry from the database.");
+ positionalArguments.append({QString("entry"), QObject::tr("Path of the entry to remove."), QString("")});
}
-Remove::~Remove()
-{
-}
-
-int Remove::execute(const QStringList& arguments)
+int Remove::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(QObject::tr("Remove an entry from the database."));
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
- parser.addPositionalArgument("entry", QObject::tr("Path of the entry to remove."));
- parser.addHelpOption();
- parser.process(arguments);
+ bool quiet = parser->isSet(Command::QuietOption);
+ auto& entryPath = parser->positionalArguments().at(1);
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "rm [options]");
- return EXIT_FAILURE;
- }
-
- auto db = Utils::unlockDatabase(args.at(0),
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
- return EXIT_FAILURE;
- }
-
- return removeEntry(db.data(), args.at(0), args.at(1), parser.isSet(Command::QuietOption));
-}
-
-int Remove::removeEntry(Database* database, const QString& databasePath, const QString& entryPath, bool quiet)
-{
TextStream outputTextStream(quiet ? Utils::DEVNULL : Utils::STDOUT, QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
@@ -96,7 +60,7 @@ int Remove::removeEntry(Database* database, const QString& databasePath, const Q
};
QString errorMessage;
- if (!database->save(databasePath, &errorMessage, true, false)) {
+ if (!database->save(&errorMessage, true, false)) {
errorTextStream << QObject::tr("Unable to save database to file: %1").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
diff --git a/src/cli/Remove.h b/src/cli/Remove.h
index fa8bc7bd6..6019bfa16 100644
--- a/src/cli/Remove.h
+++ b/src/cli/Remove.h
@@ -18,17 +18,14 @@
#ifndef KEEPASSXC_REMOVE_H
#define KEEPASSXC_REMOVE_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-#include "core/Database.h"
-
-class Remove : public Command
+class Remove : public DatabaseCommand
{
public:
Remove();
- ~Remove();
- int execute(const QStringList& arguments) override;
- int removeEntry(Database* database, const QString& databasePath, const QString& entryPath, bool quiet);
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
};
#endif // KEEPASSXC_REMOVE_H
diff --git a/src/cli/RemoveGroup.cpp b/src/cli/RemoveGroup.cpp
new file mode 100644
index 000000000..b65ae1974
--- /dev/null
+++ b/src/cli/RemoveGroup.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 <cstdlib>
+#include <stdio.h>
+
+#include "RemoveGroup.h"
+
+#include "cli/TextStream.h"
+#include "cli/Utils.h"
+#include "core/Database.h"
+#include "core/Entry.h"
+#include "core/Group.h"
+#include "core/Metadata.h"
+#include "core/Tools.h"
+
+RemoveGroup::RemoveGroup()
+{
+ name = QString("rmdir");
+ description = QString("Removes a group from a database.");
+ positionalArguments.append({QString("group"), QObject::tr("Path of the group to remove."), QString("")});
+}
+
+RemoveGroup::~RemoveGroup()
+{
+}
+
+int RemoveGroup::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
+{
+ bool quiet = parser->isSet(Command::QuietOption);
+ QString groupPath = parser->positionalArguments().at(1);
+
+ TextStream outputTextStream(quiet ? Utils::DEVNULL : Utils::STDOUT, QIODevice::WriteOnly);
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ // Recursive option means were looking for a group to remove.
+ QPointer<Group> group = database->rootGroup()->findGroupByPath(groupPath);
+ if (!group) {
+ errorTextStream << QObject::tr("Group %1 not found.").arg(groupPath) << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (group == database->rootGroup()) {
+ errorTextStream << QObject::tr("Cannot remove root group from database.") << endl;
+ return EXIT_FAILURE;
+ }
+
+ bool recycled = true;
+ auto* recycleBin = database->metadata()->recycleBin();
+ if (!database->metadata()->recycleBinEnabled() || (recycleBin && recycleBin->findGroupByUuid(group->uuid()))) {
+ delete group;
+ recycled = false;
+ } else {
+ database->recycleGroup(group);
+ };
+
+ QString errorMessage;
+ if (!database->save(&errorMessage, true, false)) {
+ errorTextStream << QObject::tr("Unable to save database to file: %1").arg(errorMessage) << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (recycled) {
+ outputTextStream << QObject::tr("Successfully recycled group %1.").arg(groupPath) << endl;
+ } else {
+ outputTextStream << QObject::tr("Successfully deleted group %1.").arg(groupPath) << endl;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/cli/RemoveGroup.h b/src/cli/RemoveGroup.h
new file mode 100644
index 000000000..2b5194665
--- /dev/null
+++ b/src/cli/RemoveGroup.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_REMOVEGROUP_H
+#define KEEPASSXC_REMOVEGROUP_H
+
+#include "DatabaseCommand.h"
+
+class RemoveGroup : public DatabaseCommand
+{
+public:
+ RemoveGroup();
+ ~RemoveGroup();
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
+};
+
+#endif // KEEPASSXC_REMOVEGROUP_H
diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp
index 3abccd79c..7da1c871c 100644
--- a/src/cli/Show.cpp
+++ b/src/cli/Show.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -20,8 +20,6 @@
#include <cstdlib>
#include <stdio.h>
-#include <QCommandLineParser>
-
#include "Utils.h"
#include "cli/TextStream.h"
#include "core/Database.h"
@@ -29,67 +27,38 @@
#include "core/Global.h"
#include "core/Group.h"
+const QCommandLineOption Show::TotpOption = QCommandLineOption(QStringList() << "t"
+ << "totp",
+ QObject::tr("Show the entry's current TOTP."));
+
+const QCommandLineOption Show::AttributesOption = QCommandLineOption(
+ QStringList() << "a"
+ << "attributes",
+ QObject::tr(
+ "Names of the attributes to show. "
+ "This option can be specified more than once, with each attribute shown one-per-line in the given order. "
+ "If no attributes are specified, a summary of the default attributes is given."),
+ QObject::tr("attribute"));
+
Show::Show()
{
name = QString("show");
description = QObject::tr("Show an entry's information.");
+ options.append(Show::TotpOption);
+ options.append(Show::AttributesOption);
+ positionalArguments.append({QString("entry"), QObject::tr("Name of the entry to show."), QString("")});
}
-Show::~Show()
-{
-}
-
-int Show::execute(const QStringList& arguments)
-{
- TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
-
- QCommandLineParser parser;
- parser.setApplicationDescription(description);
- parser.addPositionalArgument("database", QObject::tr("Path of the database."));
- parser.addOption(Command::QuietOption);
- parser.addOption(Command::KeyFileOption);
- parser.addOption(Command::NoPasswordOption);
-
- QCommandLineOption totp(QStringList() << "t"
- << "totp",
- QObject::tr("Show the entry's current TOTP."));
- parser.addOption(totp);
- QCommandLineOption attributes(
- QStringList() << "a"
- << "attributes",
- QObject::tr(
- "Names of the attributes to show. "
- "This option can be specified more than once, with each attribute shown one-per-line in the given order. "
- "If no attributes are specified, a summary of the default attributes is given."),
- QObject::tr("attribute"));
- parser.addOption(attributes);
- parser.addPositionalArgument("entry", QObject::tr("Name of the entry to show."));
- parser.addHelpOption();
- parser.process(arguments);
-
- const QStringList args = parser.positionalArguments();
- if (args.size() != 2) {
- errorTextStream << parser.helpText().replace("[options]", "show [options]");
- return EXIT_FAILURE;
- }
-
- auto db = Utils::unlockDatabase(args.at(0),
- !parser.isSet(Command::NoPasswordOption),
- parser.value(Command::KeyFileOption),
- parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
- Utils::STDERR);
- if (!db) {
- return EXIT_FAILURE;
- }
-
- return showEntry(db.data(), parser.values(attributes), parser.isSet(totp), args.at(1));
-}
-
-int Show::showEntry(Database* database, QStringList attributes, bool showTotp, const QString& entryPath)
+int Show::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly);
TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+ const QStringList args = parser->positionalArguments();
+ const QString& entryPath = args.at(1);
+ bool showTotp = parser->isSet(Show::TotpOption);
+ QStringList attributes = parser->values(Show::AttributesOption);
+
Entry* entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
errorTextStream << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
diff --git a/src/cli/Show.h b/src/cli/Show.h
index 32dab7efb..03700b465 100644
--- a/src/cli/Show.h
+++ b/src/cli/Show.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -18,15 +18,17 @@
#ifndef KEEPASSXC_SHOW_H
#define KEEPASSXC_SHOW_H
-#include "Command.h"
+#include "DatabaseCommand.h"
-class Show : public Command
+class Show : public DatabaseCommand
{
public:
Show();
- ~Show();
- int execute(const QStringList& arguments) override;
- int showEntry(Database* database, QStringList attributes, bool showTotp, const QString& entryPath);
+
+ int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
+
+ static const QCommandLineOption TotpOption;
+ static const QCommandLineOption AttributesOption;
};
#endif // KEEPASSXC_SHOW_H
diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp
index 06d2bcf23..9988b60f9 100644
--- a/src/cli/Utils.cpp
+++ b/src/cli/Utils.cpp
@@ -24,7 +24,9 @@
#include <unistd.h>
#endif
+#include <QFileInfo>
#include <QProcess>
+#include <QScopedPointer>
namespace Utils
{
@@ -100,6 +102,7 @@ namespace Utils
QSharedPointer<Database> unlockDatabase(const QString& databaseFilename,
const bool isPasswordProtected,
const QString& keyFilename,
+ const QString& yubiKeySlot,
FILE* outputDescriptor,
FILE* errorDescriptor)
{
@@ -107,8 +110,24 @@ namespace Utils
TextStream out(outputDescriptor);
TextStream err(errorDescriptor);
+ QFileInfo dbFileInfo(databaseFilename);
+ if (dbFileInfo.canonicalFilePath().isEmpty()) {
+ err << QObject::tr("Failed to open database file %1: not found").arg(databaseFilename) << endl;
+ return {};
+ }
+
+ if (!dbFileInfo.isFile()) {
+ err << QObject::tr("Failed to open database file %1: not a plain file").arg(databaseFilename) << endl;
+ return {};
+ }
+
+ if (!dbFileInfo.isReadable()) {
+ err << QObject::tr("Failed to open database file %1: not readable").arg(databaseFilename) << endl;
+ return {};
+ }
+
if (isPasswordProtected) {
- out << QObject::tr("Insert password to unlock %1: ").arg(databaseFilename) << flush;
+ out << QObject::tr("Enter password to unlock %1: ").arg(databaseFilename) << flush;
QString line = Utils::getPassword(outputDescriptor);
auto passwordKey = QSharedPointer<PasswordKey>::create();
passwordKey->setPassword(line);
@@ -135,6 +154,33 @@ namespace Utils
compositeKey->addKey(fileKey);
}
+#ifdef WITH_XC_YUBIKEY
+ if (!yubiKeySlot.isEmpty()) {
+ bool ok = false;
+ int slot = yubiKeySlot.toInt(&ok, 10);
+ if (!ok || (slot != 1 && slot != 2)) {
+ err << QObject::tr("Invalid YubiKey slot %1").arg(yubiKeySlot) << endl;
+ return {};
+ }
+
+ QString errorMessage;
+ bool blocking = YubiKey::instance()->checkSlotIsBlocking(slot, errorMessage);
+ if (!errorMessage.isEmpty()) {
+ err << errorMessage << endl;
+ return {};
+ }
+
+ auto key = QSharedPointer<YkChallengeResponseKeyCLI>(new YkChallengeResponseKeyCLI(
+ slot,
+ blocking,
+ QObject::tr("Please touch the button on your YubiKey to unlock %1").arg(databaseFilename),
+ outputDescriptor));
+ compositeKey->addChallengeResponseKey(key);
+ }
+#else
+ Q_UNUSED(yubiKeySlot);
+#endif // WITH_XC_YUBIKEY
+
auto db = QSharedPointer<Database>::create();
QString error;
if (db->open(databaseFilename, compositeKey, &error, false)) {
@@ -163,7 +209,7 @@ namespace Utils
return password;
}
- TextStream in(STDIN, QIODevice::ReadOnly);
+ static TextStream in(STDIN, QIODevice::ReadOnly);
setStdinEcho(false);
QString line = in.readLine();
@@ -174,6 +220,28 @@ namespace Utils
}
/**
+ * Read optional password from stdin.
+ *
+ * @return Pointer to the PasswordKey or null if passwordkey is skipped
+ * by user
+ */
+ QSharedPointer<PasswordKey> getPasswordFromStdin()
+ {
+ QSharedPointer<PasswordKey> passwordKey;
+ QTextStream out(Utils::STDOUT, QIODevice::WriteOnly);
+
+ out << QObject::tr("Enter password to encrypt database (optional): ");
+ out.flush();
+ QString password = Utils::getPassword();
+
+ if (!password.isEmpty()) {
+ passwordKey = QSharedPointer<PasswordKey>(new PasswordKey(password));
+ }
+
+ return passwordKey;
+ }
+
+ /**
* A valid and running event loop is needed to use the global QClipboard,
* so we need to use this from the CLI.
*/
@@ -205,7 +273,7 @@ namespace Utils
return EXIT_FAILURE;
}
- auto* clipProcess = new QProcess(nullptr);
+ QScopedPointer<QProcess> clipProcess(new QProcess(nullptr));
clipProcess->start(programName, arguments);
clipProcess->waitForStarted();
@@ -225,4 +293,42 @@ namespace Utils
return clipProcess->exitCode();
}
+ /**
+ * Splits the given QString into a QString list. For example:
+ *
+ * "hello world" -> ["hello", "world"]
+ * "hello world" -> ["hello", "world"]
+ * "hello\\ world" -> ["hello world"] (i.e. backslash is an escape character
+ * "\"hello world\"" -> ["hello world"]
+ */
+ QStringList splitCommandString(const QString& command)
+ {
+ QStringList result;
+
+ bool insideQuotes = false;
+ QString cur;
+ for (int i = 0; i < command.size(); ++i) {
+ QChar c = command[i];
+ if (c == '\\' && i < command.size() - 1) {
+ cur.append(command[i + 1]);
+ ++i;
+ } else if (!insideQuotes && (c == ' ' || c == '\t')) {
+ if (!cur.isEmpty()) {
+ result.append(cur);
+ cur.clear();
+ }
+ } else if (c == '"' && (insideQuotes || i == 0 || command[i - 1].isSpace())) {
+ insideQuotes = !insideQuotes;
+ } else {
+ cur.append(c);
+ }
+ }
+
+ if (!cur.isEmpty()) {
+ result.append(cur);
+ }
+
+ return result;
+ }
+
} // namespace Utils
diff --git a/src/cli/Utils.h b/src/cli/Utils.h
index bd89a2a5c..b7fa63acf 100644
--- a/src/cli/Utils.h
+++ b/src/cli/Utils.h
@@ -25,6 +25,12 @@
#include "keys/PasswordKey.h"
#include <QtCore/qglobal.h>
+#ifdef WITH_XC_YUBIKEY
+#include "keys/YkChallengeResponseKey.h"
+#include "keys/YkChallengeResponseKeyCLI.h"
+#include "keys/drivers/YubiKey.h"
+#endif
+
namespace Utils
{
extern FILE* STDOUT;
@@ -34,13 +40,17 @@ namespace Utils
void setStdinEcho(bool enable);
QString getPassword(FILE* outputDescriptor = STDOUT);
+ QSharedPointer<PasswordKey> getPasswordFromStdin();
int clipText(const QString& text);
QSharedPointer<Database> unlockDatabase(const QString& databaseFilename,
const bool isPasswordProtected = true,
const QString& keyFilename = {},
+ const QString& yubiKeySlot = {},
FILE* outputDescriptor = STDOUT,
FILE* errorDescriptor = STDERR);
+ QStringList splitCommandString(const QString& command);
+
namespace Test
{
void setNextPassword(const QString& password);
diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1
deleted file mode 100644
index bd7f5d5c5..000000000
--- a/src/cli/keepassxc-cli.1
+++ /dev/null
@@ -1,183 +0,0 @@
-.TH KEEPASSXC-CLI 1 "Nov 04, 2018"
-
-.SH NAME
-keepassxc-cli \- command line interface for the \fBKeePassXC\fP password manager.
-
-.SH SYNOPSIS
-.B keepassxc-cli
-.I command
-.RI [ options ]
-
-.SH DESCRIPTION
-\fBkeepassxc-cli\fP is the command line interface for the \fBKeePassXC\fP password manager. It provides the ability to query and modify the entries of a KeePass database, directly from the command line.
-
-.SH COMMANDS
-
-.IP "add [options] <database> <entry>"
-Adds a new entry to a database. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option).
-
-.IP "clip [options] <database> <entry> [timeout]"
-Copies the password or the current TOTP (\fI-t\fP option) of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard.
-
-.IP "create [options] <database>"
-Creates a new database with a key file and/or password. The key file will be created if the file that is referred to does not exist. If both the key file and password are empty, no database will be created.
-
-.IP "diceware [options]"
-Generate a random diceware passphrase.
-
-.IP "edit [options] <database> <entry>"
-Edits a database entry. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option).
-
-.IP "estimate [options] [password]"
-Estimates the entropy of a password. The password to estimate can be provided as a positional argument, or using the standard input.
-
-.IP "extract [options] <database>"
-Extracts and prints the contents of a database to standard output in XML format.
-
-.IP "generate [options]"
-Generate a random password.
-
-.IP "locate [options] <database> <term>"
-Locates all the entries that match a specific search term in a database.
-
-.IP "ls [options] <database> [group]"
-Lists the contents of a group in a database. If no group is specified, it will default to the root group.
-
-.IP "merge [options] <database1> <database2>"
-Merges two databases together. The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge. In the case that both databases make use of the same credentials, the \fI--same-credentials\fP or \fI-s\fP option can be used.
-
-.IP "rm [options] <database> <entry>"
-Removes an entry from a database. If the database has a recycle bin, the entry will be moved there. If the entry is already in the recycle bin, it will be removed permanently.
-
-.IP "show [options] <database> <entry>"
-Shows the title, username, password, URL and notes of a database entry. Can also show the current TOTP. Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the \fIclip\fP command section also applies here.
-
-.SH OPTIONS
-
-.SS "General options"
-
-.IP "--debug-info"
-Displays debugging information.
-
-.IP "-k, --key-file <path>"
-Specifies a path to a key file for unlocking the database. In a merge operation this option is used to specify the key file path for the first database.
-
-.IP "--no-password"
-Deactivate password key for the database.
-
-.IP "-q, --quiet <path>"
-Silence password prompt and other secondary outputs.
-
-.IP "-h, --help"
-Displays help information.
-
-.IP "-v, --version"
-Displays the program version.
-
-
-.SS "Merge options"
-
-.IP "-f, --key-file-from <path>"
-Path of the key file for the second database.
-
-.IP "--no-password-from"
-Deactivate password key for the database to merge from.
-
-.IP "-s, --same-credentials"
-Use the same credentials for unlocking both database.
-
-
-.SS "Add and edit options"
-
-.IP "-u, --username <username>"
-Specify the username of the entry.
-
-.IP "--url <url>"
-Specify the URL of the entry.
-
-.IP "-p, --password-prompt"
-Use a password prompt for the entry's password.
-
-.IP "-g, --generate"
-Generate a new password for the entry.
-
-.IP "-l, --password-length"
-Specify the length of the password to generate.
-
-
-.SS "Edit options"
-
-.IP "-t, --title <title>"
-Specify the title of the entry.
-
-
-.SS "Estimate options"
-
-.IP "-a, --advanced"
-Perform advanced analysis on the password.
-
-
-.SS "Clip options"
-
-.IP "-t, --totp"
-Copy the current TOTP instead of current password to clipboard. Will report an error
-if no TOTP is configured for the entry.
-
-
-.SS "Show options"
-
-.IP "-a, --attributes <attribute>..."
-Names of the attributes to show. This option can be specified more than once,
-with each attribute shown one-per-line in the given order. If no attributes are
-specified and \fI-t\fP is not specified, a summary of the default attributes is given.
-
-.IP "-t, --totp"
-Also show the current TOTP. Will report an error if no TOTP is configured for the
-entry.
-
-
-.SS "Diceware options"
-
-.IP "-W, --words <count>"
-Desired number of words for the generated passphrase. [Default: 7]
-
-.IP "-w, --word-list <path>"
-Path of the wordlist for the diceware generator. The wordlist must have > 1000 words,
-otherwise the program will fail. If the wordlist has < 4000 words a warning will
-be printed to STDERR.
-
-
-.SS "List options"
-
-.IP "-R, --recursive"
-Recursively list the elements of the group.
-
-
-.SS "Generate options"
-
-.IP "-L, --length <length>"
-Desired length for the generated password. [Default: 16]
-
-.IP "-l"
-Use lowercase characters for the generated password. [Default: Enabled]
-
-.IP "-u"
-Use uppercase characters for the generated password. [Default: Enabled]
-
-.IP "-n"
-Use numbers characters for the generated password. [Default: Enabled]
-
-.IP "-s"
-Use special characters for the generated password. [Default: Disabled]
-
-.IP "-e"
-Use extended ASCII characters for the generated password. [Default: Disabled]
-
-
-
-.SH REPORTING BUGS
-Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues.
-
-.SH AUTHOR
-This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>,
-and is maintained by the KeePassXC Team <team@keepassxc.org>.
diff --git a/src/cli/keepassxc-cli.cpp b/src/cli/keepassxc-cli.cpp
index 2c6ce4660..e16be9b29 100644
--- a/src/cli/keepassxc-cli.cpp
+++ b/src/cli/keepassxc-cli.cpp
@@ -16,14 +16,20 @@
*/
#include <cstdlib>
+#include <memory>
#include <QCommandLineParser>
#include <QCoreApplication>
+#include <QDir>
+#include <QScopedPointer>
#include <QStringList>
#include "cli/TextStream.h"
#include <cli/Command.h>
+#include "DatabaseCommand.h"
+#include "Open.h"
+#include "Utils.h"
#include "config-keepassx.h"
#include "core/Bootstrap.h"
#include "core/Tools.h"
@@ -33,6 +39,138 @@
#include <sanitizer/lsan_interface.h>
#endif
+#if defined(USE_READLINE)
+#include <readline/history.h>
+#include <readline/readline.h>
+#endif
+
+class LineReader
+{
+public:
+ virtual ~LineReader() = default;
+ virtual QString readLine(QString prompt) = 0;
+ virtual bool isFinished() = 0;
+};
+
+class SimpleLineReader : public LineReader
+{
+public:
+ SimpleLineReader()
+ : inStream(stdin, QIODevice::ReadOnly)
+ , outStream(stdout, QIODevice::WriteOnly)
+ , finished(false)
+ {
+ }
+
+ QString readLine(QString prompt) override
+ {
+ outStream << prompt;
+ outStream.flush();
+ QString result = inStream.readLine();
+ if (result.isNull()) {
+ finished = true;
+ }
+ return result;
+ }
+
+ bool isFinished() override
+ {
+ return finished;
+ }
+
+private:
+ TextStream inStream;
+ TextStream outStream;
+ bool finished;
+};
+
+#if defined(USE_READLINE)
+class ReadlineLineReader : public LineReader
+{
+public:
+ ReadlineLineReader()
+ : finished(false)
+ {
+ }
+
+ QString readLine(QString prompt) override
+ {
+ char* result = readline(prompt.toStdString().c_str());
+ if (!result) {
+ finished = true;
+ return {};
+ }
+ add_history(result);
+ QString qstr(result);
+ free(result);
+ return qstr;
+ }
+
+ bool isFinished() override
+ {
+ return finished;
+ }
+
+private:
+ bool finished;
+};
+#endif
+
+void enterInteractiveMode(const QStringList& arguments)
+{
+ // Replace command list with interactive version
+ Commands::setupCommands(true);
+
+ Open o;
+ QStringList openArgs(arguments);
+ openArgs.removeFirst();
+ o.execute(openArgs);
+
+ QScopedPointer<LineReader> reader;
+#if defined(USE_READLINE)
+ reader.reset(new ReadlineLineReader());
+#else
+ reader.reset(new SimpleLineReader());
+#endif
+
+ QSharedPointer<Database> currentDatabase(o.currentDatabase);
+
+ QString command;
+ while (true) {
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+
+ QString prompt;
+ if (currentDatabase) {
+ prompt += currentDatabase->metadata()->name();
+ if (prompt.isEmpty()) {
+ prompt += QFileInfo(currentDatabase->filePath()).fileName();
+ }
+ }
+ prompt += "> ";
+ command = reader->readLine(prompt);
+ if (reader->isFinished()) {
+ return;
+ }
+
+ QStringList args = Utils::splitCommandString(command);
+ if (args.empty()) {
+ continue;
+ }
+
+ auto cmd = Commands::getCommand(args[0]);
+ if (!cmd) {
+ errorTextStream << QObject::tr("Unknown command %1").arg(args[0]) << "\n";
+ continue;
+ } else if (cmd->name == "quit" || cmd->name == "exit") {
+ return;
+ }
+
+ cmd->currentDatabase = currentDatabase;
+ cmd->execute(args);
+ currentDatabase = cmd->currentDatabase;
+ }
+}
+
int main(int argc, char** argv)
{
if (!Crypto::init()) {
@@ -44,6 +182,7 @@ int main(int argc, char** argv)
QCoreApplication::setApplicationVersion(KEEPASSXC_VERSION);
Bootstrap::bootstrap();
+ Commands::setupCommands(false);
TextStream out(stdout);
QStringList arguments;
@@ -54,15 +193,14 @@ int main(int argc, char** argv)
QString description("KeePassXC command line interface.");
description = description.append(QObject::tr("\n\nAvailable commands:\n"));
- for (Command* command : Command::getCommands()) {
+ for (auto& command : Commands::getCommands()) {
description = description.append(command->getDescriptionLine());
}
parser.setApplicationDescription(description);
parser.addPositionalArgument("command", QObject::tr("Name of the command to execute."));
- QCommandLineOption debugInfoOption(QStringList() << "debug-info",
- QObject::tr("Displays debugging information."));
+ QCommandLineOption debugInfoOption(QStringList() << "debug-info", QObject::tr("Displays debugging information."));
parser.addOption(debugInfoOption);
parser.addHelpOption();
parser.addVersionOption();
@@ -85,9 +223,13 @@ int main(int argc, char** argv)
}
QString commandName = parser.positionalArguments().at(0);
- Command* command = Command::getCommand(commandName);
+ if (commandName == "open") {
+ enterInteractiveMode(arguments);
+ return EXIT_SUCCESS;
+ }
- if (command == nullptr) {
+ auto command = Commands::getCommand(commandName);
+ if (!command) {
qCritical("Invalid command %s.", qPrintable(commandName));
// showHelp exits the application immediately, so we need to set the
// exit code here.
diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake
index 2acff4466..6aceaa2a0 100644
--- a/src/config-keepassx.h.cmake
+++ b/src/config-keepassx.h.cmake
@@ -22,6 +22,7 @@
#cmakedefine WITH_XC_KEESHARE_SECURE
#cmakedefine WITH_XC_UPDATECHECK
#cmakedefine WITH_XC_TOUCHID
+#cmakedefine WITH_XC_FDOSECRETS
#cmakedefine KEEPASSXC_BUILD_TYPE "@KEEPASSXC_BUILD_TYPE@"
#cmakedefine KEEPASSXC_BUILD_TYPE_RELEASE
diff --git a/src/core/Alloc.cpp b/src/core/Alloc.cpp
index a33b56196..967b4e3ef 100644
--- a/src/core/Alloc.cpp
+++ b/src/core/Alloc.cpp
@@ -17,9 +17,12 @@
#include <QtGlobal>
#include <cstdint>
+#include <cstdlib>
#include <sodium.h>
-#ifdef Q_OS_MACOS
+#if defined(Q_OS_MACOS)
#include <malloc/malloc.h>
+#elif defined(Q_OS_FREEBSD)
+#include <malloc_np.h>
#else
#include <malloc.h>
#endif
@@ -78,7 +81,7 @@ void operator delete[](void* ptr) noexcept
* Custom insecure delete operator that does not zero out memory before
* freeing a buffer. Can be used for better performance.
*/
-void operator delete(void* ptr, bool) noexcept
+void operator delete(void* ptr, bool)noexcept
{
std::free(ptr);
}
diff --git a/src/core/Bootstrap.cpp b/src/core/Bootstrap.cpp
index 2d1a3e087..204942f4d 100644
--- a/src/core/Bootstrap.cpp
+++ b/src/core/Bootstrap.cpp
@@ -257,7 +257,7 @@ namespace Bootstrap
nullptr, // do not change owner or group
pACL, // DACL specified
nullptr // do not change SACL
- );
+ );
Cleanup:
diff --git a/src/core/Config.cpp b/src/core/Config.cpp
index 86ed04e38..445e587f8 100644
--- a/src/core/Config.cpp
+++ b/src/core/Config.cpp
@@ -89,6 +89,13 @@ void Config::sync()
m_settings->sync();
}
+void Config::resetToDefaults()
+{
+ for (const auto& setting : m_defaults.keys()) {
+ m_settings->setValue(setting, m_defaults.value(setting));
+ }
+}
+
void Config::upgrade()
{
const auto keys = deprecationMap.keys();
@@ -106,6 +113,12 @@ void Config::upgrade()
if (m_settings->value("AutoSaveAfterEveryChange").toBool()) {
m_settings->setValue("AutoSaveOnExit", true);
}
+
+ // Setting defaults for 'hide window on copy' behavior, keeping the user's original setting
+ if (m_settings->value("HideWindowOnCopy").isNull()) {
+ m_settings->setValue("HideWindowOnCopy", m_settings->value("MinimizeOnCopy").toBool());
+ m_settings->setValue("MinimizeOnCopy", true);
+ }
}
Config::Config(const QString& fileName, QObject* parent)
@@ -177,7 +190,11 @@ void Config::init(const QString& fileName)
m_defaults.insert("BackupBeforeSave", false);
m_defaults.insert("UseAtomicSaves", true);
m_defaults.insert("SearchLimitGroup", false);
- m_defaults.insert("MinimizeOnCopy", false);
+ m_defaults.insert("MinimizeOnOpenUrl", false);
+ m_defaults.insert("HideWindowOnCopy", false);
+ m_defaults.insert("MinimizeOnCopy", true);
+ m_defaults.insert("MinimizeAfterUnlock", false);
+ m_defaults.insert("DropToBackgroundOnCopy", false);
m_defaults.insert("UseGroupIconOnEntryCreation", false);
m_defaults.insert("AutoTypeEntryTitleMatch", true);
m_defaults.insert("AutoTypeEntryURLMatch", true);
@@ -185,8 +202,11 @@ void Config::init(const QString& fileName)
m_defaults.insert("AutoTypeStartDelay", 500);
m_defaults.insert("UseGroupIconOnEntryCreation", true);
m_defaults.insert("IgnoreGroupExpansion", true);
+ m_defaults.insert("FaviconDownloadTimeout", 10);
m_defaults.insert("security/clearclipboard", true);
m_defaults.insert("security/clearclipboardtimeout", 10);
+ m_defaults.insert("security/clearsearch", true);
+ m_defaults.insert("security/clearsearchtimeout", 5);
m_defaults.insert("security/lockdatabaseidle", false);
m_defaults.insert("security/lockdatabaseidlesec", 240);
m_defaults.insert("security/lockdatabaseminimize", false);
@@ -211,6 +231,7 @@ void Config::init(const QString& fileName)
m_defaults.insert("GUI/HideUsernames", false);
m_defaults.insert("GUI/HidePasswords", true);
m_defaults.insert("GUI/AdvancedSettings", false);
+ m_defaults.insert("GUI/MonospaceNotes", false);
}
Config* Config::instance()
diff --git a/src/core/Config.h b/src/core/Config.h
index ca77e0c0a..d65b3256b 100644
--- a/src/core/Config.h
+++ b/src/core/Config.h
@@ -38,6 +38,7 @@ public:
void set(const QString& key, const QVariant& value);
bool hasAccessError();
void sync();
+ void resetToDefaults();
static Config* instance();
static void createConfigFromFile(const QString& file);
diff --git a/src/core/Database.cpp b/src/core/Database.cpp
index ee888327b..944597f56 100644
--- a/src/core/Database.cpp
+++ b/src/core/Database.cpp
@@ -19,9 +19,11 @@
#include "Database.h"
#include "core/Clock.h"
+#include "core/FileWatcher.h"
#include "core/Group.h"
#include "core/Merger.h"
#include "core/Metadata.h"
+#include "format/KdbxXmlReader.h"
#include "format/KeePass2Reader.h"
#include "format/KeePass2Writer.h"
#include "keys/FileKey.h"
@@ -35,13 +37,13 @@
#include <QXmlStreamReader>
QHash<QUuid, QPointer<Database>> Database::s_uuidMap;
-QHash<QString, QPointer<Database>> Database::s_filePathMap;
Database::Database()
: m_metadata(new Metadata(this))
, m_data()
, m_rootGroup(nullptr)
, m_timer(new QTimer(this))
+ , m_fileWatcher(new FileWatcher(this))
, m_emitModified(false)
, m_uuid(QUuid::createUuid())
{
@@ -52,8 +54,11 @@ Database::Database()
s_uuidMap.insert(m_uuid, this);
- connect(m_metadata, SIGNAL(metadataModified()), this, SLOT(markAsModified()));
+ connect(m_metadata, SIGNAL(metadataModified()), SLOT(markAsModified()));
connect(m_timer, SIGNAL(timeout()), SIGNAL(databaseModified()));
+ connect(this, SIGNAL(databaseOpened()), SLOT(updateCommonUsernames()));
+ connect(this, SIGNAL(databaseSaved()), SLOT(updateCommonUsernames()));
+ connect(m_fileWatcher, SIGNAL(fileChanged()), SIGNAL(databaseFileChanged()));
m_modified = false;
m_emitModified = true;
@@ -115,6 +120,7 @@ bool Database::open(const QString& filePath, QSharedPointer<const CompositeKey>
emit databaseDiscarded();
}
+ m_initialized = false;
setEmitModified(false);
QFile dbFile(filePath);
@@ -137,8 +143,7 @@ bool Database::open(const QString& filePath, QSharedPointer<const CompositeKey>
}
KeePass2Reader reader;
- bool ok = reader.readDatabase(&dbFile, std::move(key), this);
- if (reader.hasError()) {
+ if (!reader.readDatabase(&dbFile, std::move(key), this)) {
if (error) {
*error = tr("Error while reading the database: %1").arg(reader.errorString());
}
@@ -149,22 +154,23 @@ bool Database::open(const QString& filePath, QSharedPointer<const CompositeKey>
setFilePath(filePath);
dbFile.close();
- setInitialized(ok);
markAsClean();
+ m_initialized = true;
+ emit databaseOpened();
+ m_fileWatcher->start(canonicalFilePath());
setEmitModified(true);
- return ok;
+
+ return true;
}
/**
- * Save the database back to the file is has been opened from.
- * This method behaves the same as its overloads.
- *
- * @see Database::save(const QString&, bool, bool, QString*)
+ * Save the database to the current file path. It is an error to call this function
+ * if no file path has been defined.
*
+ * @param error error message in case of failure
* @param atomic Use atomic file transactions
* @param backup Backup the existing database file, if exists
- * @param error error message in case of failure
* @return true on success
*/
bool Database::save(QString* error, bool atomic, bool backup)
@@ -172,38 +178,73 @@ bool Database::save(QString* error, bool atomic, bool backup)
Q_ASSERT(!m_data.filePath.isEmpty());
if (m_data.filePath.isEmpty()) {
if (error) {
- *error = tr("Could not save, database has no file name.");
+ *error = tr("Could not save, database does not point to a valid file.");
}
return false;
}
- return save(m_data.filePath, error, atomic, backup);
+ return saveAs(m_data.filePath, error, atomic, backup);
}
/**
- * Save the database to a file.
+ * Save the database to a specific file.
*
- * This function uses QTemporaryFile instead of QSaveFile due to a bug
- * in Qt (https://bugreports.qt.io/browse/QTBUG-57299) that may prevent
- * the QSaveFile from renaming itself when using Dropbox, Drive, or OneDrive.
+ * If atomic is false, this function uses QTemporaryFile instead of QSaveFile
+ * due to a bug in Qt (https://bugreports.qt.io/browse/QTBUG-57299) that may
+ * prevent the QSaveFile from renaming itself when using Dropbox, Google Drive,
+ * or OneDrive.
*
* The risk in using QTemporaryFile is that the rename function is not atomic
* and may result in loss of data if there is a crash or power loss at the
* wrong moment.
*
* @param filePath Absolute path of the file to save
+ * @param error error message in case of failure
* @param atomic Use atomic file transactions
* @param backup Backup the existing database file, if exists
- * @param error error message in case of failure
* @return true on success
*/
-bool Database::save(const QString& filePath, QString* error, bool atomic, bool backup)
+bool Database::saveAs(const QString& filePath, QString* error, bool atomic, bool backup)
{
- Q_ASSERT(!m_data.isReadOnly);
- if (m_data.isReadOnly) {
- return false;
+ if (filePath == m_data.filePath) {
+ // Disallow saving to the same file if read-only
+ if (m_data.isReadOnly) {
+ Q_ASSERT_X(false, "Database::saveAs", "Could not save, database file is read-only.");
+ if (error) {
+ *error = tr("Could not save, database file is read-only.");
+ }
+ return false;
+ }
+
+ // Fail-safe check to make sure we don't overwrite underlying file changes
+ // that have not yet triggered a file reload/merge operation.
+ if (!m_fileWatcher->hasSameFileChecksum()) {
+ if (error) {
+ *error = tr("Database file has unmerged changes.");
+ }
+ return false;
+ }
}
+ // Clear read-only flag
+ setReadOnly(false);
+ m_fileWatcher->stop();
+
+ auto& canonicalFilePath = QFileInfo::exists(filePath) ? QFileInfo(filePath).canonicalFilePath() : filePath;
+ bool ok = performSave(canonicalFilePath, error, atomic, backup);
+ if (ok) {
+ setFilePath(filePath);
+ m_fileWatcher->start(canonicalFilePath);
+ } else {
+ // Saving failed, don't rewatch file since it does not represent our database
+ markAsModified();
+ }
+
+ return ok;
+}
+
+bool Database::performSave(const QString& filePath, QString* error, bool atomic, bool backup)
+{
if (atomic) {
QSaveFile saveFile(filePath);
if (saveFile.open(QIODevice::WriteOnly)) {
@@ -218,7 +259,6 @@ bool Database::save(const QString& filePath, QString* error, bool atomic, bool b
if (saveFile.commit()) {
// successfully saved database file
- setFilePath(filePath);
return true;
}
}
@@ -249,7 +289,6 @@ bool Database::save(const QString& filePath, QString* error, bool atomic, bool b
if (tempFile.QFile::rename(filePath)) {
// successfully saved the database
tempFile.setAutoRemove(false);
- setFilePath(filePath);
return true;
} else if (!backup || !restoreDatabase(filePath)) {
// Failed to copy new database in place, and
@@ -258,7 +297,6 @@ bool Database::save(const QString& filePath, QString* error, bool atomic, bool b
if (error) {
*error = tr("%1\nBackup database located at %2").arg(tempFile.errorString(), tempFile.fileName());
}
- markAsModified();
return false;
}
}
@@ -269,7 +307,6 @@ bool Database::save(const QString& filePath, QString* error, bool atomic, bool b
}
// Saving failed
- markAsModified();
return false;
}
@@ -290,7 +327,6 @@ bool Database::writeDatabase(QIODevice* device, QString* error)
setEmitModified(true);
if (writer.hasError()) {
- // the writer failed
if (error) {
*error = writer.errorString();
}
@@ -310,6 +346,38 @@ bool Database::writeDatabase(QIODevice* device, QString* error)
return true;
}
+bool Database::extract(QByteArray& xmlOutput, QString* error)
+{
+ KeePass2Writer writer;
+ writer.extractDatabase(this, xmlOutput);
+ if (writer.hasError()) {
+ if (error) {
+ *error = writer.errorString();
+ }
+ return false;
+ }
+
+ return true;
+}
+
+bool Database::import(const QString& xmlExportPath, QString* error)
+{
+ KdbxXmlReader reader(KeePass2::FILE_VERSION_4);
+ QFile file(xmlExportPath);
+ file.open(QIODevice::ReadOnly);
+
+ reader.readDatabase(&file, this);
+
+ if (reader.hasError()) {
+ if (error) {
+ *error = reader.errorString();
+ }
+ return false;
+ }
+
+ return true;
+}
+
/**
* Remove the old backup and replace it with a new one
* backups are named <filename>.old.<extension>
@@ -445,18 +513,13 @@ QString Database::canonicalFilePath() const
void Database::setFilePath(const QString& filePath)
{
- if (filePath == m_data.filePath) {
- return;
- }
-
- if (s_filePathMap.contains(m_data.filePath)) {
- s_filePathMap.remove(m_data.filePath);
+ if (filePath != m_data.filePath) {
+ QString oldPath = m_data.filePath;
+ m_data.filePath = filePath;
+ // Don't watch for changes until the next open or save operation
+ m_fileWatcher->stop();
+ emit filePathChanged(oldPath, filePath);
}
- QString oldPath = m_data.filePath;
- m_data.filePath = filePath;
- s_filePathMap.insert(m_data.filePath, this);
-
- emit filePathChanged(oldPath, filePath);
}
QList<DeletedObject> Database::deletedObjects()
@@ -512,6 +575,17 @@ void Database::addDeletedObject(const QUuid& uuid)
addDeletedObject(delObj);
}
+QList<QString> Database::commonUsernames()
+{
+ return m_commonUsernames;
+}
+
+void Database::updateCommonUsernames(int topN)
+{
+ m_commonUsernames.clear();
+ m_commonUsernames.append(rootGroup()->usernamesRecursive(topN));
+}
+
const QUuid& Database::cipher() const
{
return m_data.cipher;
@@ -650,8 +724,15 @@ void Database::setPublicCustomData(const QVariantMap& customData)
void Database::createRecycleBin()
{
Q_ASSERT(!m_data.isReadOnly);
- Group* recycleBin = Group::createRecycleBin();
+
+ auto recycleBin = new Group();
+ recycleBin->setUuid(QUuid::createUuid());
recycleBin->setParent(rootGroup());
+ recycleBin->setName(tr("Recycle Bin"));
+ recycleBin->setIcon(Group::RecycleBinIconNumber);
+ recycleBin->setSearchingEnabled(Group::Disable);
+ recycleBin->setAutoTypeEnabled(Group::Disable);
+
m_metadata->setRecycleBin(recycleBin);
}
@@ -714,10 +795,6 @@ bool Database::isModified() const
void Database::markAsModified()
{
- if (isReadOnly()) {
- return;
- }
-
m_modified = true;
if (m_emitModified) {
startModifiedTimer();
@@ -742,19 +819,8 @@ Database* Database::databaseByUuid(const QUuid& uuid)
return s_uuidMap.value(uuid, nullptr);
}
-/**
- * @param filePath file path of the database
- * @return pointer to the database or nullptr if the database has not been opened
- */
-Database* Database::databaseByFilePath(const QString& filePath)
-{
- return s_filePathMap.value(filePath, nullptr);
-}
-
void Database::startModifiedTimer()
{
- Q_ASSERT(!m_data.isReadOnly);
-
if (!m_emitModified) {
return;
}
diff --git a/src/core/Database.h b/src/core/Database.h
index 27bb3e4a5..7f504cc55 100644
--- a/src/core/Database.h
+++ b/src/core/Database.h
@@ -32,6 +32,7 @@
class Entry;
enum class EntryReferenceType;
+class FileWatcher;
class Group;
class Metadata;
class QTimer;
@@ -71,7 +72,9 @@ public:
QString* error = nullptr,
bool readOnly = false);
bool save(QString* error = nullptr, bool atomic = true, bool backup = false);
- bool save(const QString& filePath, QString* error = nullptr, bool atomic = true, bool backup = false);
+ bool saveAs(const QString& filePath, QString* error = nullptr, bool atomic = true, bool backup = false);
+ bool extract(QByteArray&, QString* error = nullptr);
+ bool import(const QString& xmlExportPath, QString* error = nullptr);
bool isInitialized() const;
void setInitialized(bool initialized);
@@ -105,6 +108,8 @@ public:
bool containsDeletedObject(const DeletedObject& uuid) const;
void setDeletedObjects(const QList<DeletedObject>& delObjs);
+ QList<QString> commonUsernames();
+
bool hasKey() const;
QSharedPointer<const CompositeKey> key() const;
bool setKey(const QSharedPointer<const CompositeKey>& key,
@@ -125,11 +130,11 @@ public:
QByteArray transformedMasterKey() const;
static Database* databaseByUuid(const QUuid& uuid);
- static Database* databaseByFilePath(const QString& filePath);
public slots:
void markAsModified();
void markAsClean();
+ void updateCommonUsernames(int topN = 10);
signals:
void filePathChanged(const QString& oldPath, const QString& newPath);
@@ -140,9 +145,11 @@ signals:
void groupRemoved();
void groupAboutToMove(Group* group, Group* toGroup, int index);
void groupMoved();
+ void databaseOpened();
void databaseModified();
void databaseSaved();
void databaseDiscarded();
+ void databaseFileChanged();
private slots:
void startModifiedTimer();
@@ -173,19 +180,22 @@ private:
bool writeDatabase(QIODevice* device, QString* error = nullptr);
bool backupDatabase(const QString& filePath);
bool restoreDatabase(const QString& filePath);
+ bool performSave(const QString& filePath, QString* error, bool atomic, bool backup);
Metadata* const m_metadata;
DatabaseData m_data;
Group* m_rootGroup;
QList<DeletedObject> m_deletedObjects;
QPointer<QTimer> m_timer;
+ QPointer<FileWatcher> m_fileWatcher;
bool m_initialized = false;
bool m_modified = false;
bool m_emitModified;
+ QList<QString> m_commonUsernames;
+
QUuid m_uuid;
static QHash<QUuid, QPointer<Database>> s_uuidMap;
- static QHash<QString, QPointer<Database>> s_filePathMap;
};
#endif // KEEPASSX_DATABASE_H
diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp
index 2ad73b055..1b05b9e6e 100644
--- a/src/core/Entry.cpp
+++ b/src/core/Entry.cpp
@@ -341,6 +341,21 @@ bool Entry::isExpired() const
return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Clock::currentDateTimeUtc();
}
+bool Entry::isRecycled() const
+{
+ const Database* db = database();
+ if (!db) {
+ return false;
+ }
+
+ return m_group == db->metadata()->recycleBin() || m_group->isRecycled();
+}
+
+bool Entry::isAttributeReference(const QString& key) const
+{
+ return m_attributes->isReference(key);
+}
+
bool Entry::isAttributeReferenceOf(const QString& key, const QUuid& uuid) const
{
if (!m_attributes->isReference(key)) {
@@ -427,16 +442,16 @@ QString Entry::totp() const
void Entry::setTotp(QSharedPointer<Totp::Settings> settings)
{
beginUpdate();
+ m_attributes->remove(Totp::ATTRIBUTE_OTP);
+ m_attributes->remove(Totp::ATTRIBUTE_SEED);
+ m_attributes->remove(Totp::ATTRIBUTE_SETTINGS);
+
if (settings->key.isEmpty()) {
m_data.totpSettings.reset();
- m_attributes->remove(Totp::ATTRIBUTE_OTP);
- m_attributes->remove(Totp::ATTRIBUTE_SEED);
- m_attributes->remove(Totp::ATTRIBUTE_SETTINGS);
} else {
m_data.totpSettings = std::move(settings);
-
auto text = Totp::writeSettings(m_data.totpSettings, title(), username());
- if (m_attributes->hasKey(Totp::ATTRIBUTE_OTP)) {
+ if (m_data.totpSettings->format != Totp::StorageFormat::LEGACY) {
m_attributes->set(Totp::ATTRIBUTE_OTP, text, true);
} else {
m_attributes->set(Totp::ATTRIBUTE_SEED, m_data.totpSettings->key, true);
@@ -747,14 +762,14 @@ Entry* Entry::clone(CloneFlags flags) const
entry->m_autoTypeAssociations->copyDataFrom(m_autoTypeAssociations);
if (flags & CloneIncludeHistory) {
for (Entry* historyItem : m_history) {
- Entry* historyItemClone = historyItem->clone(flags & ~CloneIncludeHistory & ~CloneNewUuid);
+ Entry* historyItemClone =
+ historyItem->clone(flags & ~CloneIncludeHistory & ~CloneNewUuid & ~CloneResetTimeInfo);
historyItemClone->setUpdateTimeinfo(false);
historyItemClone->setUuid(entry->uuid());
historyItemClone->setUpdateTimeinfo(true);
entry->addHistoryItem(historyItemClone);
}
}
- entry->setUpdateTimeinfo(true);
if (flags & CloneResetTimeInfo) {
QDateTime now = Clock::currentDateTimeUtc();
@@ -767,6 +782,8 @@ Entry* Entry::clone(CloneFlags flags) const
if (flags & CloneRenameTitle)
entry->setTitle(tr("%1 - Clone").arg(entry->title()));
+ entry->setUpdateTimeinfo(true);
+
return entry;
}
diff --git a/src/core/Entry.h b/src/core/Entry.h
index c5f59f2e3..49ec6f027 100644
--- a/src/core/Entry.h
+++ b/src/core/Entry.h
@@ -111,6 +111,8 @@ public:
bool hasTotp() const;
bool isExpired() const;
+ bool isRecycled() const;
+ bool isAttributeReference(const QString& key) const;
bool isAttributeReferenceOf(const QString& key, const QUuid& uuid) const;
void replaceReferencesWithValues(const Entry* other);
bool hasReferences() const;
diff --git a/src/core/EntrySearcher.cpp b/src/core/EntrySearcher.cpp
index f6c67ad50..79e43e71a 100644
--- a/src/core/EntrySearcher.cpp
+++ b/src/core/EntrySearcher.cpp
@@ -140,12 +140,20 @@ bool EntrySearcher::searchEntryImpl(Entry* entry)
case Field::Notes:
found = term->regex.match(entry->notes()).hasMatch();
break;
- case Field::Attribute:
+ case Field::AttributeKey:
found = !attributes.filter(term->regex).empty();
break;
case Field::Attachment:
found = !attachments.filter(term->regex).empty();
break;
+ case Field::AttributeValue:
+ // skip protected attributes
+ if (entry->attributes()->isProtected(term->word)) {
+ continue;
+ }
+ found = entry->attributes()->contains(term->word)
+ && term->regex.match(entry->attributes()->value(term->word)).hasMatch();
+ break;
default:
// Terms without a specific field try to match title, username, url, and notes
found = term->regex.match(entry->resolvePlaceholder(entry->title())).hasMatch()
@@ -165,6 +173,17 @@ bool EntrySearcher::searchEntryImpl(Entry* entry)
void EntrySearcher::parseSearchTerms(const QString& searchString)
{
+ static const QList<QPair<QString, Field>> fieldnames{
+ {QStringLiteral("attachment"), Field::Attachment},
+ {QStringLiteral("attribute"), Field::AttributeKey},
+ {QStringLiteral("notes"), Field::Notes},
+ {QStringLiteral("pw"), Field::Password},
+ {QStringLiteral("password"), Field::Password},
+ {QStringLiteral("title"), Field::Title},
+ {QStringLiteral("u"), Field::Username}, // u: stands for username rather than url
+ {QStringLiteral("url"), Field::Url},
+ {QStringLiteral("username"), Field::Username}};
+
m_searchTerms.clear();
auto results = m_termParser.globalMatch(searchString);
while (results.hasNext()) {
@@ -193,25 +212,23 @@ void EntrySearcher::parseSearchTerms(const QString& searchString)
term->exclude = mods.contains("-") || mods.contains("!");
// Determine the field to search
+ term->field = Field::Undefined;
+
QString field = result.captured(2);
if (!field.isEmpty()) {
- auto cs = Qt::CaseInsensitive;
- if (field.compare("title", cs) == 0) {
- term->field = Field::Title;
- } else if (field.startsWith("user", cs)) {
- term->field = Field::Username;
- } else if (field.startsWith("pass", cs)) {
- term->field = Field::Password;
- } else if (field.compare("url", cs) == 0) {
- term->field = Field::Url;
- } else if (field.compare("notes", cs) == 0) {
- term->field = Field::Notes;
- } else if (field.startsWith("attr", cs)) {
- term->field = Field::Attribute;
- } else if (field.startsWith("attach", cs)) {
- term->field = Field::Attachment;
+ if (field.startsWith("_", Qt::CaseInsensitive)) {
+ term->field = Field::AttributeValue;
+ // searching a custom attribute
+ // in this case term->word is the attribute key (removing the leading "_")
+ // and term->regex is used to match attribute value
+ term->word = field.mid(1);
} else {
- term->field = Field::Undefined;
+ for (const auto& pair : fieldnames) {
+ if (pair.first.startsWith(field, Qt::CaseInsensitive)) {
+ term->field = pair.second;
+ break;
+ }
+ }
}
}
diff --git a/src/core/EntrySearcher.h b/src/core/EntrySearcher.h
index 153a0612e..4a3394924 100644
--- a/src/core/EntrySearcher.h
+++ b/src/core/EntrySearcher.h
@@ -48,8 +48,9 @@ private:
Password,
Url,
Notes,
- Attribute,
- Attachment
+ AttributeKey,
+ Attachment,
+ AttributeValue
};
struct SearchTerm
diff --git a/src/core/FileWatcher.cpp b/src/core/FileWatcher.cpp
index ae7878191..1b39e597d 100644
--- a/src/core/FileWatcher.cpp
+++ b/src/core/FileWatcher.cpp
@@ -19,6 +19,7 @@
#include "FileWatcher.h"
#include "core/Clock.h"
+#include <QCryptographicHash>
#include <QFileInfo>
#ifdef Q_OS_LINUX
@@ -27,36 +28,23 @@
namespace
{
- const int FileChangeDelay = 500;
- const int TimerResolution = 100;
+ const int FileChangeDelay = 200;
} // namespace
-DelayingFileWatcher::DelayingFileWatcher(QObject* parent)
+FileWatcher::FileWatcher(QObject* parent)
: QObject(parent)
, m_ignoreFileChange(false)
{
- connect(&m_fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(onWatchedFileChanged()));
- connect(&m_fileUnblockTimer, SIGNAL(timeout()), this, SLOT(observeFileChanges()));
- connect(&m_fileChangeDelayTimer, SIGNAL(timeout()), this, SIGNAL(fileChanged()));
+ connect(&m_fileWatcher, SIGNAL(fileChanged(QString)), SLOT(onWatchedFileChanged()));
+ connect(&m_fileChangeDelayTimer, SIGNAL(timeout()), SIGNAL(fileChanged()));
+ connect(&m_fileChecksumTimer, SIGNAL(timeout()), SLOT(checkFileChecksum()));
m_fileChangeDelayTimer.setSingleShot(true);
- m_fileUnblockTimer.setSingleShot(true);
+ m_fileIgnoreDelayTimer.setSingleShot(true);
}
-void DelayingFileWatcher::restart()
+void FileWatcher::start(const QString& filePath, int checksumInterval)
{
- m_fileWatcher.addPath(m_filePath);
-}
-
-void DelayingFileWatcher::stop()
-{
- m_fileWatcher.removePath(m_filePath);
-}
-
-void DelayingFileWatcher::start(const QString& filePath)
-{
- if (!m_filePath.isEmpty()) {
- m_fileWatcher.removePath(m_filePath);
- }
+ stop();
#if defined(Q_OS_LINUX)
struct statfs statfsBuf;
@@ -74,45 +62,80 @@ void DelayingFileWatcher::start(const QString& filePath)
#endif
m_fileWatcher.addPath(filePath);
+ m_filePath = filePath;
+ m_fileChecksum = calculateChecksum();
+ m_fileChecksumTimer.start(checksumInterval);
+ m_ignoreFileChange = false;
+}
- if (!filePath.isEmpty()) {
- m_filePath = filePath;
+void FileWatcher::stop()
+{
+ if (!m_filePath.isEmpty()) {
+ m_fileWatcher.removePath(m_filePath);
}
+ m_filePath.clear();
+ m_fileChecksum.clear();
+ m_fileChangeDelayTimer.stop();
}
-void DelayingFileWatcher::ignoreFileChanges()
+void FileWatcher::pause()
{
m_ignoreFileChange = true;
m_fileChangeDelayTimer.stop();
}
-void DelayingFileWatcher::observeFileChanges(bool delayed)
+void FileWatcher::resume()
{
- int timeout = 0;
- if (delayed) {
- timeout = FileChangeDelay;
- } else {
- m_ignoreFileChange = false;
- start(m_filePath);
- }
- if (timeout > 0 && !m_fileUnblockTimer.isActive()) {
- m_fileUnblockTimer.start(timeout);
+ m_ignoreFileChange = false;
+ // Add a short delay to start in the next event loop
+ if (!m_fileIgnoreDelayTimer.isActive()) {
+ m_fileIgnoreDelayTimer.start(0);
}
}
-void DelayingFileWatcher::onWatchedFileChanged()
+void FileWatcher::onWatchedFileChanged()
{
- if (m_ignoreFileChange) {
- // the client forcefully silenced us
+ // Don't notify if we are ignoring events or already started a notification chain
+ if (shouldIgnoreChanges()) {
return;
}
- if (m_fileChangeDelayTimer.isActive()) {
- // we are waiting to fire the delayed fileChanged event, so nothing
- // to do here
+
+ m_fileChecksum = calculateChecksum();
+ m_fileChangeDelayTimer.start(0);
+}
+
+bool FileWatcher::shouldIgnoreChanges()
+{
+ return m_filePath.isEmpty() || m_ignoreFileChange || m_fileIgnoreDelayTimer.isActive()
+ || m_fileChangeDelayTimer.isActive();
+}
+
+bool FileWatcher::hasSameFileChecksum()
+{
+ return calculateChecksum() == m_fileChecksum;
+}
+
+void FileWatcher::checkFileChecksum()
+{
+ if (shouldIgnoreChanges()) {
return;
}
- m_fileChangeDelayTimer.start(FileChangeDelay);
+ if (!hasSameFileChecksum()) {
+ onWatchedFileChanged();
+ }
+}
+
+QByteArray FileWatcher::calculateChecksum()
+{
+ QFile file(m_filePath);
+ if (file.open(QFile::ReadOnly)) {
+ QCryptographicHash hash(QCryptographicHash::Sha256);
+ if (hash.addData(&file)) {
+ return hash.result();
+ }
+ }
+ return {};
}
BulkFileWatcher::BulkFileWatcher(QObject* parent)
@@ -281,7 +304,7 @@ void BulkFileWatcher::observeFileChanges(bool delayed)
{
int timeout = 0;
if (delayed) {
- timeout = TimerResolution;
+ timeout = FileChangeDelay;
} else {
const QDateTime current = Clock::currentDateTimeUtc();
for (const QString& key : m_watchedFilesIgnored.keys()) {
diff --git a/src/core/FileWatcher.h b/src/core/FileWatcher.h
index f6953cf80..3793ae860 100644
--- a/src/core/FileWatcher.h
+++ b/src/core/FileWatcher.h
@@ -23,34 +23,39 @@
#include <QTimer>
#include <QVariant>
-class DelayingFileWatcher : public QObject
+class FileWatcher : public QObject
{
Q_OBJECT
public:
- explicit DelayingFileWatcher(QObject* parent = nullptr);
+ explicit FileWatcher(QObject* parent = nullptr);
- void blockAutoReload(bool block);
- void start(const QString& path);
-
- void restart();
+ void start(const QString& path, int checksumInterval = 1000);
void stop();
- void ignoreFileChanges();
+
+ bool hasSameFileChecksum();
signals:
void fileChanged();
public slots:
- void observeFileChanges(bool delayed = false);
+ void pause();
+ void resume();
private slots:
void onWatchedFileChanged();
+ void checkFileChecksum();
private:
+ QByteArray calculateChecksum();
+ bool shouldIgnoreChanges();
+
QString m_filePath;
QFileSystemWatcher m_fileWatcher;
+ QByteArray m_fileChecksum;
QTimer m_fileChangeDelayTimer;
- QTimer m_fileUnblockTimer;
+ QTimer m_fileIgnoreDelayTimer;
+ QTimer m_fileChecksumTimer;
bool m_ignoreFileChange;
};
diff --git a/src/core/Group.cpp b/src/core/Group.cpp
index 87741ee0c..2c0d67091 100644
--- a/src/core/Group.cpp
+++ b/src/core/Group.cpp
@@ -75,17 +75,6 @@ Group::~Group()
cleanupParent();
}
-Group* Group::createRecycleBin()
-{
- Group* recycleBin = new Group();
- recycleBin->setUuid(QUuid::createUuid());
- recycleBin->setName(tr("Recycle Bin"));
- recycleBin->setIcon(RecycleBinIconNumber);
- recycleBin->setSearchingEnabled(Group::Disable);
- recycleBin->setAutoTypeEnabled(Group::Disable);
- return recycleBin;
-}
-
template <class P, class V> inline bool Group::set(P& property, const V& value)
{
if (property != value) {
@@ -257,9 +246,9 @@ Entry* Group::lastTopVisibleEntry() const
return m_lastTopVisibleEntry;
}
-bool Group::isRecycled()
+bool Group::isRecycled() const
{
- Group* group = this;
+ auto group = this;
if (!group->database()) {
return false;
}
@@ -281,6 +270,11 @@ bool Group::isExpired() const
return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Clock::currentDateTimeUtc();
}
+bool Group::isEmpty() const
+{
+ return !hasChildren() && m_entries.isEmpty();
+}
+
CustomData* Group::customData()
{
return m_customData;
@@ -504,16 +498,25 @@ void Group::setParent(Database* db)
QObject::setParent(db);
}
-QStringList Group::hierarchy() const
+QStringList Group::hierarchy(int height) const
{
QStringList hierarchy;
const Group* group = this;
const Group* parent = m_parent;
+
+ if (height == 0) {
+ return hierarchy;
+ }
+
hierarchy.prepend(group->name());
- while (parent) {
+ int level = 1;
+ bool heightReached = level == height;
+
+ while (parent && !heightReached) {
group = group->parentGroup();
parent = group->parentGroup();
+ heightReached = ++level == height;
hierarchy.prepend(group->name());
}
@@ -521,6 +524,11 @@ QStringList Group::hierarchy() const
return hierarchy;
}
+bool Group::hasChildren() const
+{
+ return !children().isEmpty();
+}
+
Database* Group::database()
{
return m_db;
@@ -577,13 +585,18 @@ QList<Entry*> Group::referencesRecursive(const Entry* entry) const
[entry](const Entry* e) { return e->hasReferencesTo(entry->uuid()); });
}
-Entry* Group::findEntryByUuid(const QUuid& uuid) const
+Entry* Group::findEntryByUuid(const QUuid& uuid, bool recursive) const
{
if (uuid.isNull()) {
return nullptr;
}
- for (Entry* entry : entriesRecursive(false)) {
+ auto entries = m_entries;
+ if (recursive) {
+ entries = entriesRecursive(false);
+ }
+
+ for (auto entry : entries) {
if (entry->uuid() == uuid) {
return entry;
}
@@ -715,25 +728,34 @@ Group* Group::findGroupByPathRecursive(const QString& groupPath, const QString&
return nullptr;
}
-QString Group::print(bool recursive, int depth)
+QString Group::print(bool recursive, bool flatten, int depth)
{
-
QString response;
- QString indentation = QString(" ").repeated(depth);
+ QString prefix;
+
+ if (flatten) {
+ const QString separator("/");
+ prefix = hierarchy(depth).join(separator);
+ if (!prefix.isEmpty()) {
+ prefix += separator;
+ }
+ } else {
+ prefix = QString(" ").repeated(depth);
+ }
if (entries().isEmpty() && children().isEmpty()) {
- response += indentation + tr("[empty]", "group has no children") + "\n";
+ response += prefix + tr("[empty]", "group has no children") + "\n";
return response;
}
for (Entry* entry : entries()) {
- response += indentation + entry->title() + "\n";
+ response += prefix + entry->title() + "\n";
}
for (Group* innerGroup : children()) {
- response += indentation + innerGroup->name() + "/\n";
+ response += prefix + innerGroup->name() + "/\n";
if (recursive) {
- response += innerGroup->print(recursive, depth + 1);
+ response += innerGroup->print(recursive, flatten, depth + 1);
}
}
@@ -790,6 +812,42 @@ QSet<QUuid> Group::customIconsRecursive() const
return result;
}
+QList<QString> Group::usernamesRecursive(int topN) const
+{
+ // Collect all usernames and sort for easy counting
+ QHash<QString, int> countedUsernames;
+ for (const auto* entry : entriesRecursive()) {
+ const auto username = entry->username();
+ if (!username.isEmpty() && !entry->isAttributeReference(EntryAttributes::UserNameKey)) {
+ countedUsernames.insert(username, ++countedUsernames[username]);
+ }
+ }
+
+ // Sort username/frequency pairs by frequency and name
+ QList<QPair<QString, int>> sortedUsernames;
+ for (const auto& key : countedUsernames.keys()) {
+ sortedUsernames.append({key, countedUsernames[key]});
+ }
+
+ auto comparator = [](const QPair<QString, int>& arg1, const QPair<QString, int>& arg2) {
+ if (arg1.second == arg2.second) {
+ return arg1.first < arg2.first;
+ }
+ return arg1.second > arg2.second;
+ };
+
+ std::sort(sortedUsernames.begin(), sortedUsernames.end(), comparator);
+
+ // Take first topN usernames if set
+ QList<QString> usernames;
+ int actualUsernames = topN < 0 ? sortedUsernames.size() : std::min(topN, sortedUsernames.size());
+ for (int i = 0; i < actualUsernames; i++) {
+ usernames.append(sortedUsernames[i].first);
+ }
+
+ return usernames;
+}
+
Group* Group::findGroupByUuid(const QUuid& uuid)
{
if (uuid.isNull()) {
@@ -1057,6 +1115,74 @@ Entry* Group::addEntryWithPath(const QString& entryPath)
return entry;
}
+void Group::applyGroupIconOnCreateTo(Entry* entry)
+{
+ Q_ASSERT(entry);
+
+ if (!config()->get("UseGroupIconOnEntryCreation").toBool()) {
+ return;
+ }
+
+ if (iconNumber() == Group::DefaultIconNumber && iconUuid().isNull()) {
+ return;
+ }
+
+ applyGroupIconTo(entry);
+}
+
+void Group::applyGroupIconTo(Entry* entry)
+{
+ Q_ASSERT(entry);
+
+ if (iconUuid().isNull()) {
+ entry->setIcon(iconNumber());
+ } else {
+ entry->setIcon(iconUuid());
+ }
+}
+
+void Group::applyGroupIconTo(Group* other)
+{
+ Q_ASSERT(other);
+
+ if (iconUuid().isNull()) {
+ other->setIcon(iconNumber());
+ } else {
+ other->setIcon(iconUuid());
+ }
+}
+
+void Group::applyGroupIconToChildGroups()
+{
+ for (Group* recursiveChild : groupsRecursive(false)) {
+ applyGroupIconTo(recursiveChild);
+ }
+}
+
+void Group::applyGroupIconToChildEntries()
+{
+ for (Entry* recursiveEntry : entriesRecursive(false)) {
+ applyGroupIconTo(recursiveEntry);
+ }
+}
+
+void Group::sortChildrenRecursively(bool reverse)
+{
+ std::sort(
+ m_children.begin(), m_children.end(), [reverse](const Group* childGroup1, const Group* childGroup2) -> bool {
+ QString name1 = childGroup1->name();
+ QString name2 = childGroup2->name();
+ return reverse ? name1.compare(name2, Qt::CaseInsensitive) > 0
+ : name1.compare(name2, Qt::CaseInsensitive) < 0;
+ });
+
+ for (auto child : m_children) {
+ child->sortChildrenRecursively(reverse);
+ }
+
+ emit groupModified();
+}
+
bool Group::GroupData::operator==(const Group::GroupData& other) const
{
return equals(other, CompareItemDefault);
diff --git a/src/core/Group.h b/src/core/Group.h
index 4b8569207..cfeb9feee 100644
--- a/src/core/Group.h
+++ b/src/core/Group.h
@@ -80,8 +80,6 @@ public:
Group();
~Group();
- static Group* createRecycleBin();
-
const QUuid& uuid() const;
const QString uuidToHex() const;
QString name() const;
@@ -102,7 +100,8 @@ public:
bool resolveAutoTypeEnabled() const;
Entry* lastTopVisibleEntry() const;
bool isExpired() const;
- bool isRecycled();
+ bool isRecycled() const;
+ bool isEmpty() const;
CustomData* customData();
const CustomData* customData() const;
@@ -115,7 +114,7 @@ public:
static const QString RootAutoTypeSequence;
Group* findChildByName(const QString& name);
- Entry* findEntryByUuid(const QUuid& uuid) const;
+ Entry* findEntryByUuid(const QUuid& uuid, bool recursive = true) const;
Entry* findEntryByPath(const QString& entryPath);
Entry* findEntryBySearchTerm(const QString& term, EntryReferenceType referenceType);
Group* findGroupByUuid(const QUuid& uuid);
@@ -143,7 +142,8 @@ public:
Group* parentGroup();
const Group* parentGroup() const;
void setParent(Group* parent, int index = -1);
- QStringList hierarchy() const;
+ QStringList hierarchy(int height = -1) const;
+ bool hasChildren() const;
Database* database();
const Database* database() const;
@@ -157,16 +157,25 @@ public:
QList<const Group*> groupsRecursive(bool includeSelf) const;
QList<Group*> groupsRecursive(bool includeSelf);
QSet<QUuid> customIconsRecursive() const;
+ QList<QString> usernamesRecursive(int topN = -1) const;
Group* clone(Entry::CloneFlags entryFlags = DefaultEntryCloneFlags,
CloneFlags groupFlags = DefaultCloneFlags) const;
void copyDataFrom(const Group* other);
- QString print(bool recursive = false, int depth = 0);
+ QString print(bool recursive = false, bool flatten = false, int depth = 0);
void addEntry(Entry* entry);
void removeEntry(Entry* entry);
+ void applyGroupIconOnCreateTo(Entry* entry);
+ void applyGroupIconTo(Entry* entry);
+ void applyGroupIconTo(Group* other);
+ void applyGroupIconToChildGroups();
+ void applyGroupIconToChildEntries();
+
+ void sortChildrenRecursively(bool reverse = false);
+
signals:
void groupDataChanged(Group* group);
void groupAboutToAdd(Group* group, int index);
diff --git a/src/core/HibpOffline.cpp b/src/core/HibpOffline.cpp
new file mode 100644
index 000000000..ebc5d9a46
--- /dev/null
+++ b/src/core/HibpOffline.cpp
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "HibpOffline.h"
+
+#include <QCryptographicHash>
+#include <QMultiHash>
+
+#include "core/Database.h"
+#include "core/Group.h"
+
+namespace HibpOffline
+{
+ const std::size_t SHA1_BYTES = 20;
+
+ enum class ParseResult
+ {
+ Ok,
+ Eof,
+ Error
+ };
+
+ ParseResult parseHibpLine(QIODevice& input, QByteArray& sha1, int& count)
+ {
+ QByteArray hexSha1(SHA1_BYTES * 2, '\0');
+ const qint64 rc = input.read(hexSha1.data(), hexSha1.size());
+ if (rc == 0) {
+ return ParseResult::Eof;
+ } else if (rc != hexSha1.size()) {
+ return ParseResult::Error;
+ }
+
+ sha1 = QByteArray::fromHex(hexSha1);
+
+ char c;
+ if (!input.getChar(&c) || c != ':') {
+ return ParseResult::Error;
+ }
+
+ count = 0;
+ while (true) {
+ if (!input.getChar(&c)) {
+ return ParseResult::Error;
+ }
+
+ if (c == '\n' || c == '\r') {
+ break;
+ }
+
+ if (!('0' <= c && c <= '9')) {
+ return ParseResult::Error;
+ }
+
+ count *= 10;
+ count += (c - '0');
+ }
+
+ while (1 == input.peek(&c, 1) && (c == '\n' || c == '\r')) {
+ input.getChar(&c);
+ }
+
+ return ParseResult::Ok;
+ }
+
+ bool
+ report(QSharedPointer<Database> db, QIODevice& hibpInput, QList<QPair<const Entry*, int>>& findings, QString* error)
+ {
+ QMultiHash<QByteArray, const Entry*> entriesBySha1;
+ for (const auto* entry : db->rootGroup()->entriesRecursive()) {
+ if (!entry->isRecycled()) {
+ const auto sha1 = QCryptographicHash::hash(entry->password().toUtf8(), QCryptographicHash::Sha1);
+ entriesBySha1.insert(sha1, entry);
+ }
+ }
+
+ QByteArray sha1;
+ for (quint64 lineNum = 1;; ++lineNum) {
+ int count = 0;
+
+ switch (parseHibpLine(hibpInput, sha1, count)) {
+ case ParseResult::Eof:
+ return true;
+ case ParseResult::Error:
+ *error = QObject::tr("HIBP file, line %1: parse error").arg(lineNum);
+ return false;
+ default:
+ break;
+ }
+
+ for (const auto* entry : entriesBySha1.values(sha1)) {
+ findings.append({entry, count});
+ }
+ }
+ }
+} // namespace HibpOffline
diff --git a/src/core/HibpOffline.h b/src/core/HibpOffline.h
new file mode 100644
index 000000000..3ff8b9103
--- /dev/null
+++ b/src/core/HibpOffline.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_HIBPOFFLINE_H
+#define KEEPASSXC_HIBPOFFLINE_H
+
+#include <QIODevice>
+#include <QList>
+#include <QPair>
+
+class Database;
+class Entry;
+
+namespace HibpOffline
+{
+ bool report(QSharedPointer<Database> db,
+ QIODevice& hibpInput,
+ QList<QPair<const Entry*, int>>& findings,
+ QString* error);
+}
+
+#endif // KEEPASSXC_HIBPOFFLINE_H
diff --git a/src/core/IconDownloader.cpp b/src/core/IconDownloader.cpp
new file mode 100644
index 000000000..36047ce2a
--- /dev/null
+++ b/src/core/IconDownloader.cpp
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "IconDownloader.h"
+#include "core/Config.h"
+#include "core/NetworkManager.h"
+
+#include <QHostInfo>
+#include <QtNetwork>
+
+#define MAX_REDIRECTS 5
+
+IconDownloader::IconDownloader(QObject* parent)
+ : QObject(parent)
+ , m_reply(nullptr)
+ , m_redirects(0)
+{
+ m_timeout.setSingleShot(true);
+ connect(&m_timeout, SIGNAL(timeout()), SLOT(abortDownload()));
+}
+
+IconDownloader::~IconDownloader()
+{
+ abortDownload();
+}
+
+namespace
+{
+ // Try to get the 2nd level domain of the host part of a QUrl. For example,
+ // "foo.bar.example.com" would become "example.com", and "foo.bar.example.co.uk"
+ // would become "example.co.uk".
+ QString getSecondLevelDomain(const QUrl& url)
+ {
+ QString fqdn = url.host();
+ fqdn.truncate(fqdn.length() - url.topLevelDomain().length());
+ QStringList parts = fqdn.split('.');
+ QString newdom = parts.takeLast() + url.topLevelDomain();
+ return newdom;
+ }
+
+ QUrl convertVariantToUrl(const QVariant& var)
+ {
+ QUrl url;
+ if (var.canConvert<QUrl>()) {
+ url = var.toUrl();
+ }
+ return url;
+ }
+
+ QUrl getRedirectTarget(QNetworkReply* reply)
+ {
+ QVariant var = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+ QUrl url = convertVariantToUrl(var);
+ return url;
+ }
+} // namespace
+
+void IconDownloader::setUrl(const QString& entryUrl)
+{
+ m_url = entryUrl;
+ QUrl url(m_url);
+ if (!url.isValid()) {
+ return;
+ }
+
+ m_redirects = 0;
+ m_urlsToTry.clear();
+
+ if (url.scheme().isEmpty()) {
+ url.setUrl(QString("https://%1").arg(url.toString()));
+ }
+
+ QString fullyQualifiedDomain = url.host();
+
+ // Determine if host portion of URL is an IP address by resolving it and
+ // searching for a match with the returned address(es).
+ bool hostIsIp = false;
+ QList<QHostAddress> hostAddressess = QHostInfo::fromName(fullyQualifiedDomain).addresses();
+ for (auto addr : hostAddressess) {
+ if (addr.toString() == fullyQualifiedDomain) {
+ hostIsIp = true;
+ }
+ }
+
+ // Determine the second-level domain, if available
+ QString secondLevelDomain;
+ if (!hostIsIp) {
+ secondLevelDomain = getSecondLevelDomain(m_url);
+ }
+
+ // Start with the "fallback" url (if enabled) to try to get the best favicon
+ if (config()->get("security/IconDownloadFallback", false).toBool()) {
+ QUrl fallbackUrl = QUrl("https://icons.duckduckgo.com");
+ fallbackUrl.setPath("/ip3/" + QUrl::toPercentEncoding(fullyQualifiedDomain) + ".ico");
+ m_urlsToTry.append(fallbackUrl);
+
+ // Also try a direct pull of the second-level domain (if possible)
+ if (!hostIsIp && fullyQualifiedDomain != secondLevelDomain) {
+ fallbackUrl.setPath("/ip3/" + QUrl::toPercentEncoding(secondLevelDomain) + ".ico");
+ m_urlsToTry.append(fallbackUrl);
+ }
+ }
+
+ // Add a direct pull of the website's own favicon.ico file
+ m_urlsToTry.append(QUrl(url.scheme() + "://" + fullyQualifiedDomain + "/favicon.ico"));
+
+ // Also try a direct pull of the second-level domain (if possible)
+ if (!hostIsIp && fullyQualifiedDomain != secondLevelDomain) {
+ m_urlsToTry.append(QUrl(url.scheme() + "://" + secondLevelDomain + "/favicon.ico"));
+ }
+}
+
+void IconDownloader::download()
+{
+ if (!m_timeout.isActive()) {
+ int timeout = config()->get("FaviconDownloadTimeout", 10).toInt();
+ m_timeout.start(timeout * 1000);
+
+ // Use the first URL to start the download process
+ // If a favicon is not found, the next URL will be tried
+ fetchFavicon(m_urlsToTry.takeFirst());
+ }
+}
+
+void IconDownloader::abortDownload()
+{
+ if (m_reply) {
+ m_reply->abort();
+ }
+}
+
+void IconDownloader::fetchFavicon(const QUrl& url)
+{
+ m_bytesReceived.clear();
+ m_fetchUrl = url;
+
+ QNetworkRequest request(url);
+ m_reply = getNetMgr()->get(request);
+
+ connect(m_reply, &QNetworkReply::finished, this, &IconDownloader::fetchFinished);
+ connect(m_reply, &QIODevice::readyRead, this, &IconDownloader::fetchReadyRead);
+}
+
+void IconDownloader::fetchReadyRead()
+{
+ m_bytesReceived += m_reply->readAll();
+}
+
+void IconDownloader::fetchFinished()
+{
+ QImage image;
+ QString url = m_url;
+
+ bool error = (m_reply->error() != QNetworkReply::NoError);
+ QUrl redirectTarget = getRedirectTarget(m_reply);
+
+ m_reply->deleteLater();
+ m_reply = nullptr;
+
+ if (!error) {
+ if (redirectTarget.isValid()) {
+ // Redirected, we need to follow it, or fall through if we have
+ // done too many redirects already.
+ if (m_redirects < MAX_REDIRECTS) {
+ m_redirects++;
+ if (redirectTarget.isRelative()) {
+ redirectTarget = m_fetchUrl.resolved(redirectTarget);
+ }
+ m_urlsToTry.prepend(redirectTarget);
+ }
+ } else {
+ // No redirect, and we theoretically have some icon data now.
+ image.loadFromData(m_bytesReceived);
+ }
+ }
+
+ if (!image.isNull()) {
+ // Valid icon received
+ m_timeout.stop();
+ emit finished(url, image);
+ } else if (!m_urlsToTry.empty()) {
+ // Try the next url
+ m_redirects = 0;
+ fetchFavicon(m_urlsToTry.takeFirst());
+ } else {
+ // No icon found
+ m_timeout.stop();
+ emit finished(url, image);
+ }
+}
diff --git a/src/core/IconDownloader.h b/src/core/IconDownloader.h
new file mode 100644
index 000000000..e2b8c4f2d
--- /dev/null
+++ b/src/core/IconDownloader.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_ICONDOWNLOADER_H
+#define KEEPASSXC_ICONDOWNLOADER_H
+
+#include <QImage>
+#include <QObject>
+#include <QTimer>
+#include <QUrl>
+
+#include "core/Global.h"
+
+class QNetworkReply;
+
+class IconDownloader : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit IconDownloader(QObject* parent = nullptr);
+ ~IconDownloader() override;
+
+ void setUrl(const QString& entryUrl);
+ void download();
+
+signals:
+ void finished(const QString& entryUrl, const QImage& image);
+
+public slots:
+ void abortDownload();
+
+private slots:
+ void fetchFinished();
+ void fetchReadyRead();
+
+private:
+ void fetchFavicon(const QUrl& url);
+
+ QString m_url;
+ QUrl m_fetchUrl;
+ QList<QUrl> m_urlsToTry;
+ QByteArray m_bytesReceived;
+ QNetworkReply* m_reply;
+ QTimer m_timeout;
+ int m_redirects;
+};
+
+#endif // KEEPASSXC_ICONDOWNLOADER_H \ No newline at end of file
diff --git a/src/core/Merger.cpp b/src/core/Merger.cpp
index dcbed250f..4cce997bf 100644
--- a/src/core/Merger.cpp
+++ b/src/core/Merger.cpp
@@ -60,7 +60,7 @@ void Merger::resetForcedMergeMode()
m_mode = Group::Default;
}
-bool Merger::merge()
+QStringList Merger::merge()
{
// Order of merge steps is important - it is possible that we
// create some items before deleting them afterwards
@@ -74,9 +74,8 @@ bool Merger::merge()
// At this point we have a list of changes we may want to show the user
if (!changes.isEmpty()) {
m_context.m_targetDb->markAsModified();
- return true;
}
- return false;
+ return changes;
}
Merger::ChangeList Merger::mergeGroup(const MergeContext& context)
@@ -623,11 +622,11 @@ Merger::ChangeList Merger::mergeMetadata(const MergeContext& context)
}
// Merge Custom Data if source is newer
- const auto targetCustomDataModificationTime = sourceMetadata->customData()->getLastModified();
- const auto sourceCustomDataModificationTime = targetMetadata->customData()->getLastModified();
- if (!targetMetadata->customData()->contains(CustomData::LastModified) ||
- (targetCustomDataModificationTime.isValid() && sourceCustomDataModificationTime.isValid() &&
- targetCustomDataModificationTime > sourceCustomDataModificationTime)) {
+ const auto targetCustomDataModificationTime = targetMetadata->customData()->getLastModified();
+ const auto sourceCustomDataModificationTime = sourceMetadata->customData()->getLastModified();
+ if (!targetMetadata->customData()->contains(CustomData::LastModified)
+ || (targetCustomDataModificationTime.isValid() && sourceCustomDataModificationTime.isValid()
+ && targetCustomDataModificationTime < sourceCustomDataModificationTime)) {
const auto sourceCustomDataKeys = sourceMetadata->customData()->keys();
const auto targetCustomDataKeys = targetMetadata->customData()->keys();
@@ -642,9 +641,18 @@ Merger::ChangeList Merger::mergeMetadata(const MergeContext& context)
// Transfer new/existing keys
for (const auto& key : sourceCustomDataKeys) {
- auto value = sourceMetadata->customData()->value(key);
- targetMetadata->customData()->set(key, value);
- changes << tr("Adding custom data %1 [%2]").arg(key, value);
+ // Don't merge this meta field, it is updated automatically.
+ if (key == CustomData::LastModified) {
+ continue;
+ }
+
+ auto sourceValue = sourceMetadata->customData()->value(key);
+ auto targetValue = targetMetadata->customData()->value(key);
+ // Merge only if the values are not the same.
+ if (sourceValue != targetValue) {
+ targetMetadata->customData()->set(key, sourceValue);
+ changes << tr("Adding custom data %1 [%2]").arg(key, sourceValue);
+ }
}
}
diff --git a/src/core/Merger.h b/src/core/Merger.h
index 03a47a27f..712f4fde3 100644
--- a/src/core/Merger.h
+++ b/src/core/Merger.h
@@ -33,7 +33,7 @@ public:
Merger(const Group* sourceGroup, Group* targetGroup);
void setForcedMergeMode(Group::MergeMode mode);
void resetForcedMergeMode();
- bool merge();
+ QStringList merge();
private:
typedef QString Change;
diff --git a/src/core/NetworkManager.cpp b/src/core/NetworkManager.cpp
new file mode 100644
index 000000000..52b54609f
--- /dev/null
+++ b/src/core/NetworkManager.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "config-keepassx.h"
+
+#ifdef WITH_XC_NETWORKING
+#include "NetworkManager.h"
+
+#include <QCoreApplication>
+
+QNetworkAccessManager* g_netMgr = nullptr;
+QNetworkAccessManager* getNetMgr()
+{
+ if (!g_netMgr) {
+ g_netMgr = new QNetworkAccessManager(QCoreApplication::instance());
+ }
+ return g_netMgr;
+}
+#endif
diff --git a/src/core/NetworkManager.h b/src/core/NetworkManager.h
new file mode 100644
index 000000000..561621874
--- /dev/null
+++ b/src/core/NetworkManager.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_NETWORKMANAGER_H
+#define KEEPASSXC_NETWORKMANAGER_H
+
+#include "config-keepassx.h"
+#include <QtGlobal>
+
+#ifdef WITH_XC_NETWORKING
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+
+QNetworkAccessManager* getNetMgr();
+#else
+Q_STATIC_ASSERT_X(false, "Qt Networking used when WITH_XC_NETWORKING is disabled!");
+#endif
+
+#endif // KEEPASSXC_NETWORKMANAGER_H
diff --git a/src/core/OSEventFilter.cpp b/src/core/OSEventFilter.cpp
index d5873ee8d..f1f4d97a9 100644
--- a/src/core/OSEventFilter.cpp
+++ b/src/core/OSEventFilter.cpp
@@ -37,16 +37,8 @@ bool OSEventFilter::nativeEventFilter(const QByteArray& eventType, void* message
#if defined(Q_OS_UNIX)
if (eventType == QByteArrayLiteral("xcb_generic_event_t")) {
#elif defined(Q_OS_WIN)
- auto winmsg = static_cast<MSG*>(message);
- if (winmsg->message == WM_QUERYENDSESSION) {
- *result = 1;
- return true;
- } else if (winmsg->message == WM_ENDSESSION) {
- getMainWindow()->appExit();
- *result = 0;
- return true;
- } else if (eventType == QByteArrayLiteral("windows_generic_MSG")
- || eventType == QByteArrayLiteral("windows_dispatcher_MSG")) {
+ if (eventType == QByteArrayLiteral("windows_generic_MSG")
+ || eventType == QByteArrayLiteral("windows_dispatcher_MSG")) {
#endif
return autoType()->callEventFilter(message) == 1;
}
diff --git a/src/core/PassphraseGenerator.cpp b/src/core/PassphraseGenerator.cpp
index f972e0ef2..b14886a1a 100644
--- a/src/core/PassphraseGenerator.cpp
+++ b/src/core/PassphraseGenerator.cpp
@@ -28,30 +28,33 @@ const char* PassphraseGenerator::DefaultSeparator = " ";
const char* PassphraseGenerator::DefaultWordList = "eff_large.wordlist";
PassphraseGenerator::PassphraseGenerator()
- : m_wordCount(0)
- , m_separator(PassphraseGenerator::DefaultSeparator)
+ : m_wordCount(DefaultWordCount)
+ , m_wordCase(LOWERCASE)
+ , m_separator(DefaultSeparator)
{
+ setDefaultWordList();
}
-double PassphraseGenerator::calculateEntropy(const QString& passphrase)
+double PassphraseGenerator::estimateEntropy(int wordCount)
{
- Q_UNUSED(passphrase);
-
if (m_wordlist.isEmpty()) {
return 0.0;
}
+ if (wordCount < 1) {
+ wordCount = m_wordCount;
+ }
- return std::log2(m_wordlist.size()) * m_wordCount;
+ return std::log2(m_wordlist.size()) * wordCount;
}
void PassphraseGenerator::setWordCount(int wordCount)
{
- if (wordCount > 0) {
- m_wordCount = wordCount;
- } else {
- // safe default if something goes wrong
- m_wordCount = DefaultWordCount;
- }
+ m_wordCount = qMax(1, wordCount);
+}
+
+void PassphraseGenerator::setWordCase(PassphraseWordCase wordCase)
+{
+ m_wordCase = wordCase;
}
void PassphraseGenerator::setWordList(const QString& path)
@@ -88,6 +91,7 @@ void PassphraseGenerator::setWordSeparator(const QString& separator)
QString PassphraseGenerator::generatePassphrase() const
{
+ QString tmpWord;
Q_ASSERT(isValid());
// In case there was an error loading the wordlist
@@ -98,7 +102,22 @@ QString PassphraseGenerator::generatePassphrase() const
QStringList words;
for (int i = 0; i < m_wordCount; ++i) {
int wordIndex = randomGen()->randomUInt(static_cast<quint32>(m_wordlist.length()));
- words.append(m_wordlist.at(wordIndex));
+ tmpWord = m_wordlist.at(wordIndex);
+
+ // convert case
+ switch (m_wordCase) {
+ case UPPERCASE:
+ tmpWord = tmpWord.toUpper();
+ break;
+ case TITLECASE:
+ tmpWord = tmpWord.replace(0, 1, tmpWord.left(1).toUpper());
+ break;
+ case LOWERCASE:
+ default:
+ tmpWord = tmpWord.toLower();
+ break;
+ }
+ words.append(tmpWord);
}
return words.join(m_separator);
diff --git a/src/core/PassphraseGenerator.h b/src/core/PassphraseGenerator.h
index a4e0e426b..5868faab4 100644
--- a/src/core/PassphraseGenerator.h
+++ b/src/core/PassphraseGenerator.h
@@ -28,9 +28,17 @@ public:
PassphraseGenerator();
Q_DISABLE_COPY(PassphraseGenerator)
- double calculateEntropy(const QString& passphrase);
+ enum PassphraseWordCase
+ {
+ LOWERCASE,
+ UPPERCASE,
+ TITLECASE
+ };
+
+ double estimateEntropy(int wordCount = 0);
void setWordCount(int wordCount);
void setWordList(const QString& path);
+ void setWordCase(PassphraseWordCase wordCase);
void setDefaultWordList();
void setWordSeparator(const QString& separator);
bool isValid() const;
@@ -43,6 +51,7 @@ public:
private:
int m_wordCount;
+ PassphraseWordCase m_wordCase;
QString m_separator;
QVector<QString> m_wordlist;
};
diff --git a/src/core/PasswordGenerator.cpp b/src/core/PasswordGenerator.cpp
index 1132582d6..e203af672 100644
--- a/src/core/PasswordGenerator.cpp
+++ b/src/core/PasswordGenerator.cpp
@@ -31,7 +31,7 @@ PasswordGenerator::PasswordGenerator()
{
}
-double PasswordGenerator::calculateEntropy(const QString& password)
+double PasswordGenerator::estimateEntropy(const QString& password)
{
return ZxcvbnMatch(password.toLatin1(), nullptr, nullptr);
}
diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h
index 7bfdddd69..22627d25b 100644
--- a/src/core/PasswordGenerator.h
+++ b/src/core/PasswordGenerator.h
@@ -57,7 +57,7 @@ public:
public:
PasswordGenerator();
- double calculateEntropy(const QString& password);
+ double estimateEntropy(const QString& password);
void setLength(int length);
void setCharClasses(const CharClasses& classes);
void setFlags(const GeneratorFlags& flags);
diff --git a/src/core/Tools.cpp b/src/core/Tools.cpp
index 46cde95bc..9035a96a7 100644
--- a/src/core/Tools.cpp
+++ b/src/core/Tools.cpp
@@ -23,6 +23,7 @@
#include "core/Config.h"
#include "core/Translator.h"
+#include "git-info.h"
#include <QCoreApplication>
#include <QElapsedTimer>
#include <QIODevice>
@@ -33,7 +34,6 @@
#include <QSysInfo>
#include <QUuid>
#include <cctype>
-#include "git-info.h"
#ifdef Q_OS_WIN
#include <windows.h> // for Sleep()
@@ -75,7 +75,6 @@ namespace Tools
#endif
debugInfo.append("\n");
-
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
debugInfo.append(QObject::tr("Operating system: %1\nCPU architecture: %2\nKernel: %3 %4")
.arg(QSysInfo::prettyProductName(),
@@ -194,7 +193,7 @@ namespace Tools
bool isHex(const QByteArray& ba)
{
- for (const unsigned char c : ba) {
+ for (const uchar c : ba) {
if (!std::isxdigit(c)) {
return false;
}
diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp
index 95de3ce91..4e3f568cb 100644
--- a/src/core/Translator.cpp
+++ b/src/core/Translator.cpp
@@ -34,16 +34,21 @@
*/
void Translator::installTranslators()
{
- QLocale locale;
- QString language = config()->get("GUI/Language").toString();
- if (!language.isEmpty() && language != "system") {
- // use actual English translation instead of the English locale source language
- if (language == "en") {
- language = "en_US";
- }
- locale = QLocale(language);
+ QStringList languages;
+ QString languageSetting = config()->get("GUI/Language").toString();
+ if (languageSetting.isEmpty() || languageSetting == "system") {
+ // NOTE: this is a workaround for the terrible way Qt loads languages
+ // using the QLocale::uiLanguages() approach. Instead, we search each
+ // language and all country variants in order before moving to the next.
+ QLocale locale;
+ languages = locale.uiLanguages();
+ } else {
+ languages << languageSetting;
}
+ // Always try to load english last
+ languages << "en_US";
+
const QStringList paths = {
#ifdef QT_DEBUG
QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
@@ -52,9 +57,10 @@ void Translator::installTranslators()
bool translationsLoaded = false;
for (const QString& path : paths) {
- translationsLoaded |= installTranslator(locale, path) || installTranslator(QLocale("en_US"), path);
- if (!installQtTranslator(language, path)) {
- installQtTranslator(QLocale("en"), path);
+ installQtTranslator(languages, path);
+ if (installTranslator(languages, path)) {
+ translationsLoaded = true;
+ break;
}
}
@@ -65,6 +71,48 @@ void Translator::installTranslators()
}
/**
+ * Install KeePassXC translator.
+ *
+ * @param languages priority-ordered list of languages
+ * @param path absolute search path
+ * @return true on success
+ */
+bool Translator::installTranslator(const QStringList& languages, const QString& path)
+{
+ for (const auto& language : languages) {
+ QLocale locale(language);
+ QScopedPointer<QTranslator> translator(new QTranslator(qApp));
+ if (translator->load(locale, "keepassx_", "", path)) {
+ return QCoreApplication::installTranslator(translator.take());
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Install Qt5 base translator from the specified local search path or the default system path
+ * if no qtbase_* translations were found at the local path.
+ *
+ * @param languages priority-ordered list of languages
+ * @param path absolute search path
+ * @return true on success
+ */
+bool Translator::installQtTranslator(const QStringList& languages, const QString& path)
+{
+ for (const auto& language : languages) {
+ QLocale locale(language);
+ QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
+ if (qtTranslator->load(locale, "qtbase_", "", path)) {
+ return QCoreApplication::installTranslator(qtTranslator.take());
+ } else if (qtTranslator->load(locale, "qtbase_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
+ return QCoreApplication::installTranslator(qtTranslator.take());
+ }
+ }
+ return false;
+}
+
+/**
* @return list of pairs of available language codes and names
*/
QList<QPair<QString, QString>> Translator::availableLanguages()
@@ -108,38 +156,3 @@ QList<QPair<QString, QString>> Translator::availableLanguages()
return languages;
}
-
-/**
- * Install KeePassXC translator.
- *
- * @param language translator language
- * @param path local search path
- * @return true on success
- */
-bool Translator::installTranslator(const QLocale& locale, const QString& path)
-{
- QScopedPointer<QTranslator> translator(new QTranslator(qApp));
- if (translator->load(locale, "keepassx_", "", path)) {
- return QCoreApplication::installTranslator(translator.take());
- }
- return false;
-}
-
-/**
- * Install Qt5 base translator from the specified local search path or the default system path
- * if no qtbase_* translations were found at the local path.
- *
- * @param language translator language
- * @param path local search path
- * @return true on success
- */
-bool Translator::installQtTranslator(const QLocale& locale, const QString& path)
-{
- QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
- if (qtTranslator->load(locale, "qtbase_", "", path)) {
- return QCoreApplication::installTranslator(qtTranslator.take());
- } else if (qtTranslator->load(locale, "qtbase_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
- return QCoreApplication::installTranslator(qtTranslator.take());
- }
- return false;
-}
diff --git a/src/core/Translator.h b/src/core/Translator.h
index cfc49d710..8236ade43 100644
--- a/src/core/Translator.h
+++ b/src/core/Translator.h
@@ -18,9 +18,9 @@
#ifndef KEEPASSX_TRANSLATOR_H
#define KEEPASSX_TRANSLATOR_H
+#include <QLocale>
#include <QPair>
#include <QString>
-#include <QLocale>
class Translator
{
@@ -29,8 +29,8 @@ public:
static QList<QPair<QString, QString>> availableLanguages();
private:
- static bool installTranslator(const QLocale& locale, const QString& path);
- static bool installQtTranslator(const QLocale& locale, const QString& path);
+ static bool installTranslator(const QStringList& languages, const QString& path);
+ static bool installQtTranslator(const QStringList& languages, const QString& path);
};
#endif // KEEPASSX_TRANSLATOR_H
diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp
index cdb0d1f56..ee4295eec 100644
--- a/src/crypto/SymmetricCipher.cpp
+++ b/src/crypto/SymmetricCipher.cpp
@@ -126,6 +126,8 @@ int SymmetricCipher::algorithmIvSize(Algorithm algo)
switch (algo) {
case ChaCha20:
return 12;
+ case Aes128:
+ return 16;
case Aes256:
return 16;
case Twofish:
diff --git a/src/fdosecrets/CMakeLists.txt b/src/fdosecrets/CMakeLists.txt
new file mode 100644
index 000000000..9d3fcb6a9
--- /dev/null
+++ b/src/fdosecrets/CMakeLists.txt
@@ -0,0 +1,36 @@
+if(WITH_XC_FDOSECRETS)
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+
+ add_library(fdosecrets STATIC
+ # app settings page
+ FdoSecretsPlugin.cpp
+ widgets/SettingsWidgetFdoSecrets.cpp
+
+ # per database settings page
+ DatabaseSettingsPageFdoSecrets.cpp
+ widgets/DatabaseSettingsWidgetFdoSecrets.cpp
+
+ # setting storage
+ FdoSecretsSettings.cpp
+
+ # gcrypt MPI wrapper
+ GcryptMPI.cpp
+
+ # dbus objects
+ objects/DBusObject.cpp
+ objects/Service.cpp
+ objects/Session.cpp
+ objects/SessionCipher.cpp
+ objects/Collection.cpp
+ objects/Item.cpp
+ objects/Prompt.cpp
+ objects/adaptors/ServiceAdaptor.cpp
+ objects/adaptors/SessionAdaptor.cpp
+ objects/adaptors/CollectionAdaptor.cpp
+ objects/adaptors/ItemAdaptor.cpp
+ objects/adaptors/PromptAdaptor.cpp
+ objects/DBusReturn.cpp
+ objects/DBusTypes.cpp
+ )
+ target_link_libraries(fdosecrets Qt5::Core Qt5::Widgets Qt5::DBus ${GCRYPT_LIBRARIES})
+endif()
diff --git a/src/fdosecrets/DatabaseSettingsPageFdoSecrets.cpp b/src/fdosecrets/DatabaseSettingsPageFdoSecrets.cpp
new file mode 100644
index 000000000..afd888ed2
--- /dev/null
+++ b/src/fdosecrets/DatabaseSettingsPageFdoSecrets.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "DatabaseSettingsPageFdoSecrets.h"
+
+#include "fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.h"
+
+#include "core/FilePath.h"
+
+QString DatabaseSettingsPageFdoSecrets::name()
+{
+ return QObject::tr("Secret Service Integration");
+}
+
+QIcon DatabaseSettingsPageFdoSecrets::icon()
+{
+ return filePath()->icon(QStringLiteral("apps"), QStringLiteral("freedesktop"));
+}
+
+QWidget* DatabaseSettingsPageFdoSecrets::createWidget()
+{
+ return new DatabaseSettingsWidgetFdoSecrets;
+}
+
+void DatabaseSettingsPageFdoSecrets::loadSettings(QWidget* widget, QSharedPointer<Database> db)
+{
+ auto settingsWidget = qobject_cast<DatabaseSettingsWidgetFdoSecrets*>(widget);
+ settingsWidget->loadSettings(db);
+}
+
+void DatabaseSettingsPageFdoSecrets::saveSettings(QWidget* widget)
+{
+ auto settingsWidget = qobject_cast<DatabaseSettingsWidgetFdoSecrets*>(widget);
+ settingsWidget->saveSettings();
+}
diff --git a/src/fdosecrets/DatabaseSettingsPageFdoSecrets.h b/src/fdosecrets/DatabaseSettingsPageFdoSecrets.h
new file mode 100644
index 000000000..c54f5a276
--- /dev/null
+++ b/src/fdosecrets/DatabaseSettingsPageFdoSecrets.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_DATABASESETTINGSPAGEFDOSECRETS_H
+#define KEEPASSXC_DATABASESETTINGSPAGEFDOSECRETS_H
+
+#include "gui/dbsettings/DatabaseSettingsDialog.h"
+
+class DatabaseSettingsPageFdoSecrets : public IDatabaseSettingsPage
+{
+ Q_DISABLE_COPY(DatabaseSettingsPageFdoSecrets)
+public:
+ DatabaseSettingsPageFdoSecrets() = default;
+
+ QString name() override;
+ QIcon icon() override;
+ QWidget* createWidget() override;
+ void loadSettings(QWidget* widget, QSharedPointer<Database> db) override;
+ void saveSettings(QWidget* widget) override;
+};
+
+#endif // KEEPASSXC_DATABASESETTINGSPAGEFDOSECRETS_H
diff --git a/src/fdosecrets/FdoSecretsPlugin.cpp b/src/fdosecrets/FdoSecretsPlugin.cpp
new file mode 100644
index 000000000..668b5fb04
--- /dev/null
+++ b/src/fdosecrets/FdoSecretsPlugin.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "FdoSecretsPlugin.h"
+
+#include "fdosecrets/FdoSecretsSettings.h"
+#include "fdosecrets/objects/DBusTypes.h"
+#include "fdosecrets/objects/Service.h"
+#include "fdosecrets/widgets/SettingsWidgetFdoSecrets.h"
+
+#include "gui/DatabaseTabWidget.h"
+
+#include <utility>
+
+using FdoSecrets::Service;
+
+FdoSecretsPlugin::FdoSecretsPlugin(DatabaseTabWidget* tabWidget)
+ : m_dbTabs(tabWidget)
+{
+ FdoSecrets::registerDBusTypes();
+}
+
+QWidget* FdoSecretsPlugin::createWidget()
+{
+ return new SettingsWidgetFdoSecrets(this);
+}
+
+void FdoSecretsPlugin::loadSettings(QWidget* widget)
+{
+ qobject_cast<SettingsWidgetFdoSecrets*>(widget)->loadSettings();
+}
+
+void FdoSecretsPlugin::saveSettings(QWidget* widget)
+{
+ qobject_cast<SettingsWidgetFdoSecrets*>(widget)->saveSettings();
+ updateServiceState();
+}
+
+void FdoSecretsPlugin::updateServiceState()
+{
+ if (FdoSecrets::settings()->isEnabled()) {
+ if (!m_secretService && m_dbTabs) {
+ m_secretService.reset(new Service(this, m_dbTabs));
+ connect(m_secretService.data(), &Service::error, this, [this](const QString& msg) {
+ emit error(tr("Fdo Secret Service: %1").arg(msg));
+ });
+ if (!m_secretService->initialize()) {
+ m_secretService.reset();
+ }
+ }
+ } else {
+ if (m_secretService) {
+ m_secretService.reset();
+ }
+ }
+}
+
+Service* FdoSecretsPlugin::serviceInstance() const
+{
+ return m_secretService.data();
+}
+
+void FdoSecretsPlugin::emitRequestSwitchToDatabases()
+{
+ emit requestSwitchToDatabases();
+}
+
+void FdoSecretsPlugin::emitRequestShowNotification(const QString& msg, const QString& title)
+{
+ if (!FdoSecrets::settings()->showNotification()) {
+ return;
+ }
+ emit requestShowNotification(msg, title, 10000);
+}
diff --git a/src/fdosecrets/FdoSecretsPlugin.h b/src/fdosecrets/FdoSecretsPlugin.h
new file mode 100644
index 000000000..2a57ea0db
--- /dev/null
+++ b/src/fdosecrets/FdoSecretsPlugin.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETSPLUGIN_H
+#define KEEPASSXC_FDOSECRETSPLUGIN_H
+
+#include "core/FilePath.h"
+#include "gui/ApplicationSettingsWidget.h"
+
+#include <QPointer>
+#include <QScopedPointer>
+
+class DatabaseTabWidget;
+
+namespace FdoSecrets
+{
+ class Service;
+} // namespace FdoSecrets
+
+class FdoSecretsPlugin : public QObject, public ISettingsPage
+{
+ Q_OBJECT
+public:
+ explicit FdoSecretsPlugin(DatabaseTabWidget* tabWidget);
+ ~FdoSecretsPlugin() override = default;
+
+ QString name() override
+ {
+ return QObject::tr("Secret Service Integration");
+ }
+
+ QIcon icon() override
+ {
+ return FilePath::instance()->icon("apps", "freedesktop");
+ }
+
+ QWidget* createWidget() override;
+ void loadSettings(QWidget* widget) override;
+ void saveSettings(QWidget* widget) override;
+
+ void updateServiceState();
+
+ /**
+ * @return The service instance, can be nullptr if the service is disabled.
+ */
+ FdoSecrets::Service* serviceInstance() const;
+
+public slots:
+ void emitRequestSwitchToDatabases();
+ void emitRequestShowNotification(const QString& msg, const QString& title = {});
+
+signals:
+ void error(const QString& msg);
+ void requestSwitchToDatabases();
+ void requestShowNotification(const QString& msg, const QString& title, int msTimeoutHint);
+
+private:
+ QPointer<DatabaseTabWidget> m_dbTabs;
+ QScopedPointer<FdoSecrets::Service> m_secretService;
+};
+
+#endif // KEEPASSXC_FDOSECRETSPLUGIN_H
diff --git a/src/fdosecrets/FdoSecretsSettings.cpp b/src/fdosecrets/FdoSecretsSettings.cpp
new file mode 100644
index 000000000..36c41705f
--- /dev/null
+++ b/src/fdosecrets/FdoSecretsSettings.cpp
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "FdoSecretsSettings.h"
+
+#include "core/Config.h"
+#include "core/CustomData.h"
+#include "core/Database.h"
+#include "core/Metadata.h"
+
+namespace Keys
+{
+
+ constexpr auto FdoSecretsEnabled = "FdoSecrets/Enabled";
+ constexpr auto FdoSecretsShowNotification = "FdoSecrets/ShowNotification";
+ constexpr auto FdoSecretsNoConfirmDeleteItem = "FdoSecrets/NoConfirmDeleteItem";
+
+ namespace Db
+ {
+ constexpr auto FdoSecretsExposedGroup = "FDO_SECRETS_EXPOSED_GROUP";
+ } // namespace Db
+
+} // namespace Keys
+
+namespace FdoSecrets
+{
+
+ FdoSecretsSettings* FdoSecretsSettings::m_instance = nullptr;
+
+ FdoSecretsSettings* FdoSecretsSettings::instance()
+ {
+ if (!m_instance) {
+ m_instance = new FdoSecretsSettings;
+ }
+ return m_instance;
+ }
+
+ bool FdoSecretsSettings::isEnabled() const
+ {
+ return config()->get(Keys::FdoSecretsEnabled, false).toBool();
+ }
+
+ void FdoSecretsSettings::setEnabled(bool enabled)
+ {
+ config()->set(Keys::FdoSecretsEnabled, enabled);
+ }
+
+ bool FdoSecretsSettings::showNotification() const
+ {
+ return config()->get(Keys::FdoSecretsShowNotification, true).toBool();
+ }
+
+ void FdoSecretsSettings::setShowNotification(bool show)
+ {
+ config()->set(Keys::FdoSecretsShowNotification, show);
+ }
+
+ bool FdoSecretsSettings::noConfirmDeleteItem() const
+ {
+ return config()->get(Keys::FdoSecretsNoConfirmDeleteItem, false).toBool();
+ }
+
+ void FdoSecretsSettings::setNoConfirmDeleteItem(bool noConfirm)
+ {
+ config()->set(Keys::FdoSecretsNoConfirmDeleteItem, noConfirm);
+ }
+
+ QUuid FdoSecretsSettings::exposedGroup(const QSharedPointer<Database>& db) const
+ {
+ return exposedGroup(db.data());
+ }
+
+ void FdoSecretsSettings::setExposedGroup(const QSharedPointer<Database>& db,
+ const QUuid& group) // clazy:exclude=function-args-by-value
+ {
+ setExposedGroup(db.data(), group);
+ }
+
+ QUuid FdoSecretsSettings::exposedGroup(Database* db) const
+ {
+ return {db->metadata()->customData()->value(Keys::Db::FdoSecretsExposedGroup)};
+ }
+
+ void FdoSecretsSettings::setExposedGroup(Database* db, const QUuid& group) // clazy:exclude=function-args-by-value
+ {
+ db->metadata()->customData()->set(Keys::Db::FdoSecretsExposedGroup, group.toString());
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/FdoSecretsSettings.h b/src/fdosecrets/FdoSecretsSettings.h
new file mode 100644
index 000000000..5a9028876
--- /dev/null
+++ b/src/fdosecrets/FdoSecretsSettings.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETSSETTINGS_H
+#define KEEPASSXC_FDOSECRETSSETTINGS_H
+
+#include <QSharedPointer>
+#include <QUuid>
+
+class Database;
+
+namespace FdoSecrets
+{
+
+ class FdoSecretsSettings
+ {
+ public:
+ FdoSecretsSettings() = default;
+ static FdoSecretsSettings* instance();
+
+ bool isEnabled() const;
+ void setEnabled(bool enabled);
+
+ bool showNotification() const;
+ void setShowNotification(bool show);
+
+ bool noConfirmDeleteItem() const;
+ void setNoConfirmDeleteItem(bool noConfirm);
+
+ // Per db settings
+
+ QUuid exposedGroup(const QSharedPointer<Database>& db) const;
+ void setExposedGroup(const QSharedPointer<Database>& db, const QUuid& group);
+ QUuid exposedGroup(Database* db) const;
+ void setExposedGroup(Database* db, const QUuid& group);
+
+ private:
+ static FdoSecretsSettings* m_instance;
+ };
+
+ inline FdoSecretsSettings* settings()
+ {
+ return FdoSecretsSettings::instance();
+ }
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETSSETTINGS_H
diff --git a/src/fdosecrets/GcryptMPI.cpp b/src/fdosecrets/GcryptMPI.cpp
new file mode 100644
index 000000000..4fc792deb
--- /dev/null
+++ b/src/fdosecrets/GcryptMPI.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "GcryptMPI.h"
+
+GcryptMPI MpiFromBytes(const QByteArray& bytes, bool secure, gcry_mpi_format format)
+{
+ auto bufLen = static_cast<size_t>(bytes.size());
+
+ const char* buf = nullptr;
+
+ // gcry_mpi_scan uses secure memory only if input buffer is secure memory, so we have to make a copy
+ GcryptMemPtr secureBuf;
+ if (secure) {
+ secureBuf.reset(static_cast<char*>(gcry_malloc_secure(bufLen)));
+ memcpy(secureBuf.get(), bytes.data(), bufLen);
+ buf = secureBuf.get();
+ } else {
+ buf = bytes.data();
+ }
+
+ gcry_mpi_t rawMpi;
+ auto err = gcry_mpi_scan(&rawMpi, format, buf, format == GCRYMPI_FMT_HEX ? 0 : bufLen, nullptr);
+ GcryptMPI mpi(rawMpi);
+
+ if (gcry_err_code(err) != GPG_ERR_NO_ERROR) {
+ mpi.reset();
+ }
+
+ return mpi;
+}
+
+GcryptMPI MpiFromHex(const char* hex, bool secure)
+{
+ return MpiFromBytes(QByteArray::fromRawData(hex, static_cast<int>(strlen(hex) + 1)), secure, GCRYMPI_FMT_HEX);
+}
+
+QByteArray MpiToBytes(const GcryptMPI& mpi)
+{
+ unsigned char* buf = nullptr;
+ size_t buflen = 0;
+ gcry_mpi_aprint(GCRYMPI_FMT_USG, &buf, &buflen, mpi.get());
+
+ QByteArray bytes(reinterpret_cast<char*>(buf), static_cast<int>(buflen));
+
+ gcry_free(buf);
+
+ return bytes;
+}
diff --git a/src/fdosecrets/GcryptMPI.h b/src/fdosecrets/GcryptMPI.h
new file mode 100644
index 000000000..bbc3d0439
--- /dev/null
+++ b/src/fdosecrets/GcryptMPI.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_GCRYPTMPI_H
+#define KEEPASSXC_GCRYPTMPI_H
+
+#include <QByteArray>
+
+#include <gcrypt.h>
+
+#include <memory>
+#include <type_traits>
+
+template <typename D, D fn> using deleter_from_fn = std::integral_constant<D, fn>;
+
+/**
+ * A simple RAII wrapper for gcry_mpi_t
+ */
+using GcryptMPI = std::unique_ptr<gcry_mpi, deleter_from_fn<decltype(&gcry_mpi_release), &gcry_mpi_release>>;
+
+/**
+ * A simple RAII wrapper for libgcrypt allocated memory
+ */
+using GcryptMemPtr = std::unique_ptr<char, deleter_from_fn<decltype(&gcry_free), &gcry_free>>;
+
+/**
+ * Parse a QByteArray as MPI
+ * @param bytes
+ * @param secure
+ * @param format
+ * @return
+ */
+GcryptMPI MpiFromBytes(const QByteArray& bytes, bool secure = true, gcry_mpi_format format = GCRYMPI_FMT_USG);
+
+/**
+ * Parse MPI from hex data
+ * @param hex
+ * @param secure
+ * @return
+ */
+GcryptMPI MpiFromHex(const char* hex, bool secure = true);
+
+/**
+ * Dump MPI to bytes in USG format
+ * @param mpi
+ * @return
+ */
+QByteArray MpiToBytes(const GcryptMPI& mpi);
+
+#endif // KEEPASSXC_GCRYPTMPI_H
diff --git a/src/fdosecrets/README.md b/src/fdosecrets/README.md
new file mode 100644
index 000000000..22278860c
--- /dev/null
+++ b/src/fdosecrets/README.md
@@ -0,0 +1,42 @@
+# Freedesktop.org Secret Storage Spec Server Side API
+
+This plugin implements the [Secret Storage specification][secrets] version 0.2. While running KeePassXC, it acts as a
+Secret Service server, registered on DBus, so clients like seahorse, python-secretstorage, or other implementations
+can connect and access the exposed database in KeePassXC.
+
+[secrets]: (https://www.freedesktop.org/wiki/Specifications/secret-storage-spec/)
+
+## Configurable settings
+
+* The user can specify if a database is exposed on DBus, and which group is exposed.
+* Whether to show desktop notification is shown when an entry is retrived.
+* Whether to skip confirmation for entries deleted from DBus
+
+## Implemented Attributes on Item Object
+
+The following attributes are exposed:
+
+|Key|Value|
+|:---:|:---:|
+|Title|The entry title|
+|UserName|The entry user name|
+|URL|The entry URL|
+|Notes|The entry notes|
+
+In addition, all non-protected custom attributes are also exposed.
+
+## Architecture
+
+* `FdoSecrets::Service` is the top level DBus service
+* There is one and only one `FdoSecrets::Collection` per opened database tab
+* Each entry under the exposed database group has a corresponding `FdoSecrets::Item` DBus object.
+
+### Signal connections
+
+- Collections are created when a corresponding database tab opened
+- If the database is locked, a collection is created
+- When the database is unlocked, collection populates its children
+- If the unlocked database's exposed group is none, collection deletes itself
+- If the database's exposed group changes, collection repopulates
+- If the database's exposed group changes to none, collection deletes itself
+- If the database's exposed group changes from none, the service recreates a collection
diff --git a/src/fdosecrets/objects/Collection.cpp b/src/fdosecrets/objects/Collection.cpp
new file mode 100644
index 000000000..ccf88cecc
--- /dev/null
+++ b/src/fdosecrets/objects/Collection.cpp
@@ -0,0 +1,654 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "Collection.h"
+
+#include "fdosecrets/FdoSecretsSettings.h"
+#include "fdosecrets/objects/Item.h"
+#include "fdosecrets/objects/Prompt.h"
+#include "fdosecrets/objects/Service.h"
+
+#include "core/Config.h"
+#include "core/Database.h"
+#include "core/EntrySearcher.h"
+#include "gui/DatabaseTabWidget.h"
+#include "gui/DatabaseWidget.h"
+
+#include <QFileInfo>
+
+namespace FdoSecrets
+{
+
+ Collection::Collection(Service* parent, DatabaseWidget* backend)
+ : DBusObject(parent)
+ , m_backend(backend)
+ , m_exposedGroup(nullptr)
+ , m_registered(false)
+ {
+ // whenever the file path or the database object itself change, we do a full reload.
+ connect(backend, &DatabaseWidget::databaseFilePathChanged, this, &Collection::reloadBackend);
+ connect(backend, &DatabaseWidget::databaseReplaced, this, &Collection::reloadBackend);
+
+ // also remember to clear/populate the database when lock state changes.
+ connect(backend, &DatabaseWidget::databaseUnlocked, this, &Collection::onDatabaseLockChanged);
+ connect(backend, &DatabaseWidget::databaseLocked, this, &Collection::onDatabaseLockChanged);
+
+ reloadBackend();
+ }
+
+ void Collection::reloadBackend()
+ {
+ if (m_registered) {
+ // delete all items
+ // this has to be done because the backend is actually still there, just we don't expose them
+ // NOTE: Do NOT use a for loop, because Item::doDelete will remove itself from m_items.
+ while (!m_items.isEmpty()) {
+ m_items.first()->doDelete();
+ }
+ cleanupConnections();
+
+ unregisterCurrentPath();
+ m_registered = false;
+ }
+
+ // make sure we have updated copy of the filepath, which is used to identify the database.
+ m_backendPath = m_backend->database()->filePath();
+
+ // the database may not have a name (derived from filePath) yet, which may happen if it's newly created.
+ // defer the registration to next time a file path change happens.
+ if (!name().isEmpty()) {
+ registerWithPath(
+ QStringLiteral(DBUS_PATH_TEMPLATE_COLLECTION).arg(p()->objectPath().path(), encodePath(name())),
+ new CollectionAdaptor(this));
+ m_registered = true;
+ }
+
+ // populate contents after expose on dbus, because items rely on parent's dbus object path
+ if (!backendLocked()) {
+ populateContents();
+ } else {
+ cleanupConnections();
+ }
+ }
+
+ DBusReturn<void> Collection::ensureBackend() const
+ {
+ if (!m_backend) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT));
+ }
+ return {};
+ }
+
+ DBusReturn<void> Collection::ensureUnlocked() const
+ {
+ if (backendLocked()) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_IS_LOCKED));
+ }
+ return {};
+ }
+
+ DBusReturn<const QList<Item*>> Collection::items() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ return m_items;
+ }
+
+ DBusReturn<QString> Collection::label() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ if (backendLocked()) {
+ return name();
+ }
+ return m_backend->database()->metadata()->name();
+ }
+
+ DBusReturn<void> Collection::setLabel(const QString& label)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ m_backend->database()->metadata()->setName(label);
+ return {};
+ }
+
+ DBusReturn<bool> Collection::locked() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ return backendLocked();
+ }
+
+ DBusReturn<qulonglong> Collection::created() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+ return static_cast<qulonglong>(m_backend->database()->rootGroup()->timeInfo().creationTime().toMSecsSinceEpoch()
+ / 1000);
+ }
+
+ DBusReturn<qulonglong> Collection::modified() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+ // FIXME: there seems not to have a global modified time.
+ // Use a more accurate time, considering all metadata, group, entry.
+ return static_cast<qulonglong>(
+ m_backend->database()->rootGroup()->timeInfo().lastModificationTime().toMSecsSinceEpoch() / 1000);
+ }
+
+ DBusReturn<PromptBase*> Collection::deleteCollection()
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ // Delete means close database
+ auto prompt = new DeleteCollectionPrompt(service(), this);
+ if (backendLocked()) {
+ // this won't raise a dialog, immediate execute
+ auto pret = prompt->prompt({});
+ if (pret.isError()) {
+ return pret;
+ }
+ prompt = nullptr;
+ }
+ // defer the close to the prompt
+ return prompt;
+ }
+
+ DBusReturn<const QList<Item*>> Collection::searchItems(const StringStringMap& attributes)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ // searchItems should work, whether `this` is locked or not.
+ // however, we can't search items the same way as in gnome-keying,
+ // because there's no database at all when locked.
+ return QList<Item*>{};
+ }
+
+ // shortcut logic for Uuid/Path attributes, as they can uniquely identify an item.
+ if (attributes.contains(ItemAttributes::UuidKey)) {
+ auto uuid = QUuid::fromRfc4122(QByteArray::fromHex(attributes.value(ItemAttributes::UuidKey).toLatin1()));
+ auto entry = m_exposedGroup->findEntryByUuid(uuid);
+ if (entry) {
+ return QList<Item*>{m_entryToItem.value(entry)};
+ } else {
+ return QList<Item*>{};
+ }
+ }
+
+ if (attributes.contains(ItemAttributes::PathKey)) {
+ auto path = attributes.value(ItemAttributes::PathKey);
+ auto entry = m_exposedGroup->findEntryByPath(path);
+ if (entry) {
+ return QList<Item*>{m_entryToItem.value(entry)};
+ } else {
+ return QList<Item*>{};
+ }
+ }
+
+ static QMap<QString, QString> attrKeyToField{
+ {EntryAttributes::TitleKey, QStringLiteral("title")},
+ {EntryAttributes::UserNameKey, QStringLiteral("user")},
+ {EntryAttributes::URLKey, QStringLiteral("url")},
+ {EntryAttributes::NotesKey, QStringLiteral("notes")},
+ };
+
+ QStringList terms;
+ for (auto it = attributes.constBegin(); it != attributes.constEnd(); ++it) {
+ if (it.key() == EntryAttributes::PasswordKey) {
+ continue;
+ }
+ auto field = attrKeyToField.value(it.key(), QStringLiteral("_") + Item::encodeAttributeKey(it.key()));
+ terms << QStringLiteral(R"raw(+%1:"%2")raw").arg(field, it.value());
+ }
+
+ QList<Item*> items;
+ const auto foundEntries = EntrySearcher().search(terms.join(' '), m_exposedGroup);
+ items.reserve(foundEntries.size());
+ for (const auto& entry : foundEntries) {
+ items << m_entryToItem.value(entry);
+ }
+ return items;
+ }
+
+ DBusReturn<Item*>
+ Collection::createItem(const QVariantMap& properties, const SecretStruct& secret, bool replace, PromptBase*& prompt)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ prompt = nullptr;
+
+ Item* item = nullptr;
+ QString itemPath;
+ StringStringMap attributes;
+
+ // check existing item using attributes
+ auto iterAttr = properties.find(QStringLiteral(DBUS_INTERFACE_SECRET_ITEM ".Attributes"));
+ if (iterAttr != properties.end()) {
+ attributes = qdbus_cast<StringStringMap>(iterAttr.value().value<QDBusArgument>());
+
+ itemPath = attributes.value(ItemAttributes::PathKey);
+
+ auto existings = searchItems(attributes);
+ if (existings.isError()) {
+ return existings;
+ }
+ if (!existings.value().isEmpty() && replace) {
+ item = existings.value().front();
+ }
+ }
+
+ if (!item) {
+ // normalize itemPath
+ itemPath = itemPath.startsWith('/') ? QString{} : QStringLiteral("/") + itemPath;
+
+ // split itemPath to groupPath and itemName
+ auto components = itemPath.split('/');
+ Q_ASSERT(components.size() >= 2);
+
+ auto itemName = components.takeLast();
+ Group* group = findCreateGroupByPath(components.join('/'));
+
+ // create new Entry in backend
+ auto* entry = new Entry();
+ entry->setUuid(QUuid::createUuid());
+ entry->setTitle(itemName);
+ entry->setUsername(m_backend->database()->metadata()->defaultUserName());
+ group->applyGroupIconOnCreateTo(entry);
+
+ entry->setGroup(group);
+
+ // when creation finishes in backend, we will already have item
+ item = m_entryToItem.value(entry, nullptr);
+ Q_ASSERT(item);
+ }
+
+ ret = item->setProperties(properties);
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = item->setSecret(secret);
+ if (ret.isError()) {
+ return ret;
+ }
+
+ return item;
+ }
+
+ DBusReturn<void> Collection::setProperties(const QVariantMap& properties)
+ {
+ auto label = properties.value(QStringLiteral(DBUS_INTERFACE_SECRET_COLLECTION ".Label")).toString();
+
+ auto ret = setLabel(label);
+ if (ret.isError()) {
+ return ret;
+ }
+
+ return {};
+ }
+
+ const QSet<QString> Collection::aliases() const
+ {
+ return m_aliases;
+ }
+
+ DBusReturn<void> Collection::addAlias(QString alias)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ alias = encodePath(alias);
+
+ if (m_aliases.contains(alias)) {
+ return {};
+ }
+
+ emit aliasAboutToAdd(alias);
+
+ bool ok = QDBusConnection::sessionBus().registerObject(
+ QStringLiteral(DBUS_PATH_TEMPLATE_ALIAS).arg(p()->objectPath().path(), alias), this);
+ if (ok) {
+ m_aliases.insert(alias);
+ emit aliasAdded(alias);
+ }
+
+ return {};
+ }
+
+ DBusReturn<void> Collection::removeAlias(QString alias)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ alias = encodePath(alias);
+
+ if (!m_aliases.contains(alias)) {
+ return {};
+ }
+
+ QDBusConnection::sessionBus().unregisterObject(
+ QStringLiteral(DBUS_PATH_TEMPLATE_ALIAS).arg(p()->objectPath().path(), alias));
+
+ m_aliases.remove(alias);
+ emit aliasRemoved(alias);
+
+ return {};
+ }
+
+ QString Collection::name() const
+ {
+ return QFileInfo(m_backendPath).baseName();
+ }
+
+ DatabaseWidget* Collection::backend() const
+ {
+ return m_backend;
+ }
+
+ void Collection::onDatabaseLockChanged()
+ {
+ auto locked = backendLocked();
+ if (!locked) {
+ populateContents();
+ } else {
+ cleanupConnections();
+ }
+ emit collectionLockChanged(locked);
+ emit collectionChanged();
+ }
+
+ void Collection::populateContents()
+ {
+ if (!m_registered) {
+ return;
+ }
+
+ // we have an unlocked db
+
+ auto newUuid = FdoSecrets::settings()->exposedGroup(m_backend->database());
+ auto newGroup = m_backend->database()->rootGroup()->findGroupByUuid(newUuid);
+ if (!newGroup) {
+ // no exposed group, delete self
+ doDelete();
+ return;
+ }
+
+ // clean up old group connections
+ cleanupConnections();
+
+ m_exposedGroup = newGroup;
+
+ // Attach signal to update exposed group settings if the group was removed.
+ // The lifetime of the connection is bound to the database object, because
+ // in Database::~Database, groups are also deleted, but we don't want to
+ // trigger this.
+ // This rely on the fact that QObject disconnects signals BEFORE deleting
+ // children.
+ QPointer<Database> db = m_backend->database().data();
+ connect(m_exposedGroup.data(), &Group::groupAboutToRemove, db, [db](Group* toBeRemoved) {
+ if (!db) {
+ return;
+ }
+ auto uuid = FdoSecrets::settings()->exposedGroup(db);
+ auto exposedGroup = db->rootGroup()->findGroupByUuid(uuid);
+ if (toBeRemoved == exposedGroup) {
+ // reset the exposed group to none
+ FdoSecrets::settings()->setExposedGroup(db, {});
+ }
+ });
+
+ // Monitor exposed group settings
+ connect(m_backend->database()->metadata()->customData(), &CustomData::customDataModified, this, [this]() {
+ if (!m_exposedGroup || !m_backend) {
+ return;
+ }
+ if (m_exposedGroup->uuid() == FdoSecrets::settings()->exposedGroup(m_backend->database())) {
+ // no change
+ return;
+ }
+ onDatabaseExposedGroupChanged();
+ });
+
+ // Add items for existing entry
+ const auto entries = m_exposedGroup->entriesRecursive(false);
+ for (const auto& entry : entries) {
+ onEntryAdded(entry, false);
+ }
+
+ connectGroupSignalRecursive(m_exposedGroup);
+ }
+
+ void Collection::onDatabaseExposedGroupChanged()
+ {
+ // delete all items
+ // this has to be done because the backend is actually still there
+ // just we don't expose them
+ for (const auto& item : asConst(m_items)) {
+ item->doDelete();
+ }
+
+ // repopulate
+ Q_ASSERT(!backendLocked());
+ populateContents();
+ }
+
+ void Collection::onEntryAdded(Entry* entry, bool emitSignal)
+ {
+ if (inRecycleBin(entry)) {
+ return;
+ }
+
+ auto item = new Item(this, entry);
+ m_items << item;
+ m_entryToItem[entry] = item;
+
+ // forward delete signals
+ connect(entry->group(), &Group::entryAboutToRemove, item, [item](Entry* toBeRemoved) {
+ if (item->backend() == toBeRemoved) {
+ item->doDelete();
+ }
+ });
+
+ // relay signals
+ connect(item, &Item::itemChanged, this, [this, item]() { emit itemChanged(item); });
+ connect(item, &Item::itemAboutToDelete, this, [this, item]() {
+ m_items.removeAll(item);
+ m_entryToItem.remove(item->backend());
+ emit itemDeleted(item);
+ });
+
+ if (emitSignal) {
+ emit itemCreated(item);
+ }
+ }
+
+ void Collection::connectGroupSignalRecursive(Group* group)
+ {
+ if (inRecycleBin(group)) {
+ return;
+ }
+
+ connect(group, &Group::groupModified, this, &Collection::collectionChanged);
+ connect(group, &Group::entryAdded, this, [this](Entry* entry) { onEntryAdded(entry, true); });
+
+ const auto children = group->children();
+ for (const auto& cg : children) {
+ connectGroupSignalRecursive(cg);
+ }
+ }
+
+ Service* Collection::service() const
+ {
+ return qobject_cast<Service*>(parent());
+ }
+
+ void Collection::doLock()
+ {
+ Q_ASSERT(m_backend);
+
+ m_backend->lock();
+ }
+
+ void Collection::doUnlock()
+ {
+ Q_ASSERT(m_backend);
+
+ service()->doUnlockDatabaseInDialog(m_backend);
+ }
+
+ void Collection::doDelete()
+ {
+ emit collectionAboutToDelete();
+
+ unregisterCurrentPath();
+
+ // remove alias manually to trigger signal
+ for (const auto& a : aliases()) {
+ removeAlias(a).okOrDie();
+ }
+
+ cleanupConnections();
+
+ m_exposedGroup = nullptr;
+
+ // reset backend and delete self
+ m_backend = nullptr;
+ deleteLater();
+ }
+
+ void Collection::cleanupConnections()
+ {
+ if (m_exposedGroup) {
+ m_exposedGroup->disconnect(this);
+ }
+ m_items.clear();
+ }
+
+ QString Collection::backendFilePath() const
+ {
+ return m_backendPath;
+ }
+
+ Group* Collection::exposedRootGroup() const
+ {
+ return m_exposedGroup;
+ }
+
+ bool Collection::backendLocked() const
+ {
+ return !m_backend || !m_backend->database()->isInitialized() || m_backend->isLocked();
+ }
+
+ void Collection::doDeleteEntries(QList<Entry*> entries)
+ {
+ m_backend->deleteEntries(std::move(entries));
+ }
+
+ Group* Collection::findCreateGroupByPath(const QString& groupPath)
+ {
+ auto group = m_exposedGroup->findGroupByPath(groupPath);
+ if (group) {
+ return group;
+ }
+
+ // groupPath can't be empty here, because otherwise it will match m_exposedGroup and was returned above
+ Q_ASSERT(!groupPath.isEmpty());
+
+ auto groups = groupPath.split('/', QString::SkipEmptyParts);
+ auto groupName = groups.takeLast();
+
+ // create parent group
+ auto parentGroup = findCreateGroupByPath(groups.join('/'));
+
+ // create this group
+ group = new Group();
+ group->setUuid(QUuid::createUuid());
+ group->setName(groupName);
+ group->setIcon(Group::DefaultIconNumber);
+ group->setParent(parentGroup);
+
+ return group;
+ }
+
+ bool Collection::inRecycleBin(Group* group) const
+ {
+ Q_ASSERT(m_backend);
+
+ if (!m_backend->database()->metadata()->recycleBin()) {
+ return false;
+ }
+
+ while (group) {
+ if (group->uuid() == m_backend->database()->metadata()->recycleBin()->uuid()) {
+ return true;
+ }
+ group = group->parentGroup();
+ }
+ return false;
+ }
+
+ bool Collection::inRecycleBin(Entry* entry) const
+ {
+ Q_ASSERT(entry);
+ return inRecycleBin(entry->group());
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/Collection.h b/src/fdosecrets/objects/Collection.h
new file mode 100644
index 000000000..f11669b7d
--- /dev/null
+++ b/src/fdosecrets/objects/Collection.h
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_COLLECTION_H
+#define KEEPASSXC_FDOSECRETS_COLLECTION_H
+
+#include "DBusObject.h"
+
+#include "adaptors/CollectionAdaptor.h"
+
+#include <QPointer>
+#include <QSet>
+
+class Database;
+class DatabaseWidget;
+class Entry;
+class Group;
+
+namespace FdoSecrets
+{
+ class Item;
+ class PromptBase;
+ class Service;
+ class Collection : public DBusObject
+ {
+ Q_OBJECT
+ public:
+ explicit Collection(Service* parent, DatabaseWidget* backend);
+
+ DBusReturn<const QList<Item*>> items() const;
+
+ DBusReturn<QString> label() const;
+ DBusReturn<void> setLabel(const QString& label);
+
+ DBusReturn<bool> locked() const;
+
+ DBusReturn<qulonglong> created() const;
+
+ DBusReturn<qulonglong> modified() const;
+
+ DBusReturn<PromptBase*> deleteCollection();
+ DBusReturn<const QList<Item*>> searchItems(const StringStringMap& attributes);
+ DBusReturn<Item*>
+ createItem(const QVariantMap& properties, const SecretStruct& secret, bool replace, PromptBase*& prompt);
+
+ signals:
+ void itemCreated(const Item* item);
+ void itemDeleted(const Item* item);
+ void itemChanged(const Item* item);
+
+ void collectionChanged();
+ void collectionAboutToDelete();
+ void collectionLockChanged(bool newLocked);
+
+ void aliasAboutToAdd(const QString& alias);
+ void aliasAdded(const QString& alias);
+ void aliasRemoved(const QString& alias);
+
+ public:
+ DBusReturn<void> setProperties(const QVariantMap& properties);
+
+ DBusReturn<void> removeAlias(QString alias);
+ DBusReturn<void> addAlias(QString alias);
+ const QSet<QString> aliases() const;
+
+ /**
+ * A human readable name of the collection, available even if the db is locked
+ * @return
+ */
+ QString name() const;
+
+ Group* exposedRootGroup() const;
+ DatabaseWidget* backend() const;
+ QString backendFilePath() const;
+ Service* service() const;
+ bool inRecycleBin(Group* group) const;
+ bool inRecycleBin(Entry* entry) const;
+
+ public slots:
+ // expose some methods for Prmopt to use
+ void doLock();
+ void doUnlock();
+ // will remove self
+ void doDelete();
+
+ // delete the Entry in backend from this collection
+ void doDeleteEntries(QList<Entry*> entries);
+
+ private slots:
+ void onDatabaseLockChanged();
+ void onDatabaseExposedGroupChanged();
+ void reloadBackend();
+
+ private:
+ friend class DeleteCollectionPrompt;
+ friend class CreateCollectionPrompt;
+
+ void onEntryAdded(Entry* entry, bool emitSignal);
+ void populateContents();
+ void connectGroupSignalRecursive(Group* group);
+ void cleanupConnections();
+
+ bool backendLocked() const;
+
+ /**
+ * Check if the backend is a valid object, send error reply if not.
+ * @return true if the backend is valid.
+ */
+ DBusReturn<void> ensureBackend() const;
+
+ /**
+ * Ensure the database is unlocked, send error reply if locked.
+ * @return true if the database is locked
+ */
+ DBusReturn<void> ensureUnlocked() const;
+
+ /**
+ * Like mkdir -p, find or create the group by path, under m_exposedGroup
+ * @param groupPath
+ * @return created or found group
+ */
+ Group* findCreateGroupByPath(const QString& groupPath);
+
+ private:
+ QPointer<DatabaseWidget> m_backend;
+ QString m_backendPath;
+ QPointer<Group> m_exposedGroup;
+
+ QSet<QString> m_aliases;
+ QList<Item*> m_items;
+ QMap<const Entry*, Item*> m_entryToItem;
+
+ bool m_registered;
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_COLLECTION_H
diff --git a/src/fdosecrets/objects/DBusObject.cpp b/src/fdosecrets/objects/DBusObject.cpp
new file mode 100644
index 000000000..8bf1ae4e5
--- /dev/null
+++ b/src/fdosecrets/objects/DBusObject.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "DBusObject.h"
+
+#include <QDBusAbstractAdaptor>
+#include <QFile>
+#include <QRegularExpression>
+#include <QTextStream>
+#include <QUrl>
+#include <QUuid>
+
+#include <utility>
+
+namespace FdoSecrets
+{
+
+ DBusObject::DBusObject(DBusObject* parent)
+ : QObject(parent)
+ {
+ }
+
+ void DBusObject::registerWithPath(const QString& path, QDBusAbstractAdaptor* adaptor)
+ {
+ m_objectPath.setPath(path);
+ m_dbusAdaptor = adaptor;
+ adaptor->setParent(this);
+ auto ok = QDBusConnection::sessionBus().registerObject(m_objectPath.path(), this);
+ Q_UNUSED(ok);
+ Q_ASSERT(ok);
+ }
+
+ QString DBusObject::callingPeerName() const
+ {
+ auto pid = callingPeerPid();
+ QFile proc(QStringLiteral("/proc/%1/comm").arg(pid));
+ if (!proc.open(QFile::ReadOnly)) {
+ return callingPeer();
+ }
+ QTextStream stream(&proc);
+ return stream.readAll().trimmed();
+ }
+
+ QString encodePath(const QString& value)
+ {
+ // force "-.~_" to be encoded
+ return QUrl::toPercentEncoding(value, "", "-.~_").replace('%', '_');
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/DBusObject.h b/src/fdosecrets/objects/DBusObject.h
new file mode 100644
index 000000000..539a2dfd7
--- /dev/null
+++ b/src/fdosecrets/objects/DBusObject.h
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_DBUSOBJECT_H
+#define KEEPASSXC_FDOSECRETS_DBUSOBJECT_H
+
+#include "fdosecrets/objects/DBusReturn.h"
+#include "fdosecrets/objects/DBusTypes.h"
+
+#include <QDBusConnection>
+#include <QDBusConnectionInterface>
+#include <QDBusContext>
+#include <QDBusObjectPath>
+#include <QDebug>
+#include <QList>
+#include <QMetaProperty>
+#include <QObject>
+#include <QScopedPointer>
+
+class QDBusAbstractAdaptor;
+
+namespace FdoSecrets
+{
+ class Service;
+
+ /**
+ * @brief A common base class for all dbus-exposed objects
+ */
+ class DBusObject : public QObject, public QDBusContext
+ {
+ Q_OBJECT
+ public:
+ explicit DBusObject(DBusObject* parent = nullptr);
+
+ const QDBusObjectPath& objectPath() const
+ {
+ return m_objectPath;
+ }
+
+ protected:
+ void registerWithPath(const QString& path, QDBusAbstractAdaptor* adaptor);
+
+ void unregisterCurrentPath()
+ {
+ QDBusConnection::sessionBus().unregisterObject(m_objectPath.path());
+ m_dbusAdaptor = nullptr;
+ m_objectPath.setPath(QStringLiteral("/"));
+ }
+
+ QString callingPeer() const
+ {
+ Q_ASSERT(calledFromDBus());
+ return message().service();
+ }
+
+ uint callingPeerPid() const
+ {
+ return connection().interface()->servicePid(callingPeer());
+ }
+
+ QString callingPeerName() const;
+
+ template <typename Adaptor> Adaptor& dbusAdaptor() const
+ {
+ return *static_cast<Adaptor*>(m_dbusAdaptor);
+ }
+
+ DBusObject* p() const
+ {
+ return qobject_cast<DBusObject*>(parent());
+ }
+
+ private:
+ /**
+ * Derived class should not directly use sendErrorReply.
+ * Instead, use raiseError
+ */
+ using QDBusContext::sendErrorReply;
+
+ template <typename U> friend class DBusReturn;
+
+ private:
+ QDBusAbstractAdaptor* m_dbusAdaptor;
+ QDBusObjectPath m_objectPath;
+ };
+
+ /**
+ * Return the object path of the pointed DBusObject, or "/" if the pointer is null
+ * @tparam T
+ * @param object
+ * @return
+ */
+ template <typename T> QDBusObjectPath objectPathSafe(T* object)
+ {
+ if (object) {
+ return object->objectPath();
+ }
+ return QDBusObjectPath(QStringLiteral("/"));
+ }
+
+ /**
+ * Convert a list of DBusObjects to object path
+ * @tparam T
+ * @param objects
+ * @return
+ */
+ template <typename T> QList<QDBusObjectPath> objectsToPath(QList<T*> objects)
+ {
+ QList<QDBusObjectPath> res;
+ res.reserve(objects.size());
+ for (auto object : objects) {
+ res.append(objectPathSafe(object));
+ }
+ return res;
+ }
+
+ /**
+ * Convert an object path to a pointer of the object
+ * @tparam T
+ * @param path
+ * @return the pointer of the object, or nullptr if path is "/"
+ */
+ template <typename T> T* pathToObject(const QDBusObjectPath& path)
+ {
+ if (path.path() == QStringLiteral("/")) {
+ return nullptr;
+ }
+ return qobject_cast<T*>(QDBusConnection::sessionBus().objectRegisteredAt(path.path()));
+ }
+
+ /**
+ * Convert a list of object paths to a list of objects.
+ * "/" paths (i.e. nullptrs) will be skipped in the resulting list
+ * @tparam T
+ * @param paths
+ * @return
+ */
+ template <typename T> QList<T*> pathsToObject(const QList<QDBusObjectPath>& paths)
+ {
+ QList<T*> res;
+ res.reserve(paths.size());
+ for (const auto& path : paths) {
+ auto object = pathToObject<T>(path);
+ if (object) {
+ res.append(object);
+ }
+ }
+ return res;
+ }
+
+ /**
+ * Encode the string value to a DBus object path safe representation,
+ * using a schema similar to URI encoding, but with percentage(%) replaced with
+ * underscore(_). All characters except [A-Za-z0-9] are encoded. For non-ascii
+ * characters, UTF-8 encoding is first applied and each of the resulting byte
+ * value is encoded.
+ * @param value
+ * @return encoded string
+ */
+ QString encodePath(const QString& value);
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_DBUSOBJECT_H
diff --git a/src/fdosecrets/objects/DBusReturn.cpp b/src/fdosecrets/objects/DBusReturn.cpp
new file mode 100644
index 000000000..ffd10add9
--- /dev/null
+++ b/src/fdosecrets/objects/DBusReturn.cpp
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "DBusReturn.h"
diff --git a/src/fdosecrets/objects/DBusReturn.h b/src/fdosecrets/objects/DBusReturn.h
new file mode 100644
index 000000000..6c94eab18
--- /dev/null
+++ b/src/fdosecrets/objects/DBusReturn.h
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_DBUSRETURN_H
+#define KEEPASSXC_FDOSECRETS_DBUSRETURN_H
+
+#include <QDBusError>
+#include <QDebug>
+#include <QString>
+
+#include <type_traits>
+
+namespace FdoSecrets
+{
+
+ namespace details
+ {
+ class DBusReturnImpl
+ {
+ public:
+ /**
+ * Check if this object contains an error
+ * @return true if it contains an error, false otherwise.
+ */
+ bool isError() const
+ {
+ return !m_errorName.isEmpty();
+ }
+
+ /**
+ * Get the error name
+ * @return
+ */
+ QString errorName() const
+ {
+ return m_errorName;
+ }
+
+ void okOrDie() const
+ {
+ Q_ASSERT(!isError());
+ }
+
+ protected:
+ struct WithErrorTag
+ {
+ };
+
+ /**
+ * Construct from an error
+ * @param errorName
+ * @param value
+ */
+ DBusReturnImpl(QString errorName, WithErrorTag)
+ : m_errorName(std::move(errorName))
+ {
+ }
+
+ DBusReturnImpl() = default;
+
+ protected:
+ QString m_errorName;
+ };
+ } // namespace details
+
+ /**
+ * Either a return value or a DBus error
+ * @tparam T
+ */
+ template <typename T = void> class DBusReturn : public details::DBusReturnImpl
+ {
+ protected:
+ using DBusReturnImpl::DBusReturnImpl;
+
+ public:
+ using value_type = T;
+
+ DBusReturn() = default;
+
+ /**
+ * Implicitly construct from a value
+ * @param value
+ */
+ DBusReturn(T&& value) // NOLINT(google-explicit-constructor)
+ : m_value(std::move(value))
+ {
+ }
+
+ DBusReturn(const T& value) // NOLINT(google-explicit-constructor)
+ : m_value(std::move(value))
+ {
+ }
+
+ /**
+ * Implicitly convert from another error of different value type.
+ *
+ * @tparam U must not be the same as T
+ * @param other
+ */
+ template <typename U, typename = typename std::enable_if<!std::is_same<T, U>::value>::type>
+ DBusReturn(const DBusReturn<U>& other) // NOLINT(google-explicit-constructor)
+ : DBusReturn(other.errorName(), DBusReturnImpl::WithErrorTag{})
+ {
+ Q_ASSERT(other.isError());
+ }
+
+ /**
+ * Construct from error
+ * @param errorType
+ * @return a DBusReturn object containing the error
+ */
+ static DBusReturn Error(QDBusError::ErrorType errorType)
+ {
+ return DBusReturn{QDBusError::errorString(errorType), DBusReturnImpl::WithErrorTag{}};
+ }
+
+ /**
+ * Overloaded version
+ * @param errorName
+ * @return a DBusReturnImpl object containing the error
+ */
+ static DBusReturn Error(QString errorName)
+ {
+ return DBusReturn{std::move(errorName), DBusReturnImpl::WithErrorTag{}};
+ }
+
+ /**
+ * Get a reference to the enclosed value
+ * @return
+ */
+ const T& value() const&
+ {
+ okOrDie();
+ return m_value;
+ }
+
+ /**
+ * Get a rvalue reference to the enclosed value if this object is rvalue
+ * @return a rvalue reference to the enclosed value
+ */
+ T value() &&
+ {
+ okOrDie();
+ return std::move(m_value);
+ }
+
+ template <typename P> T valueOrHandle(P* p) const&
+ {
+ if (isError()) {
+ if (p->calledFromDBus()) {
+ p->sendErrorReply(errorName());
+ }
+ return {};
+ }
+ return m_value;
+ }
+
+ template <typename P> T&& valueOrHandle(P* p) &&
+ {
+ if (isError()) {
+ if (p->calledFromDBus()) {
+ p->sendErrorReply(errorName());
+ }
+ }
+ return std::move(m_value);
+ }
+
+ private:
+ T m_value{};
+ };
+
+ template <> class DBusReturn<void> : public details::DBusReturnImpl
+ {
+ protected:
+ using DBusReturnImpl::DBusReturnImpl;
+
+ public:
+ using value_type = void;
+
+ DBusReturn() = default;
+
+ /**
+ * Implicitly convert from another error of different value type.
+ *
+ * @tparam U must not be the same as T
+ * @param other
+ */
+ template <typename U, typename = typename std::enable_if<!std::is_same<void, U>::value>::type>
+ DBusReturn(const DBusReturn<U>& other) // NOLINT(google-explicit-constructor)
+ : DBusReturn(other.errorName(), DBusReturnImpl::WithErrorTag{})
+ {
+ Q_ASSERT(other.isError());
+ }
+
+ /**
+ * Construct from error
+ * @param errorType
+ * @return a DBusReturn object containing the error
+ */
+ static DBusReturn Error(QDBusError::ErrorType errorType)
+ {
+ return DBusReturn{QDBusError::errorString(errorType), DBusReturnImpl::WithErrorTag{}};
+ }
+
+ /**
+ * Overloaded version
+ * @param errorName
+ * @return a DBusReturnImpl object containing the error
+ */
+ static DBusReturn Error(QString errorName)
+ {
+ return DBusReturn{std::move(errorName), DBusReturnImpl::WithErrorTag{}};
+ }
+
+ /**
+ * If this is return contains an error, handle it if we were called from DBus
+ * @tparam P
+ * @param p
+ */
+ template <typename P> void handle(P* p) const
+ {
+ if (isError()) {
+ if (p->calledFromDBus()) {
+ p->sendErrorReply(errorName());
+ }
+ }
+ }
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_DBUSRETURN_H
diff --git a/src/fdosecrets/objects/DBusTypes.cpp b/src/fdosecrets/objects/DBusTypes.cpp
new file mode 100644
index 000000000..fff25124e
--- /dev/null
+++ b/src/fdosecrets/objects/DBusTypes.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ * Copyright 2010, Michael Leupold <lemma@confuego.org>
+ *
+ * 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 "DBusTypes.h"
+
+#include <QDBusMetaType>
+
+namespace FdoSecrets
+{
+
+ void registerDBusTypes()
+ {
+ // register meta-types needed for this adaptor
+ qRegisterMetaType<SecretStruct>();
+ qDBusRegisterMetaType<SecretStruct>();
+
+ qRegisterMetaType<StringStringMap>();
+ qDBusRegisterMetaType<StringStringMap>();
+
+ qRegisterMetaType<ObjectPathSecretMap>();
+ qDBusRegisterMetaType<ObjectPathSecretMap>();
+
+ // NOTE: this is already registered by Qt in qtextratypes.h
+ // qRegisterMetaType<QList<QDBusObjectPath > >();
+ // qDBusRegisterMetaType<QList<QDBusObjectPath> >();
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/DBusTypes.h b/src/fdosecrets/objects/DBusTypes.h
new file mode 100644
index 000000000..384a1e6b2
--- /dev/null
+++ b/src/fdosecrets/objects/DBusTypes.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ * Copyright 2010, Michael Leupold <lemma@confuego.org>
+ * Copyright 2010-2011, Valentin Rusu <valir@kde.org>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_DBUSTYPES_H
+#define KEEPASSXC_FDOSECRETS_DBUSTYPES_H
+
+#include <QDBusArgument>
+#include <QDBusObjectPath>
+#include <QMap>
+#include <QString>
+
+#define DBUS_SERVICE_SECRET "org.freedesktop.secrets"
+
+#define DBUS_INTERFACE_SECRET_SERVICE "org.freedesktop.Secret.Service"
+#define DBUS_INTERFACE_SECRET_SESSION "org.freedesktop.Secret.Session"
+#define DBUS_INTERFACE_SECRET_COLLECTION "org.freedesktop.Secret.Collection"
+#define DBUS_INTERFACE_SECRET_ITEM "org.freedesktop.Secret.Item"
+#define DBUS_INTERFACE_SECRET_PROMPT "org.freedesktop.Secret.Prompt"
+
+#define DBUS_ERROR_SECRET_NO_SESSION "org.freedesktop.Secret.Error.NoSession"
+#define DBUS_ERROR_SECRET_NO_SUCH_OBJECT "org.freedesktop.Secret.Error.NoSuchObject"
+#define DBUS_ERROR_SECRET_IS_LOCKED "org.freedesktop.Secret.Error.IsLocked"
+
+#define DBUS_PATH_SECRETS "/org/freedesktop/secrets"
+
+#define DBUS_PATH_TEMPLATE_ALIAS "%1/aliases/%2"
+#define DBUS_PATH_TEMPLATE_SESSION "%1/session/%2"
+#define DBUS_PATH_TEMPLATE_COLLECTION "%1/collection/%2"
+#define DBUS_PATH_TEMPLATE_ITEM "%1/%2"
+
+namespace FdoSecrets
+{
+ /**
+ * This is the basic Secret structure exchanged via the dbus API
+ * See the spec for more details
+ */
+ struct SecretStruct
+ {
+ QDBusObjectPath session{};
+ QByteArray parameters{};
+ QByteArray value{};
+ QString contentType{};
+ };
+
+ inline QDBusArgument& operator<<(QDBusArgument& argument, const SecretStruct& secret)
+ {
+ argument.beginStructure();
+ argument << secret.session << secret.parameters << secret.value << secret.contentType;
+ argument.endStructure();
+ return argument;
+ }
+
+ inline const QDBusArgument& operator>>(const QDBusArgument& argument, SecretStruct& secret)
+ {
+ argument.beginStructure();
+ argument >> secret.session >> secret.parameters >> secret.value >> secret.contentType;
+ argument.endStructure();
+ return argument;
+ }
+
+ /**
+ * Register the types needed for the fd.o Secrets D-Bus interface.
+ */
+ void registerDBusTypes();
+
+} // namespace FdoSecrets
+
+typedef QMap<QString, QString> StringStringMap;
+typedef QMap<QDBusObjectPath, FdoSecrets::SecretStruct> ObjectPathSecretMap;
+
+Q_DECLARE_METATYPE(FdoSecrets::SecretStruct)
+Q_DECLARE_METATYPE(StringStringMap);
+Q_DECLARE_METATYPE(ObjectPathSecretMap);
+
+#endif // KEEPASSXC_FDOSECRETS_DBUSTYPES_H
diff --git a/src/fdosecrets/objects/Item.cpp b/src/fdosecrets/objects/Item.cpp
new file mode 100644
index 000000000..18624bbdb
--- /dev/null
+++ b/src/fdosecrets/objects/Item.cpp
@@ -0,0 +1,420 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "Item.h"
+
+#include "fdosecrets/FdoSecretsPlugin.h"
+#include "fdosecrets/objects/Collection.h"
+#include "fdosecrets/objects/Prompt.h"
+#include "fdosecrets/objects/Service.h"
+#include "fdosecrets/objects/Session.h"
+
+#include "core/Entry.h"
+#include "core/EntryAttributes.h"
+#include "core/Group.h"
+#include "core/Tools.h"
+
+#include <QMimeDatabase>
+#include <QRegularExpression>
+#include <QSet>
+#include <QTextCodec>
+
+namespace FdoSecrets
+{
+
+ const QSet<QString> Item::ReadOnlyAttributes(QSet<QString>() << ItemAttributes::UuidKey << ItemAttributes::PathKey);
+
+ static void setEntrySecret(Entry* entry, const QByteArray& data, const QString& contentType);
+ static SecretStruct getEntrySecret(Entry* entry);
+
+ namespace
+ {
+ constexpr auto FDO_SECRETS_DATA = "FDO_SECRETS_DATA";
+ constexpr auto FDO_SECRETS_CONTENT_TYPE = "FDO_SECRETS_CONTENT_TYPE";
+ } // namespace
+
+ Item::Item(Collection* parent, Entry* backend)
+ : DBusObject(parent)
+ , m_backend(backend)
+ {
+ Q_ASSERT(!p()->objectPath().path().isEmpty());
+
+ registerWithPath(QStringLiteral(DBUS_PATH_TEMPLATE_ITEM).arg(p()->objectPath().path(), m_backend->uuidToHex()),
+ new ItemAdaptor(this));
+
+ connect(m_backend.data(), &Entry::entryModified, this, &Item::itemChanged);
+ }
+
+ DBusReturn<bool> Item::locked() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ return collection()->locked();
+ }
+
+ DBusReturn<const StringStringMap> Item::attributes() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ StringStringMap attrs;
+
+ // add default attributes except password
+ auto entryAttrs = m_backend->attributes();
+ for (const auto& attr : EntryAttributes::DefaultAttributes) {
+ if (entryAttrs->isProtected(attr) || attr == EntryAttributes::PasswordKey) {
+ continue;
+ }
+
+ auto value = entryAttrs->value(attr);
+ if (entryAttrs->isReference(attr)) {
+ value = m_backend->maskPasswordPlaceholders(value);
+ value = m_backend->resolveMultiplePlaceholders(value);
+ }
+ attrs[attr] = value;
+ }
+
+ // add custom attributes
+ const auto customKeys = entryAttrs->customKeys();
+ for (const auto& attr : customKeys) {
+ // decode attr key
+ auto decoded = decodeAttributeKey(attr);
+
+ attrs[decoded] = entryAttrs->value(attr);
+ }
+
+ // add some informative and readonly attributes
+ attrs[ItemAttributes::UuidKey] = m_backend->uuidToHex();
+ attrs[ItemAttributes::PathKey] = path();
+ return attrs;
+ }
+
+ DBusReturn<void> Item::setAttributes(const StringStringMap& attrs)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ m_backend->beginUpdate();
+
+ auto entryAttrs = m_backend->attributes();
+ for (auto it = attrs.constBegin(); it != attrs.constEnd(); ++it) {
+ if (entryAttrs->isProtected(it.key()) || it.key() == EntryAttributes::PasswordKey) {
+ continue;
+ }
+
+ if (ReadOnlyAttributes.contains(it.key())) {
+ continue;
+ }
+
+ auto encoded = encodeAttributeKey(it.key());
+ entryAttrs->set(encoded, it.value());
+ }
+
+ m_backend->endUpdate();
+
+ return {};
+ }
+
+ DBusReturn<QString> Item::label() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ return m_backend->title();
+ }
+
+ DBusReturn<void> Item::setLabel(const QString& label)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ m_backend->beginUpdate();
+ m_backend->setTitle(label);
+ m_backend->endUpdate();
+
+ return {};
+ }
+
+ DBusReturn<qulonglong> Item::created() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ return static_cast<qulonglong>(m_backend->timeInfo().creationTime().toMSecsSinceEpoch() / 1000);
+ }
+
+ DBusReturn<qulonglong> Item::modified() const
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ return static_cast<qulonglong>(m_backend->timeInfo().lastModificationTime().toMSecsSinceEpoch() / 1000);
+ }
+
+ DBusReturn<PromptBase*> Item::deleteItem()
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ auto prompt = new DeleteItemPrompt(service(), this);
+ return prompt;
+ }
+
+ DBusReturn<SecretStruct> Item::getSecret(Session* session)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ if (!session) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SESSION));
+ }
+
+ auto secret = getEntrySecret(m_backend);
+
+ // encode using session
+ secret = session->encode(secret);
+
+ // show notification is this was directly called from DBus
+ if (calledFromDBus()) {
+ service()->plugin()->emitRequestShowNotification(
+ tr(R"(Entry "%1" from database "%2" was used by %3)")
+ .arg(m_backend->title(), collection()->name(), callingPeerName()));
+ }
+ return secret;
+ }
+
+ DBusReturn<void> Item::setSecret(const SecretStruct& secret)
+ {
+ auto ret = ensureBackend();
+ if (ret.isError()) {
+ return ret;
+ }
+ ret = ensureUnlocked();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ auto session = pathToObject<Session>(secret.session);
+ if (!session) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SESSION));
+ }
+
+ // decode using session
+ auto decoded = session->decode(secret);
+
+ // set in backend
+ m_backend->beginUpdate();
+ setEntrySecret(m_backend, decoded.value, decoded.contentType);
+ m_backend->endUpdate();
+
+ return {};
+ }
+
+ DBusReturn<void> Item::setProperties(const QVariantMap& properties)
+ {
+ auto label = properties.value(QStringLiteral(DBUS_INTERFACE_SECRET_ITEM ".Label")).toString();
+
+ auto ret = setLabel(label);
+ if (ret.isError()) {
+ return ret;
+ }
+
+ auto attributes = qdbus_cast<StringStringMap>(
+ properties.value(QStringLiteral(DBUS_INTERFACE_SECRET_ITEM ".Attributes")).value<QDBusArgument>());
+ ret = setAttributes(attributes);
+ if (ret.isError()) {
+ return ret;
+ }
+
+ return {};
+ }
+
+ Collection* Item::collection() const
+ {
+ return qobject_cast<Collection*>(p());
+ }
+
+ DBusReturn<void> Item::ensureBackend() const
+ {
+ if (!m_backend) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT));
+ }
+ return {};
+ }
+
+ DBusReturn<void> Item::ensureUnlocked() const
+ {
+ auto locked = collection()->locked();
+ if (locked.isError()) {
+ return locked;
+ }
+ if (locked.value()) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_IS_LOCKED));
+ }
+ return {};
+ }
+
+ Entry* Item::backend() const
+ {
+ return m_backend;
+ }
+
+ void Item::doDelete()
+ {
+ emit itemAboutToDelete();
+
+ // Unregister current path early, do not rely on deleteLater's call to destructor
+ // as in case of Entry moving between groups, new Item will be created at the same DBus path
+ // before the current Item is deleted in the event loop.
+ unregisterCurrentPath();
+
+ m_backend = nullptr;
+ deleteLater();
+ }
+
+ Service* Item::service() const
+ {
+ return collection()->service();
+ }
+
+ QString Item::path() const
+ {
+ QStringList pathComponents{m_backend->title()};
+
+ Group* group = m_backend->group();
+ while (group && group != collection()->exposedRootGroup()) {
+ pathComponents.prepend(group->name());
+ group = group->parentGroup();
+ }
+ // we should always reach the exposed root group
+ Q_ASSERT(group);
+
+ // root group is represented by a single slash, thus adding an empty component.
+ pathComponents.prepend(QLatin1Literal(""));
+
+ return pathComponents.join('/');
+ }
+
+ QString Item::encodeAttributeKey(const QString& key)
+ {
+ return QUrl::toPercentEncoding(key, "", "_:").replace('%', '_');
+ }
+
+ QString Item::decodeAttributeKey(const QString& key)
+ {
+ return QString::fromUtf8(QByteArray::fromPercentEncoding(key.toLatin1(), '_'));
+ }
+
+ void setEntrySecret(Entry* entry, const QByteArray& data, const QString& contentType)
+ {
+ auto mimeName = contentType.split(';').takeFirst().trimmed();
+
+ // find the mime type
+ QMimeDatabase db;
+ auto mimeType = db.mimeTypeForName(mimeName);
+
+ // find a suitable codec
+ QTextCodec* codec = nullptr;
+ static const QRegularExpression charsetPattern(QStringLiteral(R"re(charset=(?<encode>.+)$)re"));
+ auto match = charsetPattern.match(contentType);
+ if (match.hasMatch()) {
+ codec = QTextCodec::codecForName(match.captured(QStringLiteral("encode")).toLatin1());
+ } else {
+ codec = QTextCodec::codecForName(QByteArrayLiteral("utf-8"));
+ }
+
+ if (!mimeType.isValid() || !mimeType.inherits(QStringLiteral("text/plain")) || !codec) {
+ // we can't handle this content type, save the data as attachment
+ entry->attachments()->set(FDO_SECRETS_DATA, data);
+ entry->attributes()->set(FDO_SECRETS_CONTENT_TYPE, contentType);
+ return;
+ }
+
+ // save the data to password field
+ if (entry->attachments()->hasKey(FDO_SECRETS_DATA)) {
+ entry->attachments()->remove(FDO_SECRETS_DATA);
+ }
+ if (entry->attributes()->hasKey(FDO_SECRETS_CONTENT_TYPE)) {
+ entry->attributes()->remove(FDO_SECRETS_CONTENT_TYPE);
+ }
+
+ Q_ASSERT(codec);
+ entry->setPassword(codec->toUnicode(data));
+ }
+
+ SecretStruct getEntrySecret(Entry* entry)
+ {
+ SecretStruct ss;
+
+ if (entry->attachments()->hasKey(FDO_SECRETS_DATA)) {
+ ss.value = entry->attachments()->value(FDO_SECRETS_DATA);
+ Q_ASSERT(entry->attributes()->hasKey(FDO_SECRETS_CONTENT_TYPE));
+ ss.contentType = entry->attributes()->value(FDO_SECRETS_CONTENT_TYPE);
+ return ss;
+ }
+
+ ss.value = entry->resolveMultiplePlaceholders(entry->password()).toUtf8();
+ ss.contentType = QStringLiteral("text/plain");
+ return ss;
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/Item.h b/src/fdosecrets/objects/Item.h
new file mode 100644
index 000000000..cfec77fe5
--- /dev/null
+++ b/src/fdosecrets/objects/Item.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_ITEM_H
+#define KEEPASSXC_FDOSECRETS_ITEM_H
+
+#include "fdosecrets/objects/DBusObject.h"
+#include "fdosecrets/objects/adaptors/ItemAdaptor.h"
+
+#include <QPointer>
+
+class Entry;
+
+namespace FdoSecrets
+{
+
+ namespace ItemAttributes
+ {
+ constexpr const auto UuidKey = "Uuid";
+ constexpr const auto PathKey = "Path";
+ } // namespace ItemAttributes
+
+ class Session;
+ class Collection;
+ class PromptBase;
+
+ class Item : public DBusObject
+ {
+ Q_OBJECT
+ public:
+ explicit Item(Collection* parent, Entry* backend);
+
+ DBusReturn<bool> locked() const;
+
+ DBusReturn<const StringStringMap> attributes() const;
+ DBusReturn<void> setAttributes(const StringStringMap& attrs);
+
+ DBusReturn<QString> label() const;
+ DBusReturn<void> setLabel(const QString& label);
+
+ DBusReturn<qulonglong> created() const;
+
+ DBusReturn<qulonglong> modified() const;
+
+ DBusReturn<PromptBase*> deleteItem();
+ DBusReturn<SecretStruct> getSecret(Session* session);
+ DBusReturn<void> setSecret(const SecretStruct& secret);
+
+ signals:
+ void itemChanged();
+ void itemAboutToDelete();
+
+ public:
+ static const QSet<QString> ReadOnlyAttributes;
+
+ /**
+ * Due to the limitation in EntrySearcher, custom attr key cannot contain ':',
+ * Thus we encode the key when saving and decode it when returning.
+ * @param key
+ * @return
+ */
+ static QString encodeAttributeKey(const QString& key);
+ static QString decodeAttributeKey(const QString& key);
+
+ DBusReturn<void> setProperties(const QVariantMap& properties);
+
+ Entry* backend() const;
+ Collection* collection() const;
+ Service* service() const;
+
+ /**
+ * Compute the entry path relative to the exposed group
+ * @return the entry path
+ */
+ QString path() const;
+
+ public slots:
+ void doDelete();
+
+ private:
+ /**
+ * Check if the backend is a valid object, send error reply if not.
+ * @return No error if the backend is valid.
+ */
+ DBusReturn<void> ensureBackend() const;
+
+ /**
+ * Ensure the database is unlocked, send error reply if locked.
+ * @return true if the database is locked
+ */
+ DBusReturn<void> ensureUnlocked() const;
+
+ private:
+ QPointer<Entry> m_backend;
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_ITEM_H
diff --git a/src/fdosecrets/objects/Prompt.cpp b/src/fdosecrets/objects/Prompt.cpp
new file mode 100644
index 000000000..14bc66b68
--- /dev/null
+++ b/src/fdosecrets/objects/Prompt.cpp
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "Prompt.h"
+
+#include "fdosecrets/FdoSecretsSettings.h"
+#include "fdosecrets/objects/Collection.h"
+#include "fdosecrets/objects/Item.h"
+#include "fdosecrets/objects/Service.h"
+
+#include "core/Tools.h"
+#include "gui/DatabaseWidget.h"
+#include "gui/MessageBox.h"
+
+#include <QThread>
+#include <QWindow>
+
+namespace FdoSecrets
+{
+
+ PromptBase::PromptBase(Service* parent)
+ : DBusObject(parent)
+ {
+ registerWithPath(
+ QStringLiteral("%1/prompt/%2").arg(p()->objectPath().path(), Tools::uuidToHex(QUuid::createUuid())),
+ new PromptAdaptor(this));
+
+ connect(this, &PromptBase::completed, this, &PromptBase::deleteLater);
+ }
+
+ QWindow* PromptBase::findWindow(const QString& windowId)
+ {
+ // find parent window, or nullptr if not found
+ bool ok = false;
+ WId wid = windowId.toULongLong(&ok, 0);
+ QWindow* parent = nullptr;
+ if (ok) {
+ parent = QWindow::fromWinId(wid);
+ }
+ if (parent) {
+ // parent is not the child of any object, so make sure it gets deleted at some point
+ QObject::connect(this, &QObject::destroyed, parent, &QObject::deleteLater);
+ }
+ return parent;
+ }
+
+ Service* PromptBase::service() const
+ {
+ return qobject_cast<Service*>(parent());
+ }
+
+ DBusReturn<void> PromptBase::dismiss()
+ {
+ emit completed(true, {});
+ return {};
+ }
+
+ DeleteCollectionPrompt::DeleteCollectionPrompt(Service* parent, Collection* coll)
+ : PromptBase(parent)
+ , m_collection(coll)
+ {
+ }
+
+ DBusReturn<void> DeleteCollectionPrompt::prompt(const QString& windowId)
+ {
+ if (thread() != QThread::currentThread()) {
+ DBusReturn<void> ret;
+ QMetaObject::invokeMethod(this,
+ "prompt",
+ Qt::BlockingQueuedConnection,
+ Q_ARG(QString, windowId),
+ Q_RETURN_ARG(DBusReturn<void>, ret));
+ return ret;
+ }
+
+ if (!m_collection) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT));
+ }
+
+ MessageBox::OverrideParent override(findWindow(windowId));
+ // only need to delete in backend, collection will react itself.
+ service()->doCloseDatabase(m_collection->backend());
+
+ emit completed(false, {});
+
+ return {};
+ }
+
+ CreateCollectionPrompt::CreateCollectionPrompt(Service* parent)
+ : PromptBase(parent)
+ {
+ }
+
+ DBusReturn<void> CreateCollectionPrompt::prompt(const QString& windowId)
+ {
+ if (thread() != QThread::currentThread()) {
+ DBusReturn<void> ret;
+ QMetaObject::invokeMethod(this,
+ "prompt",
+ Qt::BlockingQueuedConnection,
+ Q_ARG(QString, windowId),
+ Q_RETURN_ARG(DBusReturn<void>, ret));
+ return ret;
+ }
+
+ MessageBox::OverrideParent override(findWindow(windowId));
+
+ auto coll = service()->doNewDatabase();
+ if (!coll) {
+ return dismiss();
+ }
+
+ emit collectionCreated(coll);
+ emit completed(false, coll->objectPath().path());
+
+ return {};
+ }
+
+ LockCollectionsPrompt::LockCollectionsPrompt(Service* parent, const QList<Collection*>& colls)
+ : PromptBase(parent)
+ {
+ m_collections.reserve(colls.size());
+ for (const auto& c : asConst(colls)) {
+ m_collections << c;
+ }
+ }
+
+ DBusReturn<void> LockCollectionsPrompt::prompt(const QString& windowId)
+ {
+ if (thread() != QThread::currentThread()) {
+ DBusReturn<void> ret;
+ QMetaObject::invokeMethod(this,
+ "prompt",
+ Qt::BlockingQueuedConnection,
+ Q_ARG(QString, windowId),
+ Q_RETURN_ARG(DBusReturn<void>, ret));
+ return ret;
+ }
+
+ MessageBox::OverrideParent override(findWindow(windowId));
+
+ QList<QDBusObjectPath> locked;
+ for (const auto& c : asConst(m_collections)) {
+ if (c) {
+ c->doLock();
+ locked << c->objectPath();
+ }
+ }
+
+ emit completed(false, QVariant::fromValue(locked));
+
+ return {};
+ }
+
+ UnlockCollectionsPrompt::UnlockCollectionsPrompt(Service* parent, const QList<Collection*>& colls)
+ : PromptBase(parent)
+ {
+ m_collections.reserve(colls.size());
+ for (const auto& c : asConst(colls)) {
+ m_collections << c;
+ }
+ }
+
+ DBusReturn<void> UnlockCollectionsPrompt::prompt(const QString& windowId)
+ {
+ if (thread() != QThread::currentThread()) {
+ DBusReturn<void> ret;
+ QMetaObject::invokeMethod(this,
+ "prompt",
+ Qt::BlockingQueuedConnection,
+ Q_ARG(QString, windowId),
+ Q_RETURN_ARG(DBusReturn<void>, ret));
+ return ret;
+ }
+
+ MessageBox::OverrideParent override(findWindow(windowId));
+
+ QList<QDBusObjectPath> unlocked;
+ for (const auto& c : asConst(m_collections)) {
+ if (c) {
+ c->doUnlock();
+ unlocked << c->objectPath();
+ }
+ }
+
+ emit completed(false, QVariant::fromValue(unlocked));
+
+ return {};
+ }
+
+ DeleteItemPrompt::DeleteItemPrompt(Service* parent, Item* item)
+ : PromptBase(parent)
+ , m_item(item)
+ {
+ }
+
+ DBusReturn<void> DeleteItemPrompt::prompt(const QString& windowId)
+ {
+ if (thread() != QThread::currentThread()) {
+ DBusReturn<void> ret;
+ QMetaObject::invokeMethod(this,
+ "prompt",
+ Qt::BlockingQueuedConnection,
+ Q_ARG(QString, windowId),
+ Q_RETURN_ARG(DBusReturn<void>, ret));
+ return ret;
+ }
+
+ MessageBox::OverrideParent override(findWindow(windowId));
+
+ // delete item's backend. Item will be notified after the backend is deleted.
+ if (m_item) {
+ if (FdoSecrets::settings()->noConfirmDeleteItem()) {
+ MessageBox::setNextAnswer(MessageBox::Move);
+ }
+ m_item->collection()->doDeleteEntries({m_item->backend()});
+ }
+
+ emit completed(false, {});
+
+ return {};
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/Prompt.h b/src/fdosecrets/objects/Prompt.h
new file mode 100644
index 000000000..2d13084f6
--- /dev/null
+++ b/src/fdosecrets/objects/Prompt.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_PROMPT_H
+#define KEEPASSXC_FDOSECRETS_PROMPT_H
+
+#include "fdosecrets/objects/DBusObject.h"
+#include "fdosecrets/objects/adaptors/PromptAdaptor.h"
+
+#include <QPointer>
+
+class QWindow;
+
+class DatabaseWidget;
+
+namespace FdoSecrets
+{
+
+ class Service;
+
+ class PromptBase : public DBusObject
+ {
+ Q_OBJECT
+ public:
+ explicit PromptBase(Service* parent);
+
+ virtual DBusReturn<void> prompt(const QString& windowId) = 0;
+
+ virtual DBusReturn<void> dismiss();
+
+ signals:
+ void completed(bool dismissed, const QVariant& result);
+
+ protected:
+ QWindow* findWindow(const QString& windowId);
+ Service* service() const;
+ };
+
+ class Collection;
+
+ class DeleteCollectionPrompt : public PromptBase
+ {
+ Q_OBJECT
+
+ public:
+ explicit DeleteCollectionPrompt(Service* parent, Collection* coll);
+
+ DBusReturn<void> prompt(const QString& windowId) override;
+
+ private:
+ QPointer<Collection> m_collection;
+ };
+
+ class CreateCollectionPrompt : public PromptBase
+ {
+ Q_OBJECT
+
+ public:
+ explicit CreateCollectionPrompt(Service* parent);
+
+ DBusReturn<void> prompt(const QString& windowId) override;
+
+ signals:
+ void collectionCreated(Collection* coll);
+ };
+
+ class LockCollectionsPrompt : public PromptBase
+ {
+ Q_OBJECT
+ public:
+ explicit LockCollectionsPrompt(Service* parent, const QList<Collection*>& colls);
+
+ DBusReturn<void> prompt(const QString& windowId) override;
+
+ private:
+ QList<QPointer<Collection>> m_collections;
+ };
+
+ class UnlockCollectionsPrompt : public PromptBase
+ {
+ Q_OBJECT
+ public:
+ explicit UnlockCollectionsPrompt(Service* parent, const QList<Collection*>& coll);
+
+ DBusReturn<void> prompt(const QString& windowId) override;
+
+ private:
+ QList<QPointer<Collection>> m_collections;
+ };
+
+ class Item;
+ class DeleteItemPrompt : public PromptBase
+ {
+ Q_OBJECT
+
+ public:
+ explicit DeleteItemPrompt(Service* parent, Item* item);
+
+ DBusReturn<void> prompt(const QString& windowId) override;
+
+ private:
+ QPointer<Item> m_item;
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_PROMPT_H
diff --git a/src/fdosecrets/objects/Service.cpp b/src/fdosecrets/objects/Service.cpp
new file mode 100644
index 000000000..cf9dfdbf7
--- /dev/null
+++ b/src/fdosecrets/objects/Service.cpp
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "Service.h"
+
+#include "fdosecrets/FdoSecretsPlugin.h"
+#include "fdosecrets/FdoSecretsSettings.h"
+#include "fdosecrets/objects/Collection.h"
+#include "fdosecrets/objects/Item.h"
+#include "fdosecrets/objects/Prompt.h"
+#include "fdosecrets/objects/Session.h"
+
+#include "gui/DatabaseTabWidget.h"
+#include "gui/DatabaseWidget.h"
+
+#include <QDBusConnection>
+#include <QDBusServiceWatcher>
+#include <QDebug>
+
+namespace
+{
+ constexpr auto DEFAULT_ALIAS = "default";
+}
+
+namespace FdoSecrets
+{
+
+ Service::Service(FdoSecretsPlugin* plugin,
+ QPointer<DatabaseTabWidget> dbTabs) // clazy: exclude=ctor-missing-parent-argument
+ : DBusObject(nullptr)
+ , m_plugin(plugin)
+ , m_databases(std::move(dbTabs))
+ , m_insdieEnsureDefaultAlias(false)
+ , m_serviceWatcher(nullptr)
+ {
+ registerWithPath(QStringLiteral(DBUS_PATH_SECRETS), new ServiceAdaptor(this));
+ }
+
+ Service::~Service()
+ {
+ QDBusConnection::sessionBus().unregisterService(QStringLiteral(DBUS_SERVICE_SECRET));
+ }
+
+ bool Service::initialize()
+ {
+ if (!QDBusConnection::sessionBus().registerService(QStringLiteral(DBUS_SERVICE_SECRET))) {
+ qDebug() << "Another secret service is running";
+ emit error(tr("Failed to register DBus service at %1: another secret service is running.")
+ .arg(QLatin1Literal(DBUS_SERVICE_SECRET)));
+ return false;
+ }
+
+ // Connect to service unregistered signal
+ m_serviceWatcher.reset(new QDBusServiceWatcher());
+ connect(m_serviceWatcher.data(),
+ &QDBusServiceWatcher::serviceUnregistered,
+ this,
+ &Service::dbusServiceUnregistered);
+
+ m_serviceWatcher->setConnection(QDBusConnection::sessionBus());
+
+ // Add existing database tabs
+ for (int idx = 0; idx != m_databases->count(); ++idx) {
+ auto dbWidget = m_databases->databaseWidgetFromIndex(idx);
+ onDatabaseTabOpened(dbWidget, false);
+ }
+
+ // Connect to new database signal
+ // No need to connect to close signal, as collection will remove itself when backend delete/close database tab.
+ connect(m_databases.data(), &DatabaseTabWidget::databaseOpened, this, [this](DatabaseWidget* dbWidget) {
+ onDatabaseTabOpened(dbWidget, true);
+ });
+
+ // make default alias track current activated database
+ connect(m_databases.data(), &DatabaseTabWidget::activateDatabaseChanged, this, &Service::ensureDefaultAlias);
+
+ return true;
+ }
+
+ void Service::onDatabaseTabOpened(DatabaseWidget* dbWidget, bool emitSignal)
+ {
+ auto coll = new Collection(this, dbWidget);
+
+ m_collections << coll;
+ m_dbToCollection[dbWidget] = coll;
+
+ // handle alias
+ connect(coll, &Collection::aliasAboutToAdd, this, &Service::onCollectionAliasAboutToAdd);
+ connect(coll, &Collection::aliasAdded, this, &Service::onCollectionAliasAdded);
+ connect(coll, &Collection::aliasRemoved, this, &Service::onCollectionAliasRemoved);
+
+ ensureDefaultAlias();
+
+ // Forward delete signal, we have to rely on filepath to identify the database being closed,
+ // but we can not access m_backend safely because during the databaseClosed signal,
+ // m_backend may already be reset to nullptr
+ // We want to remove the collection object from dbus as early as possible, to avoid
+ // race conditions when deleteLater was called on the m_backend, but not delivered yet,
+ // and new method calls from dbus occurred. Therefore we can't rely on the destroyed
+ // signal on m_backend.
+ // bind to coll lifespan
+ connect(m_databases.data(), &DatabaseTabWidget::databaseClosed, coll, [coll](const QString& filePath) {
+ if (filePath == coll->backendFilePath()) {
+ coll->doDelete();
+ }
+ });
+
+ // relay signals
+ connect(coll, &Collection::collectionChanged, this, [this, coll]() { emit collectionChanged(coll); });
+ connect(coll, &Collection::collectionAboutToDelete, this, [this, coll]() {
+ m_collections.removeAll(coll);
+ m_dbToCollection.remove(coll->backend());
+ emit collectionDeleted(coll);
+ });
+
+ // a special case: the database changed from no expose to expose something.
+ // in this case, there is no collection out there monitoring it, so create a new collection
+ if (!dbWidget->isLocked()) {
+ monitorDatabaseExposedGroup(dbWidget);
+ }
+ connect(dbWidget, &DatabaseWidget::databaseUnlocked, this, [this, dbWidget]() {
+ monitorDatabaseExposedGroup(dbWidget);
+ });
+
+ if (emitSignal) {
+ emit collectionCreated(coll);
+ }
+ }
+
+ void Service::monitorDatabaseExposedGroup(DatabaseWidget* dbWidget)
+ {
+ Q_ASSERT(dbWidget);
+ connect(
+ dbWidget->database()->metadata()->customData(), &CustomData::customDataModified, this, [this, dbWidget]() {
+ if (!FdoSecrets::settings()->exposedGroup(dbWidget->database()).isNull() && !findCollection(dbWidget)) {
+ onDatabaseTabOpened(dbWidget, true);
+ }
+ });
+ }
+
+ void Service::ensureDefaultAlias()
+ {
+ if (m_insdieEnsureDefaultAlias) {
+ return;
+ }
+
+ m_insdieEnsureDefaultAlias = true;
+
+ auto coll = findCollection(m_databases->currentDatabaseWidget());
+ if (coll) {
+ // adding alias will automatically remove the association with previous collection.
+ coll->addAlias(DEFAULT_ALIAS).okOrDie();
+ }
+
+ m_insdieEnsureDefaultAlias = false;
+ }
+
+ void Service::dbusServiceUnregistered(const QString& service)
+ {
+ Q_ASSERT(m_serviceWatcher);
+
+ auto removed = m_serviceWatcher->removeWatchedService(service);
+ Q_UNUSED(removed);
+ Q_ASSERT(removed);
+
+ Session::CleanupNegotiation(service);
+ auto sess = m_peerToSession.value(service, nullptr);
+ if (sess) {
+ sess->close().okOrDie();
+ }
+ }
+
+ DBusReturn<const QList<Collection*>> Service::collections() const
+ {
+ return m_collections;
+ }
+
+ DBusReturn<QVariant> Service::openSession(const QString& algorithm, const QVariant& input, Session*& result)
+ {
+ QVariant output;
+ bool incomplete = false;
+ auto peer = callingPeer();
+
+ // watch for service unregister to cleanup
+ Q_ASSERT(m_serviceWatcher);
+ m_serviceWatcher->addWatchedService(peer);
+
+ // negotiate cipher
+ auto ciphers = Session::CreateCiphers(peer, algorithm, input, output, incomplete);
+ if (incomplete) {
+ result = nullptr;
+ return output;
+ }
+ if (!ciphers) {
+ return DBusReturn<>::Error(QDBusError::NotSupported);
+ }
+ result = new Session(std::move(ciphers), callingPeerName(), this);
+
+ m_sessions.append(result);
+ m_peerToSession[peer] = result;
+ connect(result, &Session::aboutToClose, this, [this, peer, result]() {
+ emit sessionClosed(result);
+ m_sessions.removeAll(result);
+ m_peerToSession.remove(peer);
+ });
+ emit sessionOpened(result);
+
+ return output;
+ }
+
+ DBusReturn<Collection*>
+ Service::createCollection(const QVariantMap& properties, const QString& alias, PromptBase*& prompt)
+ {
+ prompt = nullptr;
+
+ // return existing collection if alias is non-empty and exists.
+ auto collection = findCollection(alias);
+ if (!collection) {
+ auto cp = new CreateCollectionPrompt(this);
+ prompt = cp;
+
+ // collection will be created when the prompt complets.
+ // once it's done, we set additional properties on the collection
+ connect(cp, &CreateCollectionPrompt::collectionCreated, cp, [alias, properties](Collection* coll) {
+ coll->setProperties(properties).okOrDie();
+ if (!alias.isEmpty()) {
+ coll->addAlias(alias).okOrDie();
+ }
+ });
+ }
+ return collection;
+ }
+
+ DBusReturn<const QList<Item*>> Service::searchItems(const StringStringMap& attributes, QList<Item*>& locked)
+ {
+ auto ret = collections();
+ if (ret.isError()) {
+ return ret;
+ }
+
+ QList<Item*> unlocked;
+ for (const auto& coll : ret.value()) {
+ auto items = coll->searchItems(attributes);
+ if (items.isError()) {
+ return items;
+ }
+ auto l = coll->locked();
+ if (l.isError()) {
+ return l;
+ }
+ if (l.value()) {
+ locked.append(items.value());
+ } else {
+ unlocked.append(items.value());
+ }
+ }
+ return unlocked;
+ }
+
+ DBusReturn<const QList<DBusObject*>> Service::unlock(const QList<DBusObject*>& objects, PromptBase*& prompt)
+ {
+ QSet<Collection*> needUnlock;
+ needUnlock.reserve(objects.size());
+ for (const auto& obj : asConst(objects)) {
+ auto coll = qobject_cast<Collection*>(obj);
+ if (coll) {
+ needUnlock << coll;
+ } else {
+ auto item = qobject_cast<Item*>(obj);
+ if (!item) {
+ continue;
+ }
+ // we lock the whole collection for item
+ needUnlock << item->collection();
+ }
+ }
+
+ // return anything already unlocked
+ QList<DBusObject*> unlocked;
+ QList<Collection*> toUnlock;
+ for (const auto& coll : asConst(needUnlock)) {
+ auto l = coll->locked();
+ if (l.isError()) {
+ return l;
+ }
+ if (!l.value()) {
+ unlocked << coll;
+ } else {
+ toUnlock << coll;
+ }
+ }
+ prompt = new UnlockCollectionsPrompt(this, toUnlock);
+ return unlocked;
+ }
+
+ DBusReturn<const QList<DBusObject*>> Service::lock(const QList<DBusObject*>& objects, PromptBase*& prompt)
+ {
+ QSet<Collection*> needLock;
+ needLock.reserve(objects.size());
+ for (const auto& obj : asConst(objects)) {
+ auto coll = qobject_cast<Collection*>(obj);
+ if (coll) {
+ needLock << coll;
+ } else {
+ auto item = qobject_cast<Item*>(obj);
+ if (!item) {
+ continue;
+ }
+ // we lock the whole collection for item
+ needLock << item->collection();
+ }
+ }
+
+ // return anything already locked
+ QList<DBusObject*> locked;
+ QList<Collection*> toLock;
+ for (const auto& coll : asConst(needLock)) {
+ auto l = coll->locked();
+ if (l.isError()) {
+ return l;
+ }
+ if (l.value()) {
+ locked << coll;
+ } else {
+ toLock << coll;
+ }
+ }
+ prompt = new LockCollectionsPrompt(this, toLock);
+ return locked;
+ }
+
+ DBusReturn<const QHash<Item*, SecretStruct>> Service::getSecrets(const QList<Item*>& items, Session* session)
+ {
+ if (!session) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SESSION));
+ }
+
+ QHash<Item*, SecretStruct> res;
+
+ for (const auto& item : asConst(items)) {
+ auto ret = item->getSecret(session);
+ if (ret.isError()) {
+ return ret;
+ }
+ res[item] = std::move(ret).value();
+ }
+ if (calledFromDBus()) {
+ plugin()->emitRequestShowNotification(
+ tr(R"(%n Entry(s) was used by %1)", "%1 is the name of an application", res.size())
+ .arg(callingPeerName()));
+ }
+ return res;
+ }
+
+ DBusReturn<Collection*> Service::readAlias(const QString& name)
+ {
+ return findCollection(name);
+ }
+
+ DBusReturn<void> Service::setAlias(const QString& name, Collection* collection)
+ {
+ if (!collection) {
+ // remove alias name from its collection
+ collection = findCollection(name);
+ if (!collection) {
+ return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT));
+ }
+ return collection->removeAlias(name);
+ }
+ return collection->addAlias(name);
+ }
+
+ Collection* Service::findCollection(const QString& alias) const
+ {
+ if (alias.isEmpty()) {
+ return nullptr;
+ }
+
+ auto it = m_aliases.find(alias);
+ if (it != m_aliases.end()) {
+ return it.value();
+ }
+ return nullptr;
+ }
+
+ void Service::onCollectionAliasAboutToAdd(const QString& alias)
+ {
+ auto coll = qobject_cast<Collection*>(sender());
+
+ auto it = m_aliases.constFind(alias);
+ if (it != m_aliases.constEnd() && it.value() != coll) {
+ // another collection holds the alias
+ // remove it first
+ it.value()->removeAlias(alias).okOrDie();
+
+ // onCollectionAliasRemoved called through signal
+ // `it` becomes invalidated now
+ }
+ }
+
+ void Service::onCollectionAliasAdded(const QString& alias)
+ {
+ auto coll = qobject_cast<Collection*>(sender());
+ m_aliases[alias] = coll;
+ }
+
+ void Service::onCollectionAliasRemoved(const QString& alias)
+ {
+ m_aliases.remove(alias);
+ ensureDefaultAlias();
+ }
+
+ Collection* Service::findCollection(const DatabaseWidget* db) const
+ {
+ return m_dbToCollection.value(db, nullptr);
+ }
+
+ const QList<Session*> Service::sessions() const
+ {
+ return m_sessions;
+ }
+
+ void Service::doCloseDatabase(DatabaseWidget* dbWidget)
+ {
+ m_databases->closeDatabaseTab(dbWidget);
+ }
+
+ Collection* Service::doNewDatabase()
+ {
+ auto dbWidget = m_databases->newDatabase();
+ if (!dbWidget) {
+ return nullptr;
+ }
+
+ // database created through dbus will be exposed to dbus by default
+ auto db = dbWidget->database();
+ FdoSecrets::settings()->setExposedGroup(db, db->rootGroup()->uuid());
+
+ auto collection = findCollection(dbWidget);
+
+ Q_ASSERT(collection);
+
+ return collection;
+ }
+
+ void Service::doSwitchToChangeDatabaseSettings(DatabaseWidget* dbWidget)
+ {
+ // switch selected to current
+ // unlock if needed
+ if (dbWidget->isLocked()) {
+ m_databases->unlockDatabaseInDialog(dbWidget, DatabaseOpenDialog::Intent::None);
+ }
+ m_databases->setCurrentWidget(dbWidget);
+ m_databases->changeDatabaseSettings();
+
+ // open settings (switch from app settings to m_dbTabs)
+ m_plugin->emitRequestSwitchToDatabases();
+ }
+
+ void Service::doUnlockDatabaseInDialog(DatabaseWidget* dbWidget)
+ {
+ m_databases->unlockDatabaseInDialog(dbWidget, DatabaseOpenDialog::Intent::None);
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/Service.h b/src/fdosecrets/objects/Service.h
new file mode 100644
index 000000000..bfa8ea843
--- /dev/null
+++ b/src/fdosecrets/objects/Service.h
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_SERVICE_H
+#define KEEPASSXC_FDOSECRETS_SERVICE_H
+
+#include "fdosecrets/objects/DBusObject.h"
+#include "fdosecrets/objects/adaptors/ServiceAdaptor.h"
+
+#include <QHash>
+#include <QObject>
+#include <QPointer>
+#include <QScopedPointer>
+#include <QVariant>
+
+class QDBusServiceWatcher;
+
+class DatabaseTabWidget;
+class DatabaseWidget;
+class Group;
+
+class FdoSecretsPlugin;
+
+namespace FdoSecrets
+{
+
+ class Collection;
+ class Item;
+ class PromptBase;
+ class ServiceAdaptor;
+ class Session;
+
+ class Service : public DBusObject // clazy: exclude=ctor-missing-parent-argument
+ {
+ Q_OBJECT
+ public:
+ explicit Service(FdoSecretsPlugin* plugin, QPointer<DatabaseTabWidget> dbTabs);
+ ~Service() override;
+
+ bool initialize();
+
+ DBusReturn<QVariant> openSession(const QString& algorithm, const QVariant& input, Session*& result);
+ DBusReturn<Collection*>
+ createCollection(const QVariantMap& properties, const QString& alias, PromptBase*& prompt);
+ DBusReturn<const QList<Item*>> searchItems(const StringStringMap& attributes, QList<Item*>& locked);
+
+ DBusReturn<const QList<DBusObject*>> unlock(const QList<DBusObject*>& objects, PromptBase*& prompt);
+
+ DBusReturn<const QList<DBusObject*>> lock(const QList<DBusObject*>& objects, PromptBase*& prompt);
+
+ DBusReturn<const QHash<Item*, SecretStruct>> getSecrets(const QList<Item*>& items, Session* session);
+
+ DBusReturn<Collection*> readAlias(const QString& name);
+
+ DBusReturn<void> setAlias(const QString& name, Collection* collection);
+
+ /**
+ * List of collections
+ * @return
+ */
+ DBusReturn<const QList<Collection*>> collections() const;
+
+ signals:
+ void collectionCreated(Collection* collection);
+ void collectionDeleted(Collection* collection);
+ void collectionChanged(Collection* collection);
+
+ void sessionOpened(Session* sess);
+ void sessionClosed(Session* sess);
+
+ /**
+ * Report error message to the GUI
+ * @param msg
+ */
+ void error(const QString& msg);
+
+ public:
+ /**
+ * List of sessions
+ * @return
+ */
+ const QList<Session*> sessions() const;
+
+ FdoSecretsPlugin* plugin() const
+ {
+ return m_plugin;
+ }
+
+ public slots:
+ void doCloseDatabase(DatabaseWidget* dbWidget);
+ Collection* doNewDatabase();
+ void doSwitchToChangeDatabaseSettings(DatabaseWidget* dbWidget);
+ void doUnlockDatabaseInDialog(DatabaseWidget* dbWidget);
+
+ private slots:
+ void dbusServiceUnregistered(const QString& service);
+ void ensureDefaultAlias();
+
+ void onDatabaseTabOpened(DatabaseWidget* dbWidget, bool emitSignal);
+ void monitorDatabaseExposedGroup(DatabaseWidget* dbWidget);
+
+ void onCollectionAliasAboutToAdd(const QString& alias);
+ void onCollectionAliasAdded(const QString& alias);
+
+ void onCollectionAliasRemoved(const QString& alias);
+
+ private:
+ /**
+ * Find collection by alias name
+ * @param alias
+ * @return the collection under alias
+ */
+ Collection* findCollection(const QString& alias) const;
+
+ /**
+ * Find collection by dbWidget
+ * @param db
+ * @return the collection corresponding to the db
+ */
+ Collection* findCollection(const DatabaseWidget* db) const;
+
+ private:
+ FdoSecretsPlugin* m_plugin;
+ QPointer<DatabaseTabWidget> m_databases;
+
+ QHash<QString, Collection*> m_aliases;
+ QList<Collection*> m_collections;
+ QHash<const DatabaseWidget*, Collection*> m_dbToCollection;
+
+ QList<Session*> m_sessions;
+ QHash<QString, Session*> m_peerToSession;
+
+ bool m_insdieEnsureDefaultAlias;
+
+ QScopedPointer<QDBusServiceWatcher> m_serviceWatcher;
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_SERVICE_H
diff --git a/src/fdosecrets/objects/Session.cpp b/src/fdosecrets/objects/Session.cpp
new file mode 100644
index 000000000..ad9ac4075
--- /dev/null
+++ b/src/fdosecrets/objects/Session.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "Session.h"
+
+#include "fdosecrets/objects/SessionCipher.h"
+
+#include "core/Tools.h"
+
+namespace FdoSecrets
+{
+
+ QHash<QString, QVariant> Session::negoniationState;
+
+ Session::Session(std::unique_ptr<CipherPair>&& cipher, const QString& peer, Service* parent)
+ : DBusObject(parent)
+ , m_cipher(std::move(cipher))
+ , m_peer(peer)
+ , m_id(QUuid::createUuid())
+ {
+ registerWithPath(QStringLiteral(DBUS_PATH_TEMPLATE_SESSION).arg(p()->objectPath().path(), id()),
+ new SessionAdaptor(this));
+ }
+
+ void Session::CleanupNegotiation(const QString& peer)
+ {
+ negoniationState.remove(peer);
+ }
+
+ DBusReturn<void> Session::close()
+ {
+ emit aboutToClose();
+ deleteLater();
+
+ return {};
+ }
+
+ QString Session::peer() const
+ {
+ return m_peer;
+ }
+
+ QString Session::id() const
+ {
+ return Tools::uuidToHex(m_id);
+ }
+
+ std::unique_ptr<CipherPair> Session::CreateCiphers(const QString& peer,
+ const QString& algorithm,
+ const QVariant& input,
+ QVariant& output,
+ bool& incomplete)
+ {
+ Q_UNUSED(peer);
+ incomplete = false;
+
+ std::unique_ptr<CipherPair> cipher{};
+ if (algorithm == QLatin1Literal("plain")) {
+ cipher.reset(new PlainCipher);
+ } else if (algorithm == QLatin1Literal("dh-ietf1024-sha256-aes128-cbc-pkcs7")) {
+ QByteArray clientPublicKey = input.toByteArray();
+ cipher.reset(new DhIetf1024Sha256Aes128CbcPkcs7(clientPublicKey));
+ } else {
+ // error notSupported
+ }
+
+ if (!cipher) {
+ return {};
+ }
+
+ if (!cipher->isValid()) {
+ qWarning() << "FdoSecrets: Error creating cipher";
+ return {};
+ }
+
+ output = cipher->negotiationOutput();
+ return cipher;
+ }
+
+ SecretStruct Session::encode(const SecretStruct& input) const
+ {
+ auto output = m_cipher->encrypt(input);
+ output.session = objectPath();
+ return output;
+ }
+
+ SecretStruct Session::decode(const SecretStruct& input) const
+ {
+ return m_cipher->decrypt(input);
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/Session.h b/src/fdosecrets/objects/Session.h
new file mode 100644
index 000000000..472cc6e5a
--- /dev/null
+++ b/src/fdosecrets/objects/Session.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_SESSION_H
+#define KEEPASSXC_FDOSECRETS_SESSION_H
+
+#include "fdosecrets/objects/DBusObject.h"
+#include "fdosecrets/objects/Service.h"
+#include "fdosecrets/objects/SessionCipher.h"
+#include "fdosecrets/objects/adaptors/SessionAdaptor.h"
+
+#include <QByteArray>
+#include <QHash>
+#include <QUuid>
+#include <QVariant>
+
+#include <memory>
+
+namespace FdoSecrets
+{
+
+ class CipherPair;
+ class Session : public DBusObject
+ {
+ Q_OBJECT
+ public:
+ static std::unique_ptr<CipherPair> CreateCiphers(const QString& peer,
+ const QString& algorithm,
+ const QVariant& intpu,
+ QVariant& output,
+ bool& incomplete);
+ static void CleanupNegotiation(const QString& peer);
+
+ explicit Session(std::unique_ptr<CipherPair>&& cipher, const QString& peer, Service* parent);
+
+ DBusReturn<void> close();
+
+ /**
+ * Encode the secret struct. Note only the value field is encoded.
+ * @param input
+ * @return
+ */
+ SecretStruct encode(const SecretStruct& input) const;
+
+ /**
+ * Decode the secret struct.
+ * @param input
+ * @return
+ */
+ SecretStruct decode(const SecretStruct& input) const;
+
+ /**
+ * The peer application that opened this session
+ * @return
+ */
+ QString peer() const;
+
+ QString id() const;
+
+ signals:
+ /**
+ * The session is going to be closed
+ * @param sess
+ */
+ void aboutToClose();
+
+ private:
+ std::unique_ptr<CipherPair> m_cipher;
+ QString m_peer;
+ QUuid m_id;
+
+ static QHash<QString, QVariant> negoniationState;
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_SESSION_H
diff --git a/src/fdosecrets/objects/SessionCipher.cpp b/src/fdosecrets/objects/SessionCipher.cpp
new file mode 100644
index 000000000..374580eed
--- /dev/null
+++ b/src/fdosecrets/objects/SessionCipher.cpp
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "SessionCipher.h"
+
+#include "crypto/CryptoHash.h"
+#include "crypto/Random.h"
+#include "crypto/SymmetricCipher.h"
+
+#include <gcrypt.h>
+
+#include <memory>
+
+namespace
+{
+ constexpr const auto IETF1024_SECOND_OAKLEY_GROUP_P_HEX = "FFFFFFFFFFFFFFFFC90FDAA22168C234"
+ "C4C6628B80DC1CD129024E088A67CC74"
+ "020BBEA63B139B22514A08798E3404DD"
+ "EF9519B3CD3A431B302B0A6DF25F1437"
+ "4FE1356D6D51C245E485B576625E7EC6"
+ "F44C42E9A637ED6B0BFF5CB6F406B7ED"
+ "EE386BFB5A899FA5AE9F24117C4B1FE6"
+ "49286651ECE65381FFFFFFFFFFFFFFFF";
+ constexpr const size_t KEY_SIZE_BYTES = 128;
+ constexpr const int AES_KEY_LEN = 16; // 128 bits
+
+ const auto IETF1024_SECOND_OAKLEY_GROUP_P = MpiFromHex(IETF1024_SECOND_OAKLEY_GROUP_P_HEX, false);
+} // namespace
+
+namespace FdoSecrets
+{
+
+ QVariant CipherPair::negotiationOutput() const
+ {
+ return {};
+ }
+
+ DhIetf1024Sha256Aes128CbcPkcs7::DhIetf1024Sha256Aes128CbcPkcs7(const QByteArray& clientPublicKeyBytes)
+ : m_valid(false)
+ {
+ // read client public key
+ auto clientPub = MpiFromBytes(clientPublicKeyBytes, false);
+
+ // generate server side private, 128 bytes
+ GcryptMPI serverPrivate(gcry_mpi_snew(KEY_SIZE_BYTES * 8));
+ gcry_mpi_randomize(serverPrivate.get(), KEY_SIZE_BYTES * 8, GCRY_STRONG_RANDOM);
+
+ // generate server side public key
+ GcryptMPI serverPublic(gcry_mpi_snew(KEY_SIZE_BYTES * 8));
+ // the generator of Second Oakley Group is 2
+ gcry_mpi_powm(serverPublic.get(), GCRYMPI_CONST_TWO, serverPrivate.get(), IETF1024_SECOND_OAKLEY_GROUP_P.get());
+
+ initialize(std::move(clientPub), std::move(serverPublic), std::move(serverPrivate));
+ }
+
+ bool
+ DhIetf1024Sha256Aes128CbcPkcs7::initialize(GcryptMPI clientPublic, GcryptMPI serverPublic, GcryptMPI serverPrivate)
+ {
+ QByteArray commonSecretBytes;
+ if (!diffieHullman(clientPublic, serverPrivate, commonSecretBytes)) {
+ return false;
+ }
+
+ m_privateKey = MpiToBytes(serverPrivate);
+ m_publicKey = MpiToBytes(serverPublic);
+
+ m_aesKey = hkdf(commonSecretBytes);
+
+ m_valid = true;
+ return true;
+ }
+
+ bool DhIetf1024Sha256Aes128CbcPkcs7::diffieHullman(const GcryptMPI& clientPub,
+ const GcryptMPI& serverPrivate,
+ QByteArray& commonSecretBytes)
+ {
+ if (!clientPub || !serverPrivate) {
+ return false;
+ }
+
+ // calc common secret
+ GcryptMPI commonSecret(gcry_mpi_snew(KEY_SIZE_BYTES * 8));
+ gcry_mpi_powm(commonSecret.get(), clientPub.get(), serverPrivate.get(), IETF1024_SECOND_OAKLEY_GROUP_P.get());
+ commonSecretBytes = MpiToBytes(commonSecret);
+
+ return true;
+ }
+
+ QByteArray DhIetf1024Sha256Aes128CbcPkcs7::hkdf(const QByteArray& IKM)
+ {
+ // HKDF-Extract(salt, IKM) -> PRK
+ // PRK = HMAC-Hash(salt, IKM)
+
+ // we use NULL salt as per spec
+ auto PRK = CryptoHash::hmac(IKM,
+ QByteArrayLiteral("\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0"),
+ CryptoHash::Sha256);
+
+ // HKDF-Expand(PRK, info, L) -> OKM
+ // N = ceil(L/HashLen)
+ // T = T(1) | T(2) | T(3) | ... | T(N)
+ // OKM = first L octets of T
+ // where:
+ // T(0) = empty string (zero length)
+ // T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
+ // T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
+ // T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
+ // ...
+ //
+ // (where the constant concatenated to the end of each T(n) is a
+ // single octet.)
+
+ // we use empty info as per spec
+ // HashLen = 32 (sha256)
+ // L = 16 (16 * 8 = 128 bits)
+ // N = ceil(16/32) = 1
+
+ auto T1 = CryptoHash::hmac(QByteArrayLiteral("\x01"), PRK, CryptoHash::Sha256);
+
+ // resulting AES key is first 128 bits
+ Q_ASSERT(T1.size() >= AES_KEY_LEN);
+ auto OKM = T1.left(AES_KEY_LEN);
+ return OKM;
+ }
+
+ SecretStruct DhIetf1024Sha256Aes128CbcPkcs7::encrypt(const SecretStruct& input)
+ {
+ SecretStruct output = input;
+ output.value.clear();
+ output.parameters.clear();
+
+ SymmetricCipher encrypter(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Encrypt);
+
+ auto IV = randomGen()->randomArray(SymmetricCipher::algorithmIvSize(SymmetricCipher::Aes128));
+ if (!encrypter.init(m_aesKey, IV)) {
+ qWarning() << "Error encrypt: " << encrypter.errorString();
+ return output;
+ }
+
+ output.parameters = IV;
+
+ bool ok;
+ output.value = input.value;
+ output.value = encrypter.process(padPkcs7(output.value, encrypter.blockSize()), &ok);
+ if (!ok) {
+ qWarning() << "Error encrypt: " << encrypter.errorString();
+ return output;
+ }
+
+ return output;
+ }
+
+ QByteArray& DhIetf1024Sha256Aes128CbcPkcs7::padPkcs7(QByteArray& input, int blockSize)
+ {
+ // blockSize must be a power of 2.
+ Q_ASSERT_X(blockSize > 0 && !(blockSize & (blockSize - 1)), "padPkcs7", "blockSize must be a power of 2");
+
+ int padLen = blockSize - (input.size() & (blockSize - 1));
+
+ input.append(QByteArray(padLen, static_cast<char>(padLen)));
+ return input;
+ }
+
+ SecretStruct DhIetf1024Sha256Aes128CbcPkcs7::decrypt(const SecretStruct& input)
+ {
+ auto IV = input.parameters;
+ SymmetricCipher decrypter(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Decrypt);
+ if (!decrypter.init(m_aesKey, IV)) {
+ qWarning() << "Error decoding: " << decrypter.errorString();
+ return input;
+ }
+ bool ok;
+ SecretStruct output = input;
+ output.parameters.clear();
+ output.value = decrypter.process(input.value, &ok);
+
+ if (!ok) {
+ qWarning() << "Error decoding: " << decrypter.errorString();
+ return input;
+ }
+
+ unpadPkcs7(output.value);
+ return output;
+ }
+
+ QByteArray& DhIetf1024Sha256Aes128CbcPkcs7::unpadPkcs7(QByteArray& input)
+ {
+ if (input.isEmpty()) {
+ return input;
+ }
+
+ int padLen = input[input.size() - 1];
+ input.chop(padLen);
+ return input;
+ }
+
+ bool DhIetf1024Sha256Aes128CbcPkcs7::isValid() const
+ {
+ return m_valid;
+ }
+
+ QVariant DhIetf1024Sha256Aes128CbcPkcs7::negotiationOutput() const
+ {
+ return m_publicKey;
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/SessionCipher.h b/src/fdosecrets/objects/SessionCipher.h
new file mode 100644
index 000000000..7d1d32d42
--- /dev/null
+++ b/src/fdosecrets/objects/SessionCipher.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_SESSIONCIPHER_H
+#define KEEPASSXC_FDOSECRETS_SESSIONCIPHER_H
+
+#include "fdosecrets/GcryptMPI.h"
+#include "fdosecrets/objects/Session.h"
+
+class TestFdoSecrets;
+
+namespace FdoSecrets
+{
+
+ class CipherPair
+ {
+ Q_DISABLE_COPY(CipherPair)
+ public:
+ CipherPair() = default;
+ virtual ~CipherPair() = default;
+ virtual SecretStruct encrypt(const SecretStruct& input) = 0;
+ virtual SecretStruct decrypt(const SecretStruct& input) = 0;
+ virtual bool isValid() const = 0;
+ virtual QVariant negotiationOutput() const;
+ };
+
+ class PlainCipher : public CipherPair
+ {
+ Q_DISABLE_COPY(PlainCipher)
+ public:
+ PlainCipher() = default;
+ SecretStruct encrypt(const SecretStruct& input) override
+ {
+ return input;
+ }
+
+ SecretStruct decrypt(const SecretStruct& input) override
+ {
+ return input;
+ }
+
+ bool isValid() const override
+ {
+ return true;
+ }
+ };
+
+ class DhIetf1024Sha256Aes128CbcPkcs7 : public CipherPair
+ {
+ bool m_valid;
+ QByteArray m_privateKey;
+ QByteArray m_publicKey;
+ QByteArray m_aesKey;
+
+ /**
+ * Diffie Hullman Key Exchange
+ * Given client public key, generate server private/public key pair and common secret.
+ * This also sets m_publicKey to server's public key
+ * @param clientPublicKey client public key
+ * @param serverPrivate server private key
+ * @param commonSecretBytes output common secret
+ * @return true on success.
+ */
+ bool
+ diffieHullman(const GcryptMPI& clientPublicKey, const GcryptMPI& serverPrivate, QByteArray& commonSecretBytes);
+
+ /**
+ * Perform HKDF defined in RFC5869, using sha256 as hash function
+ * @param IKM input keying material
+ * @return derived 128-bit key suitable for AES
+ */
+ QByteArray hkdf(const QByteArray& IKM);
+
+ /**
+ * Add PKCS#7 style padding to input inplace
+ * @param input
+ * @param blockSize the block size to use, must be 2's power
+ * @return reference to input for chaining
+ */
+ QByteArray& padPkcs7(QByteArray& input, int blockSize);
+
+ /**
+ * Remove PKCS#7 style padding from input inplace
+ * @param input
+ * @return reference to input for chaining
+ */
+ QByteArray& unpadPkcs7(QByteArray& input);
+
+ bool initialize(GcryptMPI clientPublic, GcryptMPI serverPublic, GcryptMPI serverPrivate);
+
+ DhIetf1024Sha256Aes128CbcPkcs7()
+ : m_valid(false)
+ {
+ }
+
+ public:
+ explicit DhIetf1024Sha256Aes128CbcPkcs7(const QByteArray& clientPublicKeyBytes);
+
+ SecretStruct encrypt(const SecretStruct& input) override;
+
+ SecretStruct decrypt(const SecretStruct& input) override;
+
+ bool isValid() const override;
+
+ QVariant negotiationOutput() const override;
+
+ private:
+ Q_DISABLE_COPY(DhIetf1024Sha256Aes128CbcPkcs7);
+ friend class ::TestFdoSecrets;
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_SESSIONCIPHER_H
diff --git a/src/fdosecrets/objects/adaptors/CollectionAdaptor.cpp b/src/fdosecrets/objects/adaptors/CollectionAdaptor.cpp
new file mode 100644
index 000000000..77eb3b413
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/CollectionAdaptor.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "CollectionAdaptor.h"
+
+#include "fdosecrets/objects/Collection.h"
+#include "fdosecrets/objects/Item.h"
+#include "fdosecrets/objects/Prompt.h"
+
+namespace FdoSecrets
+{
+
+ CollectionAdaptor::CollectionAdaptor(Collection* parent)
+ : DBusAdaptor(parent)
+ {
+ connect(
+ p(), &Collection::itemCreated, this, [this](const Item* item) { emit ItemCreated(objectPathSafe(item)); });
+ connect(
+ p(), &Collection::itemDeleted, this, [this](const Item* item) { emit ItemDeleted(objectPathSafe(item)); });
+ connect(
+ p(), &Collection::itemChanged, this, [this](const Item* item) { emit ItemChanged(objectPathSafe(item)); });
+ }
+
+ const QList<QDBusObjectPath> CollectionAdaptor::items() const
+ {
+ return objectsToPath(p()->items().valueOrHandle(p()));
+ }
+
+ QString CollectionAdaptor::label() const
+ {
+ return p()->label().valueOrHandle(p());
+ }
+
+ void CollectionAdaptor::setLabel(const QString& label)
+ {
+ p()->setLabel(label).handle(p());
+ }
+
+ bool CollectionAdaptor::locked() const
+ {
+ return p()->locked().valueOrHandle(p());
+ }
+
+ qulonglong CollectionAdaptor::created() const
+ {
+ return p()->created().valueOrHandle(p());
+ }
+
+ qulonglong CollectionAdaptor::modified() const
+ {
+ return p()->modified().valueOrHandle(p());
+ }
+
+ QDBusObjectPath CollectionAdaptor::Delete()
+ {
+ return objectPathSafe(p()->deleteCollection().valueOrHandle(p()));
+ }
+
+ QList<QDBusObjectPath> CollectionAdaptor::SearchItems(const StringStringMap& attributes)
+ {
+ return objectsToPath(p()->searchItems(attributes).valueOrHandle(p()));
+ }
+
+ QDBusObjectPath CollectionAdaptor::CreateItem(const QVariantMap& properties,
+ const SecretStruct& secret,
+ bool replace,
+ QDBusObjectPath& prompt)
+ {
+ PromptBase* pp = nullptr;
+ auto item = p()->createItem(properties, secret, replace, pp).valueOrHandle(p());
+ prompt = objectPathSafe(pp);
+ return objectPathSafe(item);
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/adaptors/CollectionAdaptor.h b/src/fdosecrets/objects/adaptors/CollectionAdaptor.h
new file mode 100644
index 000000000..f5220108e
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/CollectionAdaptor.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_COLLECTIONADAPTOR_H
+#define KEEPASSXC_FDOSECRETS_COLLECTIONADAPTOR_H
+
+#include "fdosecrets/objects/adaptors/DBusAdaptor.h"
+
+#include <QList>
+
+namespace FdoSecrets
+{
+
+ class Collection;
+ class CollectionAdaptor : public DBusAdaptor<Collection>
+ {
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", DBUS_INTERFACE_SECRET_COLLECTION)
+
+ Q_PROPERTY(QList<QDBusObjectPath> Items READ items)
+ Q_PROPERTY(QString Label READ label WRITE setLabel)
+ Q_PROPERTY(bool Locked READ locked)
+ Q_PROPERTY(qulonglong Created READ created)
+ Q_PROPERTY(qulonglong Modified READ modified)
+
+ public:
+ explicit CollectionAdaptor(Collection* parent);
+ ~CollectionAdaptor() override = default;
+
+ const QList<QDBusObjectPath> items() const;
+
+ QString label() const;
+ void setLabel(const QString& label);
+
+ bool locked() const;
+
+ qulonglong created() const;
+
+ qulonglong modified() const;
+
+ public slots:
+ QDBusObjectPath Delete();
+ QList<QDBusObjectPath> SearchItems(const StringStringMap& attributes);
+ QDBusObjectPath CreateItem(const QVariantMap& properties,
+ const FdoSecrets::SecretStruct& secret,
+ bool replace,
+ QDBusObjectPath& prompt);
+
+ signals:
+ void ItemCreated(const QDBusObjectPath& item);
+ void ItemDeleted(const QDBusObjectPath& item);
+ void ItemChanged(const QDBusObjectPath& item);
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_COLLECTIONADAPTOR_H
diff --git a/src/fdosecrets/objects/adaptors/DBusAdaptor.h b/src/fdosecrets/objects/adaptors/DBusAdaptor.h
new file mode 100644
index 000000000..bd70ab60a
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/DBusAdaptor.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_DBUSADAPTOR_H
+#define KEEPASSXC_FDOSECRETS_DBUSADAPTOR_H
+
+#include "fdosecrets/objects/DBusReturn.h"
+#include "fdosecrets/objects/DBusTypes.h"
+
+#include <QDBusAbstractAdaptor>
+
+namespace FdoSecrets
+{
+
+ /**
+ * @brief A common adapter class
+ */
+ template <typename Parent> class DBusAdaptor : public QDBusAbstractAdaptor
+ {
+ public:
+ explicit DBusAdaptor(QObject* parent = nullptr)
+ : QDBusAbstractAdaptor(parent)
+ {
+ }
+
+ ~DBusAdaptor() override = default;
+
+ protected:
+ Parent* p() const
+ {
+ return qobject_cast<Parent*>(parent());
+ }
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_DBUSADAPTOR_H
diff --git a/src/fdosecrets/objects/adaptors/ItemAdaptor.cpp b/src/fdosecrets/objects/adaptors/ItemAdaptor.cpp
new file mode 100644
index 000000000..7116041b8
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/ItemAdaptor.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "ItemAdaptor.h"
+
+#include "fdosecrets/objects/Item.h"
+#include "fdosecrets/objects/Prompt.h"
+#include "fdosecrets/objects/Session.h"
+
+namespace FdoSecrets
+{
+
+ ItemAdaptor::ItemAdaptor(Item* parent)
+ : DBusAdaptor(parent)
+ {
+ }
+
+ bool ItemAdaptor::locked() const
+ {
+ return p()->locked().valueOrHandle(p());
+ }
+
+ const StringStringMap ItemAdaptor::attributes() const
+ {
+ return p()->attributes().valueOrHandle(p());
+ }
+
+ void ItemAdaptor::setAttributes(const StringStringMap& attrs)
+ {
+ p()->setAttributes(attrs).handle(p());
+ }
+
+ QString ItemAdaptor::label() const
+ {
+ return p()->label().valueOrHandle(p());
+ }
+
+ void ItemAdaptor::setLabel(const QString& label)
+ {
+ p()->setLabel(label).handle(p());
+ }
+
+ qulonglong ItemAdaptor::created() const
+ {
+ return p()->created().valueOrHandle(p());
+ }
+
+ qulonglong ItemAdaptor::modified() const
+ {
+ return p()->modified().valueOrHandle(p());
+ }
+
+ QDBusObjectPath ItemAdaptor::Delete()
+ {
+ auto prompt = p()->deleteItem().valueOrHandle(p());
+ return objectPathSafe(prompt);
+ }
+
+ SecretStruct ItemAdaptor::GetSecret(const QDBusObjectPath& session)
+ {
+ return p()->getSecret(pathToObject<Session>(session)).valueOrHandle(p());
+ }
+
+ void ItemAdaptor::SetSecret(const SecretStruct& secret)
+ {
+ p()->setSecret(secret).handle(p());
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/adaptors/ItemAdaptor.h b/src/fdosecrets/objects/adaptors/ItemAdaptor.h
new file mode 100644
index 000000000..4a6da4bf9
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/ItemAdaptor.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_ITEMADAPTOR_H
+#define KEEPASSXC_FDOSECRETS_ITEMADAPTOR_H
+
+#include "fdosecrets/objects/adaptors/DBusAdaptor.h"
+
+namespace FdoSecrets
+{
+
+ class Item;
+ class ItemAdaptor : public DBusAdaptor<Item>
+ {
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", DBUS_INTERFACE_SECRET_ITEM)
+
+ Q_PROPERTY(bool Locked READ locked)
+ Q_PROPERTY(StringStringMap Attributes READ attributes WRITE setAttributes)
+ Q_PROPERTY(QString Label READ label WRITE setLabel)
+ Q_PROPERTY(qulonglong Created READ created)
+ Q_PROPERTY(qulonglong Modified READ modified)
+
+ public:
+ explicit ItemAdaptor(Item* parent);
+ ~ItemAdaptor() override = default;
+
+ bool locked() const;
+
+ const StringStringMap attributes() const;
+ void setAttributes(const StringStringMap& attrs);
+
+ QString label() const;
+ void setLabel(const QString& label);
+
+ qulonglong created() const;
+
+ qulonglong modified() const;
+
+ public slots:
+ QDBusObjectPath Delete();
+ FdoSecrets::SecretStruct GetSecret(const QDBusObjectPath& session);
+ void SetSecret(const FdoSecrets::SecretStruct& secret);
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_ITEMADAPTOR_H
diff --git a/src/fdosecrets/objects/adaptors/PromptAdaptor.cpp b/src/fdosecrets/objects/adaptors/PromptAdaptor.cpp
new file mode 100644
index 000000000..bcc1e271d
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/PromptAdaptor.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "PromptAdaptor.h"
+
+#include "fdosecrets/objects/Prompt.h"
+
+namespace FdoSecrets
+{
+
+ PromptAdaptor::PromptAdaptor(PromptBase* parent)
+ : DBusAdaptor(parent)
+ {
+ connect(p(), &PromptBase::completed, this, [this](bool dismissed, QVariant result) {
+ // make sure the result contains a valid value, otherwise QDBusVariant refuses to marshall it.
+ if (!result.isValid()) {
+ result = QString{};
+ }
+ emit Completed(dismissed, QDBusVariant(std::move(result)));
+ });
+ }
+
+ void PromptAdaptor::Prompt(const QString& windowId)
+ {
+ p()->prompt(windowId).handle(p());
+ }
+
+ void PromptAdaptor::Dismiss()
+ {
+ p()->dismiss().handle(p());
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/adaptors/PromptAdaptor.h b/src/fdosecrets/objects/adaptors/PromptAdaptor.h
new file mode 100644
index 000000000..9f4390819
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/PromptAdaptor.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_PROMPTADAPTOR_H
+#define KEEPASSXC_FDOSECRETS_PROMPTADAPTOR_H
+
+#include "fdosecrets/objects/adaptors/DBusAdaptor.h"
+
+namespace FdoSecrets
+{
+
+ class PromptBase;
+ class PromptAdaptor : public DBusAdaptor<PromptBase>
+ {
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", DBUS_INTERFACE_SECRET_PROMPT)
+
+ public:
+ explicit PromptAdaptor(PromptBase* parent);
+ ~PromptAdaptor() override = default;
+
+ public slots:
+ void Prompt(const QString& windowId);
+ void Dismiss();
+
+ signals:
+ void Completed(bool dismissed, const QDBusVariant& result);
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_PROMPTADAPTOR_H
diff --git a/src/fdosecrets/objects/adaptors/ServiceAdaptor.cpp b/src/fdosecrets/objects/adaptors/ServiceAdaptor.cpp
new file mode 100644
index 000000000..a260c4920
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/ServiceAdaptor.cpp
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "ServiceAdaptor.h"
+
+#include "fdosecrets/objects/Collection.h"
+#include "fdosecrets/objects/Item.h"
+#include "fdosecrets/objects/Prompt.h"
+#include "fdosecrets/objects/Service.h"
+#include "fdosecrets/objects/Session.h"
+
+namespace FdoSecrets
+{
+
+ ServiceAdaptor::ServiceAdaptor(Service* parent)
+ : DBusAdaptor(parent)
+ {
+ connect(p(), &Service::collectionCreated, this, [this](Collection* coll) {
+ emit CollectionCreated(objectPathSafe(coll));
+ });
+ connect(p(), &Service::collectionDeleted, this, [this](Collection* coll) {
+ emit CollectionDeleted(objectPathSafe(coll));
+ });
+ connect(p(), &Service::collectionChanged, this, [this](Collection* coll) {
+ emit CollectionChanged(objectPathSafe(coll));
+ });
+ }
+
+ const QList<QDBusObjectPath> ServiceAdaptor::collections() const
+ {
+ auto colls = p()->collections().valueOrHandle(p());
+ return objectsToPath(std::move(colls));
+ }
+
+ QDBusVariant
+ ServiceAdaptor::OpenSession(const QString& algorithm, const QDBusVariant& input, QDBusObjectPath& result)
+ {
+ Session* session = nullptr;
+ auto output = p()->openSession(algorithm, input.variant(), session).valueOrHandle(p());
+ result = objectPathSafe(session);
+ return QDBusVariant(std::move(output));
+ }
+
+ QDBusObjectPath
+ ServiceAdaptor::CreateCollection(const QVariantMap& properties, const QString& alias, QDBusObjectPath& prompt)
+ {
+ PromptBase* pp;
+ auto coll = p()->createCollection(properties, alias, pp).valueOrHandle(p());
+ prompt = objectPathSafe(pp);
+ return objectPathSafe(coll);
+ }
+
+ const QList<QDBusObjectPath> ServiceAdaptor::SearchItems(const StringStringMap& attributes,
+ QList<QDBusObjectPath>& locked)
+ {
+ QList<Item*> lockedItems, unlockedItems;
+ unlockedItems = p()->searchItems(attributes, lockedItems).valueOrHandle(p());
+ locked = objectsToPath(lockedItems);
+ return objectsToPath(unlockedItems);
+ }
+
+ const QList<QDBusObjectPath> ServiceAdaptor::Unlock(const QList<QDBusObjectPath>& paths, QDBusObjectPath& prompt)
+ {
+ auto objects = pathsToObject<DBusObject>(paths);
+ if (!paths.isEmpty() && objects.isEmpty()) {
+ DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT)).handle(p());
+ return {};
+ }
+
+ PromptBase* pp = nullptr;
+ auto unlocked = p()->unlock(objects, pp).valueOrHandle(p());
+
+ prompt = objectPathSafe(pp);
+ return objectsToPath(unlocked);
+ }
+
+ const QList<QDBusObjectPath> ServiceAdaptor::Lock(const QList<QDBusObjectPath>& paths, QDBusObjectPath& prompt)
+ {
+ auto objects = pathsToObject<DBusObject>(paths);
+ if (!paths.isEmpty() && objects.isEmpty()) {
+ DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT)).handle(p());
+ return {};
+ }
+
+ PromptBase* pp = nullptr;
+ auto locked = p()->lock(objects, pp).valueOrHandle(p());
+
+ prompt = objectPathSafe(pp);
+ return objectsToPath(locked);
+ }
+
+ const ObjectPathSecretMap ServiceAdaptor::GetSecrets(const QList<QDBusObjectPath>& items,
+ const QDBusObjectPath& session)
+ {
+ auto itemObjects = pathsToObject<Item>(items);
+ if (!items.isEmpty() && itemObjects.isEmpty()) {
+ DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT)).handle(p());
+ return {};
+ }
+
+ auto secrets = p()->getSecrets(pathsToObject<Item>(items), pathToObject<Session>(session)).valueOrHandle(p());
+
+ ObjectPathSecretMap res;
+ auto iter = secrets.begin();
+ while (iter != secrets.end()) {
+ res[objectPathSafe(iter.key())] = std::move(iter.value());
+ ++iter;
+ }
+ return res;
+ }
+
+ QDBusObjectPath ServiceAdaptor::ReadAlias(const QString& name)
+ {
+ auto coll = p()->readAlias(name).valueOrHandle(p());
+ return objectPathSafe(coll);
+ }
+
+ void ServiceAdaptor::SetAlias(const QString& name, const QDBusObjectPath& collection)
+ {
+ p()->setAlias(name, pathToObject<Collection>(collection)).handle(p());
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/adaptors/ServiceAdaptor.h b/src/fdosecrets/objects/adaptors/ServiceAdaptor.h
new file mode 100644
index 000000000..b369c1273
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/ServiceAdaptor.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_SECRETSERVICEDBUS_H
+#define KEEPASSXC_FDOSECRETS_SECRETSERVICEDBUS_H
+
+#include "DBusAdaptor.h"
+
+#include <QDBusObjectPath>
+
+namespace FdoSecrets
+{
+ /**
+ * @brief Adapter class for interface org.freedesktop.Secret.Service
+ */
+ class Service;
+ class ServiceAdaptor : public DBusAdaptor<Service>
+ {
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", DBUS_INTERFACE_SECRET_SERVICE)
+
+ Q_PROPERTY(QList<QDBusObjectPath> Collections READ collections)
+
+ public:
+ explicit ServiceAdaptor(Service* parent);
+ ~ServiceAdaptor() override = default;
+
+ const QList<QDBusObjectPath> collections() const;
+
+ public slots:
+ QDBusVariant OpenSession(const QString& algorithm, const QDBusVariant& input, QDBusObjectPath& result);
+
+ QDBusObjectPath CreateCollection(const QVariantMap& properties, const QString& alias, QDBusObjectPath& prompt);
+
+ const QList<QDBusObjectPath> SearchItems(const StringStringMap& attributes, QList<QDBusObjectPath>& locked);
+
+ const QList<QDBusObjectPath> Unlock(const QList<QDBusObjectPath>& paths, QDBusObjectPath& prompt);
+
+ const QList<QDBusObjectPath> Lock(const QList<QDBusObjectPath>& paths, QDBusObjectPath& prompt);
+
+ const ObjectPathSecretMap GetSecrets(const QList<QDBusObjectPath>& items, const QDBusObjectPath& session);
+
+ QDBusObjectPath ReadAlias(const QString& name);
+
+ void SetAlias(const QString& name, const QDBusObjectPath& collection);
+
+ signals:
+ void CollectionCreated(const QDBusObjectPath& collection);
+
+ void CollectionDeleted(const QDBusObjectPath& collection);
+
+ void CollectionChanged(const QDBusObjectPath& collection);
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_SECRETSERVICEDBUS_H
diff --git a/src/fdosecrets/objects/adaptors/SessionAdaptor.cpp b/src/fdosecrets/objects/adaptors/SessionAdaptor.cpp
new file mode 100644
index 000000000..6597bfffe
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/SessionAdaptor.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "SessionAdaptor.h"
+
+#include "fdosecrets/objects/Session.h"
+
+namespace FdoSecrets
+{
+
+ SessionAdaptor::SessionAdaptor(Session* parent)
+ : DBusAdaptor(parent)
+ {
+ }
+
+ void SessionAdaptor::Close()
+ {
+ p()->close().handle(p());
+ }
+
+} // namespace FdoSecrets
diff --git a/src/fdosecrets/objects/adaptors/SessionAdaptor.h b/src/fdosecrets/objects/adaptors/SessionAdaptor.h
new file mode 100644
index 000000000..408061701
--- /dev/null
+++ b/src/fdosecrets/objects/adaptors/SessionAdaptor.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_FDOSECRETS_SESSIONADAPTOR_H
+#define KEEPASSXC_FDOSECRETS_SESSIONADAPTOR_H
+
+#include "fdosecrets/objects/adaptors/DBusAdaptor.h"
+
+namespace FdoSecrets
+{
+
+ class Session;
+ class SessionAdaptor : public DBusAdaptor<Session>
+ {
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", DBUS_INTERFACE_SECRET_SESSION)
+
+ public:
+ explicit SessionAdaptor(Session* parent);
+ ~SessionAdaptor() override = default;
+
+ public slots:
+ void Close();
+ };
+
+} // namespace FdoSecrets
+
+#endif // KEEPASSXC_FDOSECRETS_SESSIONADAPTOR_H
diff --git a/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.cpp b/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.cpp
new file mode 100644
index 000000000..fadd01542
--- /dev/null
+++ b/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.cpp
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "DatabaseSettingsWidgetFdoSecrets.h"
+#include "ui_DatabaseSettingsWidgetFdoSecrets.h"
+
+#include "fdosecrets/FdoSecretsSettings.h"
+
+#include "core/Database.h"
+#include "core/Group.h"
+#include "core/Metadata.h"
+#include "gui/group/GroupModel.h"
+
+#include <QSortFilterProxyModel>
+
+namespace
+{
+ enum class ExposedGroup
+ {
+ None,
+ Expose
+ };
+} // namespace
+
+class DatabaseSettingsWidgetFdoSecrets::GroupModelNoRecycle : public QSortFilterProxyModel
+{
+ Q_OBJECT
+
+ Database* m_db;
+
+public:
+ explicit GroupModelNoRecycle(Database* db)
+ : m_db(db)
+ {
+ Q_ASSERT(db);
+ setSourceModel(new GroupModel(m_db, this));
+ }
+
+ Group* groupFromIndex(const QModelIndex& index) const
+ {
+ return groupFromSourceIndex(mapToSource(index));
+ }
+
+ Group* groupFromSourceIndex(const QModelIndex& index) const
+ {
+ auto groupModel = qobject_cast<GroupModel*>(sourceModel());
+ Q_ASSERT(groupModel);
+ return groupModel->groupFromIndex(index);
+ }
+
+ QModelIndex indexFromGroup(Group* group) const
+ {
+ auto groupModel = qobject_cast<GroupModel*>(sourceModel());
+ Q_ASSERT(groupModel);
+ return mapFromSource(groupModel->index(group));
+ }
+
+protected:
+ bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override
+ {
+ auto source_idx = sourceModel()->index(source_row, 0, source_parent);
+ if (!source_idx.isValid()) {
+ return false;
+ }
+
+ auto recycleBin = m_db->metadata()->recycleBin();
+ if (!recycleBin) {
+ return true;
+ }
+
+ // can not call mapFromSource, which internally calls filterAcceptsRow
+ auto group = groupFromSourceIndex(source_idx);
+
+ return group->uuid() != recycleBin->uuid();
+ }
+};
+
+DatabaseSettingsWidgetFdoSecrets::DatabaseSettingsWidgetFdoSecrets(QWidget* parent)
+ : QWidget(parent)
+ , m_ui(new Ui::DatabaseSettingsWidgetFdoSecrets)
+{
+ m_ui->setupUi(this);
+ m_ui->buttonGroup->setId(m_ui->radioDonotExpose, static_cast<int>(ExposedGroup::None));
+ m_ui->buttonGroup->setId(m_ui->radioExpose, static_cast<int>(ExposedGroup::Expose));
+
+ // make sure there is at least a selection
+ connect(m_ui->radioExpose, &QRadioButton::toggled, this, [this](bool checked) {
+ if (checked && !m_ui->selectGroup->selectionModel()->hasSelection()) {
+ auto model = m_ui->selectGroup->model();
+ if (model) {
+ auto idx = model->index(0, 0);
+ m_ui->selectGroup->selectionModel()->select(idx, QItemSelectionModel::SelectCurrent);
+ }
+ }
+ });
+}
+
+DatabaseSettingsWidgetFdoSecrets::~DatabaseSettingsWidgetFdoSecrets() = default;
+
+void DatabaseSettingsWidgetFdoSecrets::loadSettings(QSharedPointer<Database> db)
+{
+ m_db = std::move(db);
+
+ m_model.reset(new GroupModelNoRecycle(m_db.data()));
+ m_ui->selectGroup->setModel(m_model.data());
+
+ auto group = m_db->rootGroup()->findGroupByUuid(FdoSecrets::settings()->exposedGroup(m_db));
+ if (!group) {
+ m_ui->radioDonotExpose->setChecked(true);
+ } else {
+ auto idx = m_model->indexFromGroup(group);
+ m_ui->selectGroup->selectionModel()->select(idx, QItemSelectionModel::SelectCurrent);
+ // expand all its parents
+ idx = idx.parent();
+ while (idx.isValid()) {
+ m_ui->selectGroup->expand(idx);
+ idx = idx.parent();
+ }
+ m_ui->radioExpose->setChecked(true);
+ }
+
+ settingsWarning();
+}
+
+void DatabaseSettingsWidgetFdoSecrets::saveSettings()
+{
+ Q_ASSERT(m_db);
+ Q_ASSERT(m_model);
+
+ QUuid exposedGroup;
+ switch (static_cast<ExposedGroup>(m_ui->buttonGroup->checkedId())) {
+ case ExposedGroup::None:
+ break;
+ case ExposedGroup::Expose: {
+ auto idx = m_ui->selectGroup->selectionModel()->selectedIndexes().takeFirst();
+ Q_ASSERT(idx.isValid());
+ exposedGroup = m_model->groupFromIndex(idx)->uuid();
+ break;
+ }
+ }
+
+ FdoSecrets::settings()->setExposedGroup(m_db, exposedGroup);
+}
+
+void DatabaseSettingsWidgetFdoSecrets::settingsWarning()
+{
+ if (FdoSecrets::settings()->isEnabled()) {
+ m_ui->groupBox->setEnabled(true);
+ m_ui->warningWidget->hideMessage();
+ } else {
+ m_ui->groupBox->setEnabled(false);
+ m_ui->warningWidget->showMessage(tr("Enable fd.o Secret Service to access these settings."),
+ MessageWidget::Warning);
+ m_ui->warningWidget->setCloseButtonVisible(false);
+ m_ui->warningWidget->setAutoHideTimeout(-1);
+ }
+}
+
+#include "DatabaseSettingsWidgetFdoSecrets.moc"
diff --git a/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.h b/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.h
new file mode 100644
index 000000000..829a2fae8
--- /dev/null
+++ b/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_DATABASESETTINGSWIDGETFDOSECRETS_H
+#define KEEPASSXC_DATABASESETTINGSWIDGETFDOSECRETS_H
+
+#include <QScopedPointer>
+#include <QSharedPointer>
+#include <QWidget>
+
+namespace Ui
+{
+ class DatabaseSettingsWidgetFdoSecrets;
+}
+
+class Database;
+class DatabaseSettingsWidgetFdoSecrets : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit DatabaseSettingsWidgetFdoSecrets(QWidget* parent = nullptr);
+ ~DatabaseSettingsWidgetFdoSecrets() override;
+
+ void loadSettings(QSharedPointer<Database> db);
+ void saveSettings();
+
+private:
+ void settingsWarning();
+
+private:
+ QScopedPointer<Ui::DatabaseSettingsWidgetFdoSecrets> m_ui;
+
+ QSharedPointer<Database> m_db;
+
+ class GroupModelNoRecycle;
+ QScopedPointer<GroupModelNoRecycle> m_model;
+};
+
+#endif // KEEPASSXC_DATABASESETTINGSWIDGETFDOSECRETS_H
diff --git a/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.ui b/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.ui
new file mode 100644
index 000000000..6bacb32b6
--- /dev/null
+++ b/src/fdosecrets/widgets/DatabaseSettingsWidgetFdoSecrets.ui
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DatabaseSettingsWidgetFdoSecrets</class>
+ <widget class="QWidget" name="DatabaseSettingsWidgetFdoSecrets">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="MessageWidget" name="warningWidget" native="true"/>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Exposed Entries</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QRadioButton" name="radioDonotExpose">
+ <property name="text">
+ <string>Don't e&amp;xpose this database</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="radioExpose">
+ <property name="text">
+ <string>Expose entries &amp;under this group:</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTreeView" name="selectGroup">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
+ <attribute name="headerVisible">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>MessageWidget</class>
+ <extends>QWidget</extends>
+ <header>gui/MessageWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>radioExpose</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>selectGroup</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>199</x>
+ <y>92</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>199</x>
+ <y>189</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+ <buttongroups>
+ <buttongroup name="buttonGroup"/>
+ </buttongroups>
+</ui>
diff --git a/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.cpp b/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.cpp
new file mode 100644
index 000000000..920b603d9
--- /dev/null
+++ b/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "SettingsWidgetFdoSecrets.h"
+#include "ui_SettingsWidgetFdoSecrets.h"
+
+#include "fdosecrets/FdoSecretsPlugin.h"
+#include "fdosecrets/FdoSecretsSettings.h"
+#include "fdosecrets/objects/Collection.h"
+#include "fdosecrets/objects/Prompt.h"
+#include "fdosecrets/objects/Session.h"
+
+#include "core/DatabaseIcons.h"
+#include "core/FilePath.h"
+#include "gui/DatabaseWidget.h"
+
+#include <QAction>
+#include <QDebug>
+#include <QFileInfo>
+#include <QHeaderView>
+#include <QPushButton>
+#include <QTableWidget>
+#include <QToolBar>
+#include <QVariant>
+
+using FdoSecrets::Collection;
+using FdoSecrets::Service;
+using FdoSecrets::Session;
+
+SettingsWidgetFdoSecrets::SettingsWidgetFdoSecrets(FdoSecretsPlugin* plugin, QWidget* parent)
+ : QWidget(parent)
+ , m_ui(new Ui::SettingsWidgetFdoSecrets())
+ , m_plugin(plugin)
+{
+ m_ui->setupUi(this);
+
+ auto sessHeader = m_ui->tableSessions->horizontalHeader();
+ sessHeader->setSelectionMode(QAbstractItemView::NoSelection);
+ sessHeader->setSectionsClickable(false);
+ sessHeader->setSectionResizeMode(0, QHeaderView::Stretch); // application
+ sessHeader->setSectionResizeMode(1, QHeaderView::ResizeToContents); // disconnect button
+
+ auto dbHeader = m_ui->tableDatabases->horizontalHeader();
+ dbHeader->setSelectionMode(QAbstractItemView::NoSelection);
+ dbHeader->setSectionsClickable(false);
+ dbHeader->setSectionResizeMode(0, QHeaderView::Stretch); // file name
+ dbHeader->setSectionResizeMode(1, QHeaderView::Stretch); // group
+ dbHeader->setSectionResizeMode(2, QHeaderView::ResizeToContents); // manage button
+
+ m_ui->tabWidget->setEnabled(m_ui->enableFdoSecretService->isChecked());
+ connect(m_ui->enableFdoSecretService, &QCheckBox::toggled, m_ui->tabWidget, &QTabWidget::setEnabled);
+}
+
+SettingsWidgetFdoSecrets::~SettingsWidgetFdoSecrets() = default;
+
+void SettingsWidgetFdoSecrets::populateSessions(bool enabled)
+{
+ m_ui->tableSessions->setRowCount(0);
+
+ auto service = m_plugin->serviceInstance();
+ if (!service || !enabled) {
+ return;
+ }
+
+ for (const auto& sess : service->sessions()) {
+ addSessionRow(sess);
+ }
+}
+
+void SettingsWidgetFdoSecrets::addSessionRow(Session* sess)
+{
+ auto row = m_ui->tableSessions->rowCount();
+ m_ui->tableSessions->insertRow(row);
+
+ // column 0: application name
+ auto item = new QTableWidgetItem(sess->peer());
+ item->setData(Qt::UserRole, QVariant::fromValue(sess));
+ m_ui->tableSessions->setItem(row, 0, item);
+
+ // column 1: disconnect button
+ auto btn = new QPushButton(tr("Disconnect"));
+ connect(btn, &QPushButton::clicked, sess, &Session::close);
+ m_ui->tableSessions->setCellWidget(row, 1, btn);
+
+ // column 2: hidden uuid
+ m_ui->tableSessions->setItem(row, 2, new QTableWidgetItem(sess->id()));
+}
+
+void SettingsWidgetFdoSecrets::removeSessionRow(Session* sess)
+{
+ int row = 0;
+ while (row != m_ui->tableSessions->rowCount()) {
+ auto item = m_ui->tableSessions->item(row, 0);
+ const auto itemSess = item->data(Qt::UserRole).value<Session*>();
+ if (itemSess == sess) {
+ break;
+ }
+ ++row;
+ }
+ if (row == m_ui->tableSessions->rowCount()) {
+ qWarning() << "Unknown Fdo Secret Service session" << sess->id() << "while removing collection from table";
+ return;
+ }
+
+ m_ui->tableSessions->removeRow(row);
+}
+
+void SettingsWidgetFdoSecrets::populateDatabases(bool enabled)
+{
+ m_ui->tableDatabases->setRowCount(0);
+
+ auto service = m_plugin->serviceInstance();
+ if (!service || !enabled) {
+ return;
+ }
+
+ auto ret = service->collections();
+ if (ret.isError()) {
+ return;
+ }
+ for (const auto& coll : ret.value()) {
+ addDatabaseRow(coll);
+ }
+}
+
+void SettingsWidgetFdoSecrets::addDatabaseRow(Collection* coll)
+{
+ auto row = m_ui->tableDatabases->rowCount();
+ m_ui->tableDatabases->insertRow(row);
+
+ // column 0: File name
+ QFileInfo fi(coll->backend()->database()->filePath());
+ auto item = new QTableWidgetItem(fi.fileName());
+ item->setData(Qt::UserRole, QVariant::fromValue(coll));
+ m_ui->tableDatabases->setItem(row, 0, item);
+
+ // column 2: manage button: hboxlayout: unlock/lock settings
+ // create this first so we have a widget to bind connection to,
+ // which can then be auto deleted when the row is deleted.
+ auto widget = createManageButtons(coll);
+ m_ui->tableDatabases->setCellWidget(row, 2, widget);
+
+ // column 1: Group name
+ auto itemGroupName = new QTableWidgetItem();
+ updateExposedGroupItem(itemGroupName, coll);
+
+ connect(coll, &Collection::collectionLockChanged, widget, [this, itemGroupName, coll](bool) {
+ updateExposedGroupItem(itemGroupName, coll);
+ });
+
+ m_ui->tableDatabases->setItem(row, 1, itemGroupName);
+}
+
+QWidget* SettingsWidgetFdoSecrets::createManageButtons(Collection* coll)
+{
+ auto toolbar = new QToolBar;
+ toolbar->setFloatable(false);
+ toolbar->setMovable(false);
+
+ // db settings
+ auto dbSettingsAct = new QAction(tr("Database settings"), toolbar);
+ dbSettingsAct->setIcon(filePath()->icon(QStringLiteral("actions"), QStringLiteral("document-edit")));
+ dbSettingsAct->setToolTip(tr("Edit database settings"));
+ dbSettingsAct->setEnabled(!coll->locked().value());
+ connect(dbSettingsAct, &QAction::triggered, this, [this, coll]() {
+ auto db = coll->backend();
+ m_plugin->serviceInstance()->doSwitchToChangeDatabaseSettings(db);
+ });
+ toolbar->addAction(dbSettingsAct);
+
+ // unlock/lock
+ auto lockAct = new QAction(tr("Unlock database"), toolbar);
+ lockAct->setIcon(filePath()->icon(QStringLiteral("actions"), QStringLiteral("object-locked"), true));
+ lockAct->setToolTip(tr("Unlock database to show more information"));
+ connect(coll, &Collection::collectionLockChanged, lockAct, [lockAct, dbSettingsAct](bool locked) {
+ if (locked) {
+ lockAct->setIcon(filePath()->icon(QStringLiteral("actions"), QStringLiteral("object-locked"), true));
+ lockAct->setToolTip(tr("Unlock database to show more information"));
+ } else {
+ lockAct->setIcon(filePath()->icon(QStringLiteral("actions"), QStringLiteral("object-unlocked"), true));
+ lockAct->setToolTip(tr("Lock database"));
+ }
+ dbSettingsAct->setEnabled(!locked);
+ });
+ connect(lockAct, &QAction::triggered, this, [coll]() {
+ if (coll->locked().value()) {
+ coll->doUnlock();
+ } else {
+ coll->doLock();
+ }
+ });
+ toolbar->addAction(lockAct);
+
+ return toolbar;
+}
+
+void SettingsWidgetFdoSecrets::updateExposedGroupItem(QTableWidgetItem* item, Collection* coll)
+{
+ if (coll->locked().value()) {
+ item->setText(tr("Unlock to show"));
+ item->setIcon(filePath()->icon(QStringLiteral("apps"), QStringLiteral("object-locked"), true));
+ QFont font;
+ font.setItalic(true);
+ item->setFont(font);
+ return;
+ }
+
+ auto db = coll->backend()->database();
+ auto group = db->rootGroup()->findGroupByUuid(FdoSecrets::settings()->exposedGroup(db));
+ if (group) {
+ item->setText(group->name());
+ item->setIcon(group->isExpired() ? databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex)
+ : group->iconScaledPixmap());
+ if (group->isExpired()) {
+ QFont font;
+ font.setStrikeOut(true);
+ item->setFont(font);
+ }
+ } else {
+ item->setText(tr("None"));
+ item->setIcon(filePath()->icon(QStringLiteral("apps"), QStringLiteral("paint-none"), true));
+ }
+}
+
+void SettingsWidgetFdoSecrets::removeDatabaseRow(Collection* coll)
+{
+ int row = 0;
+ while (row != m_ui->tableDatabases->rowCount()) {
+ auto item = m_ui->tableDatabases->item(row, 0);
+ const auto itemColl = item->data(Qt::UserRole).value<Collection*>();
+ if (itemColl == coll) {
+ break;
+ }
+ ++row;
+ }
+ if (row == m_ui->tableDatabases->rowCount()) {
+ qWarning() << "Unknown Fdo Secret Service collection" << coll->name() << "while removing collection from table";
+ return;
+ }
+
+ m_ui->tableDatabases->removeRow(row);
+}
+
+void SettingsWidgetFdoSecrets::loadSettings()
+{
+ m_ui->enableFdoSecretService->setChecked(FdoSecrets::settings()->isEnabled());
+ m_ui->showNotification->setChecked(FdoSecrets::settings()->showNotification());
+ m_ui->noConfirmDeleteItem->setChecked(FdoSecrets::settings()->noConfirmDeleteItem());
+}
+
+void SettingsWidgetFdoSecrets::saveSettings()
+{
+ FdoSecrets::settings()->setEnabled(m_ui->enableFdoSecretService->isChecked());
+ FdoSecrets::settings()->setShowNotification(m_ui->showNotification->isChecked());
+ FdoSecrets::settings()->setNoConfirmDeleteItem(m_ui->noConfirmDeleteItem->isChecked());
+}
+
+void SettingsWidgetFdoSecrets::showEvent(QShowEvent* event)
+{
+ QWidget::showEvent(event);
+
+ QMetaObject::invokeMethod(this, "updateTables", Qt::QueuedConnection, Q_ARG(bool, true));
+}
+
+void SettingsWidgetFdoSecrets::hideEvent(QHideEvent* event)
+{
+ QWidget::hideEvent(event);
+
+ QMetaObject::invokeMethod(this, "updateTables", Qt::QueuedConnection, Q_ARG(bool, false));
+}
+
+void SettingsWidgetFdoSecrets::updateTables(bool enabled)
+{
+ if (enabled) {
+ // update the table
+ populateDatabases(m_ui->enableFdoSecretService->isChecked());
+ populateSessions(m_ui->enableFdoSecretService->isChecked());
+
+ // re-layout the widget to adjust the table cell size
+ adjustSize();
+
+ connect(m_ui->enableFdoSecretService, &QCheckBox::toggled, this, &SettingsWidgetFdoSecrets::populateSessions);
+ connect(m_ui->enableFdoSecretService, &QCheckBox::toggled, this, &SettingsWidgetFdoSecrets::populateDatabases);
+
+ auto service = m_plugin->serviceInstance();
+ if (service) {
+ connect(service, &Service::sessionOpened, this, &SettingsWidgetFdoSecrets::addSessionRow);
+ connect(service, &Service::sessionClosed, this, &SettingsWidgetFdoSecrets::removeSessionRow);
+ connect(service, &Service::collectionCreated, this, &SettingsWidgetFdoSecrets::addDatabaseRow);
+ connect(service, &Service::collectionDeleted, this, &SettingsWidgetFdoSecrets::removeDatabaseRow);
+ }
+ } else {
+ disconnect(
+ m_ui->enableFdoSecretService, &QCheckBox::toggled, this, &SettingsWidgetFdoSecrets::populateSessions);
+ disconnect(
+ m_ui->enableFdoSecretService, &QCheckBox::toggled, this, &SettingsWidgetFdoSecrets::populateDatabases);
+
+ auto service = m_plugin->serviceInstance();
+ if (service) {
+ disconnect(service, &Service::sessionOpened, this, &SettingsWidgetFdoSecrets::addSessionRow);
+ disconnect(service, &Service::sessionClosed, this, &SettingsWidgetFdoSecrets::removeSessionRow);
+ disconnect(service, &Service::collectionCreated, this, &SettingsWidgetFdoSecrets::addDatabaseRow);
+ disconnect(service, &Service::collectionDeleted, this, &SettingsWidgetFdoSecrets::removeDatabaseRow);
+ }
+ }
+}
diff --git a/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.h b/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.h
new file mode 100644
index 000000000..eac1f1e3c
--- /dev/null
+++ b/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_SETTINGSWIDGETFDOSECRETS_H
+#define KEEPASSXC_SETTINGSWIDGETFDOSECRETS_H
+
+#include <QScopedPointer>
+#include <QWidget>
+
+class QTableWidgetItem;
+
+namespace FdoSecrets
+{
+
+ class Session;
+ class Collection;
+
+} // namespace FdoSecrets
+
+class FdoSecretsPlugin;
+
+namespace Ui
+{
+ class SettingsWidgetFdoSecrets;
+}
+class SettingsWidgetFdoSecrets : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit SettingsWidgetFdoSecrets(FdoSecretsPlugin* plugin, QWidget* parent = nullptr);
+ ~SettingsWidgetFdoSecrets() override;
+
+public slots:
+ void loadSettings();
+ void saveSettings();
+
+private slots:
+ void populateSessions(bool enabled);
+ void populateDatabases(bool enabled);
+ void addSessionRow(FdoSecrets::Session* sess);
+ void removeSessionRow(FdoSecrets::Session* sess);
+ void addDatabaseRow(FdoSecrets::Collection* coll);
+ void removeDatabaseRow(FdoSecrets::Collection* coll);
+
+ void updateTables(bool enabled);
+
+protected:
+ void showEvent(QShowEvent* event) override;
+
+ void hideEvent(QHideEvent* event) override;
+
+private:
+ QWidget* createManageButtons(FdoSecrets::Collection* coll);
+
+ void updateExposedGroupItem(QTableWidgetItem* item, FdoSecrets::Collection* coll);
+
+private:
+ QScopedPointer<Ui::SettingsWidgetFdoSecrets> m_ui;
+ FdoSecretsPlugin* m_plugin;
+};
+
+#endif // KEEPASSXC_SETTINGSWIDGETFDOSECRETS_H
diff --git a/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.ui b/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.ui
new file mode 100644
index 000000000..b77e086c9
--- /dev/null
+++ b/src/fdosecrets/widgets/SettingsWidgetFdoSecrets.ui
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SettingsWidgetFdoSecrets</class>
+ <widget class="QWidget" name="SettingsWidgetFdoSecrets">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>525</width>
+ <height>457</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Options</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QWidget" name="warningMsg" native="true"/>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="enableFdoSecretService">
+ <property name="text">
+ <string>Enable KeepassXC Freedesktop.org Secret Service integration</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="showNotification">
+ <property name="text">
+ <string>Show notification when credentials are requested</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="noConfirmDeleteItem">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If recycle bin is enabled for the database, entries will be moved to recycle bin directly. Otherwise, they will be deleted without confirmation.&lt;/p&gt;&lt;p&gt;You will still be prompted if any entries are referenced by others.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Don't confirm when entries are deleted by clients.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Exposed database groups:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTableWidget" name="tableDatabases">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <column>
+ <property name="text">
+ <string>File Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Group</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Manage</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2">
+ <attribute name="title">
+ <string>Authorization</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>These applications are currently connected:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTableWidget" name="tableSessions">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <column>
+ <property name="text">
+ <string>Application</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Manage</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/format/CsvExporter.cpp b/src/format/CsvExporter.cpp
index 03d5a576f..98fc6fdc8 100644
--- a/src/format/CsvExporter.cpp
+++ b/src/format/CsvExporter.cpp
@@ -35,21 +35,22 @@ bool CsvExporter::exportDatabase(const QString& filename, const QSharedPointer<c
bool CsvExporter::exportDatabase(QIODevice* device, const QSharedPointer<const Database>& db)
{
- QString header;
- addColumn(header, "Group");
- addColumn(header, "Title");
- addColumn(header, "Username");
- addColumn(header, "Password");
- addColumn(header, "URL");
- addColumn(header, "Notes");
- header.append("\n");
+ if (device->write(exportHeader().toUtf8()) == -1) {
+ m_error = device->errorString();
+ return false;
+ }
- if (device->write(header.toUtf8()) == -1) {
+ if (device->write(exportGroup(db->rootGroup()).toUtf8()) == -1) {
m_error = device->errorString();
return false;
}
- return writeGroup(device, db->rootGroup());
+ return true;
+}
+
+QString CsvExporter::exportDatabase(const QSharedPointer<const Database>& db)
+{
+ return exportHeader() + exportGroup(db->rootGroup());
}
QString CsvExporter::errorString() const
@@ -57,8 +58,21 @@ QString CsvExporter::errorString() const
return m_error;
}
-bool CsvExporter::writeGroup(QIODevice* device, const Group* group, QString groupPath)
+QString CsvExporter::exportHeader()
{
+ QString header;
+ addColumn(header, "Group");
+ addColumn(header, "Title");
+ addColumn(header, "Username");
+ addColumn(header, "Password");
+ addColumn(header, "URL");
+ addColumn(header, "Notes");
+ return header + QString("\n");
+}
+
+QString CsvExporter::exportGroup(const Group* group, QString groupPath)
+{
+ QString response;
if (!groupPath.isEmpty()) {
groupPath.append("/");
}
@@ -76,21 +90,15 @@ bool CsvExporter::writeGroup(QIODevice* device, const Group* group, QString grou
addColumn(line, entry->notes());
line.append("\n");
-
- if (device->write(line.toUtf8()) == -1) {
- m_error = device->errorString();
- return false;
- }
+ response.append(line);
}
const QList<Group*>& children = group->children();
for (const Group* child : children) {
- if (!writeGroup(device, child, groupPath)) {
- return false;
- }
+ response.append(exportGroup(child, groupPath));
}
- return true;
+ return response;
}
void CsvExporter::addColumn(QString& str, const QString& column)
diff --git a/src/format/CsvExporter.h b/src/format/CsvExporter.h
index e71cf7fa9..a982ed109 100644
--- a/src/format/CsvExporter.h
+++ b/src/format/CsvExporter.h
@@ -31,10 +31,12 @@ class CsvExporter
public:
bool exportDatabase(const QString& filename, const QSharedPointer<const Database>& db);
bool exportDatabase(QIODevice* device, const QSharedPointer<const Database>& db);
+ QString exportDatabase(const QSharedPointer<const Database>& db);
QString errorString() const;
private:
- bool writeGroup(QIODevice* device, const Group* group, QString groupPath = QString());
+ QString exportGroup(const Group* group, QString groupPath = QString());
+ QString exportHeader();
void addColumn(QString& str, const QString& column);
QString m_error;
diff --git a/src/format/HtmlExporter.cpp b/src/format/HtmlExporter.cpp
new file mode 100644
index 000000000..152f2933a
--- /dev/null
+++ b/src/format/HtmlExporter.cpp
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "HtmlExporter.h"
+
+#include <QBuffer>
+#include <QFile>
+
+#include "core/Database.h"
+#include "core/Group.h"
+#include "core/Metadata.h"
+
+namespace
+{
+ QString PixmapToHTML(const QPixmap& pixmap)
+ {
+ if (pixmap.isNull())
+ return "";
+
+ // Based on https://stackoverflow.com/a/6621278
+ QByteArray a;
+ QBuffer buffer(&a);
+ pixmap.save(&buffer, "PNG");
+ return QString("<img src=\"data:image/png;base64,") + a.toBase64() + "\"/>";
+ }
+} // namespace
+
+bool HtmlExporter::exportDatabase(const QString& filename, const QSharedPointer<const Database>& db)
+{
+ QFile file(filename);
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
+ m_error = file.errorString();
+ return false;
+ }
+ return exportDatabase(&file, db);
+}
+
+QString HtmlExporter::errorString() const
+{
+ return m_error;
+}
+
+bool HtmlExporter::exportDatabase(QIODevice* device, const QSharedPointer<const Database>& db)
+{
+ const auto meta = db->metadata();
+ if (!meta) {
+ m_error = "Internal error: metadata is NULL";
+ return false;
+ }
+
+ const auto header = QString("<html>"
+ "<head>"
+ "<meta charset=\"UTF-8\">"
+ "<title>"
+ + meta->name().toHtmlEscaped()
+ + "</title>"
+ "<style>"
+ "body "
+ "{ font-family: \"Open Sans\", Helvetica, Arial, sans-serif; }"
+ "h3 "
+ "{ margin-left: 2em; }"
+ "table "
+ "{ margin-left: 4em; } "
+ "th, td "
+ "{ text-align: left; vertical-align: top; padding: 1px; }"
+ "th "
+ "{ min-width: 5em; } "
+ ".username, .password, .url, .attr "
+ "{ font-size: larger; font-family: monospace; } "
+ ".notes "
+ "{ font-size: medium; } "
+ "@media print {"
+ ".entry"
+ "{ page-break-inside: avoid; } "
+ "}"
+ "</style>"
+ "</head>\n"
+ "<body>"
+ "<h1>"
+ + meta->name().toHtmlEscaped()
+ + "</h1>"
+ "<p>"
+ + meta->description().toHtmlEscaped().replace("\n", "<br>")
+ + "</p>"
+ "<p><code>"
+ + db->filePath().toHtmlEscaped() + "</code></p>");
+ const auto footer = QString("</body>"
+ "</html>");
+
+ if (device->write(header.toUtf8()) == -1) {
+ m_error = device->errorString();
+ return false;
+ }
+
+ if (db->rootGroup()) {
+ if (!writeGroup(*device, *db->rootGroup())) {
+ return false;
+ }
+ }
+
+ if (device->write(footer.toUtf8()) == -1) {
+ m_error = device->errorString();
+ return false;
+ }
+
+ return true;
+}
+
+bool HtmlExporter::writeGroup(QIODevice& device, const Group& group, QString path)
+{
+ // Don't output the recycle bin
+ if (&group == group.database()->metadata()->recycleBin()) {
+ return true;
+ }
+
+ if (!path.isEmpty()) {
+ path.append(" &rarr; ");
+ }
+ path.append(group.name().toHtmlEscaped());
+
+ // Output the header for this group (but only if there are
+ // any notes or entries in this group, otherwise we'd get
+ // a header with nothing after it, which looks stupid)
+ const auto& entries = group.entries();
+ const auto notes = group.notes();
+ if (!entries.empty() || !notes.isEmpty()) {
+
+ // Header line
+ auto header = QString("<hr><h2>");
+ header.append(PixmapToHTML(group.iconScaledPixmap()));
+ header.append("&nbsp;");
+ header.append(path);
+ header.append("</h2>\n");
+
+ // Group notes
+ if (!notes.isEmpty()) {
+ header.append("<p>");
+ header.append(notes.toHtmlEscaped().replace("\n", "<br>"));
+ header.append("</p>");
+ }
+
+ // Output it
+ if (device.write(header.toUtf8()) == -1) {
+ m_error = device.errorString();
+ return false;
+ }
+ }
+
+ // Output the entries in this group
+ for (const auto entry : entries) {
+ auto item = QString("<div class=\"entry\"><h3>");
+
+ // Begin formatting this item into HTML
+ item.append(PixmapToHTML(entry->iconScaledPixmap()));
+ item.append("&nbsp;");
+ item.append(entry->title().toHtmlEscaped());
+ item.append("</h3>\n"
+ "<table>");
+
+ // Output the fixed fields
+ const auto& u = entry->username();
+ if (!u.isEmpty()) {
+ item.append("<tr><th>");
+ item.append(QObject::tr("User name"));
+ item.append("</t><td class=\"username\">");
+ item.append(entry->username().toHtmlEscaped());
+ item.append("</td></tr>");
+ }
+
+ const auto& p = entry->password();
+ if (!p.isEmpty()) {
+ item.append("<tr><th>");
+ item.append(QObject::tr("Password"));
+ item.append("</th><td class=\"password\">");
+ item.append(entry->password().toHtmlEscaped());
+ item.append("</td></tr>");
+ }
+
+ const auto& r = entry->url();
+ if (!r.isEmpty()) {
+ item.append("<tr><th>");
+ item.append(QObject::tr("URL"));
+ item.append("</th><td class=\"url\"><a href=\"");
+ item.append(r.toHtmlEscaped());
+ item.append("\">");
+
+ // Restrict the length of what we display of the URL -
+ // even from a paper backup, nobody will every type in
+ // more than 100 characters of a URL
+ constexpr auto maxlen = 100;
+ if (r.size() <= maxlen) {
+ item.append(r.toHtmlEscaped());
+ } else {
+ item.append(r.mid(0, maxlen).toHtmlEscaped());
+ item.append("&hellip;");
+ }
+
+ item.append("</a></td></tr>");
+ }
+
+ const auto& n = entry->notes();
+ if (!n.isEmpty()) {
+ item.append("<tr><th>");
+ item.append(QObject::tr("Notes"));
+ item.append("</th><td class=\"notes\">");
+ item.append(entry->notes().toHtmlEscaped().replace("\n", "<br>"));
+ item.append("</td></tr>");
+ }
+
+ // Now add the attributes (if there are any)
+ const auto* const attr = entry->attributes();
+ if (attr && !attr->customKeys().isEmpty()) {
+ for (const auto& key : attr->customKeys()) {
+ item.append("<tr><th>");
+ item.append(key.toHtmlEscaped());
+ item.append("</th><td class=\"attr\">");
+ item.append(attr->value(key).toHtmlEscaped().replace("\n", "<br>"));
+ item.append("</td></tr>");
+ }
+ }
+
+ // Done with this entry
+ item.append("</table></div>\n");
+ if (device.write(item.toUtf8()) == -1) {
+ m_error = device.errorString();
+ return false;
+ }
+ }
+
+ // Recursively output the child groups
+ const auto& children = group.children();
+ for (const auto child : children) {
+ if (child && !writeGroup(device, *child, path)) {
+ return false;
+ }
+ }
+
+ return true;
+}
diff --git a/src/format/HtmlExporter.h b/src/format/HtmlExporter.h
new file mode 100644
index 000000000..3a592e54a
--- /dev/null
+++ b/src/format/HtmlExporter.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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_HTMLEXPORTER_H
+#define KEEPASSX_HTMLEXPORTER_H
+
+#include <QSharedPointer>
+#include <QString>
+
+class Database;
+class Group;
+class QIODevice;
+
+class HtmlExporter
+{
+public:
+ bool exportDatabase(const QString& filename, const QSharedPointer<const Database>& db);
+ QString errorString() const;
+
+private:
+ bool exportDatabase(QIODevice* device, const QSharedPointer<const Database>& db);
+ bool writeGroup(QIODevice& device, const Group& group, QString path = QString());
+
+ QString m_error;
+};
+
+#endif // KEEPASSX_HTMLEXPORTER_H
diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp
index b2de41f44..0728dc294 100644
--- a/src/format/Kdbx3Writer.cpp
+++ b/src/format/Kdbx3Writer.cpp
@@ -63,7 +63,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db)
QBuffer header;
header.open(QIODevice::WriteOnly);
- writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_3_1);
+ writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, formatVersion());
CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toRfc4122()));
CHECK_RETURN_FALSE(
@@ -133,7 +133,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db)
return false;
}
- KdbxXmlWriter xmlWriter(KeePass2::FILE_VERSION_3_1);
+ KdbxXmlWriter xmlWriter(formatVersion());
xmlWriter.writeDatabase(outputDevice, db, &randomStream, headerHash);
// Explicitly close/reset streams so they are flushed and we can detect
@@ -157,3 +157,8 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db)
return true;
}
+
+quint32 Kdbx3Writer::formatVersion()
+{
+ return KeePass2::FILE_VERSION_3_1;
+}
diff --git a/src/format/Kdbx3Writer.h b/src/format/Kdbx3Writer.h
index eb98a470d..45b0a8b51 100644
--- a/src/format/Kdbx3Writer.h
+++ b/src/format/Kdbx3Writer.h
@@ -29,6 +29,7 @@ class Kdbx3Writer : public KdbxWriter
public:
bool writeDatabase(QIODevice* device, Database* db) override;
+ quint32 formatVersion() override;
};
#endif // KEEPASSX_KDBX3WRITER_H
diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp
index 33c0024ed..03d549cf0 100644
--- a/src/format/Kdbx4Writer.cpp
+++ b/src/format/Kdbx4Writer.cpp
@@ -70,7 +70,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db)
QBuffer header;
header.open(QIODevice::WriteOnly);
- writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_4);
+ writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, formatVersion());
CHECK_RETURN_FALSE(
writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toRfc4122()));
@@ -171,7 +171,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db)
return false;
}
- KdbxXmlWriter xmlWriter(KeePass2::FILE_VERSION_4);
+ KdbxXmlWriter xmlWriter(formatVersion());
xmlWriter.writeDatabase(outputDevice, db, &randomStream, headerHash);
// Explicitly close/reset streams so they are flushed and we can detect
@@ -311,3 +311,8 @@ bool Kdbx4Writer::serializeVariantMap(const QVariantMap& map, QByteArray& output
CHECK_RETURN_FALSE(buf.write(endBytes) == 1);
return true;
}
+
+quint32 Kdbx4Writer::formatVersion()
+{
+ return KeePass2::FILE_VERSION_4;
+}
diff --git a/src/format/Kdbx4Writer.h b/src/format/Kdbx4Writer.h
index c8540245b..8ef82f18f 100644
--- a/src/format/Kdbx4Writer.h
+++ b/src/format/Kdbx4Writer.h
@@ -29,6 +29,7 @@ class Kdbx4Writer : public KdbxWriter
public:
bool writeDatabase(QIODevice* device, Database* db) override;
+ quint32 formatVersion() override;
private:
bool writeInnerHeaderField(QIODevice* device, KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data);
diff --git a/src/format/KdbxReader.cpp b/src/format/KdbxReader.cpp
index 50b7a7245..6ae77662c 100644
--- a/src/format/KdbxReader.cpp
+++ b/src/format/KdbxReader.cpp
@@ -20,7 +20,6 @@
#include "KdbxReader.h"
#include "core/Database.h"
#include "core/Endian.h"
-#include "format/KdbxXmlWriter.h"
#include <QBuffer>
@@ -67,7 +66,6 @@ bool KdbxReader::readDatabase(QIODevice* device, QSharedPointer<const CompositeK
device->seek(0);
m_db = db;
- m_xmlData.clear();
m_masterSeed.clear();
m_encryptionIV.clear();
m_streamStartBytes.clear();
@@ -97,14 +95,7 @@ bool KdbxReader::readDatabase(QIODevice* device, QSharedPointer<const CompositeK
}
// read payload
- bool ok = readDatabaseImpl(device, headerStream.storedData(), std::move(key), db);
-
- if (saveXml()) {
- m_xmlData.clear();
- decryptXmlInnerStream(m_xmlData, db);
- }
-
- return ok;
+ return readDatabaseImpl(device, headerStream.storedData(), std::move(key), db);
}
bool KdbxReader::hasError() const
@@ -117,21 +108,6 @@ QString KdbxReader::errorString() const
return m_errorStr;
}
-bool KdbxReader::saveXml() const
-{
- return m_saveXml;
-}
-
-void KdbxReader::setSaveXml(bool save)
-{
- m_saveXml = save;
-}
-
-QByteArray KdbxReader::xmlData() const
-{
- return m_xmlData;
-}
-
KeePass2::ProtectedStreamAlgo KdbxReader::protectedStreamAlgo() const
{
return m_irsAlgo;
@@ -271,23 +247,6 @@ void KdbxReader::setInnerRandomStreamID(const QByteArray& data)
}
/**
- * Decrypt protected inner stream fields in XML dump on demand.
- * Without the stream key from the KDBX header, the values become worthless.
- *
- * @param xmlOutput XML dump with decrypted fields
- * @param db the database object for which to generate the decrypted XML dump
- */
-void KdbxReader::decryptXmlInnerStream(QByteArray& xmlOutput, Database* db) const
-{
- QBuffer buffer;
- buffer.setBuffer(&xmlOutput);
- buffer.open(QIODevice::WriteOnly);
- KdbxXmlWriter writer(m_kdbxVersion);
- writer.disableInnerStreamProtection(true);
- writer.writeDatabase(&buffer, db);
-}
-
-/**
* Raise an error. Use in case of an unexpected read error.
*
* @param errorMessage error message
diff --git a/src/format/KdbxReader.h b/src/format/KdbxReader.h
index 9a500c3f6..53e9093ac 100644
--- a/src/format/KdbxReader.h
+++ b/src/format/KdbxReader.h
@@ -45,9 +45,6 @@ public:
bool hasError() const;
QString errorString() const;
- bool saveXml() const;
- void setSaveXml(bool save);
- QByteArray xmlData() const;
KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const;
protected:
@@ -86,8 +83,6 @@ protected:
void raiseError(const QString& errorMessage);
- void decryptXmlInnerStream(QByteArray& xmlOutput, Database* db) const;
-
quint32 m_kdbxVersion = 0;
QByteArray m_masterSeed;
@@ -96,13 +91,10 @@ protected:
QByteArray m_protectedStreamKey;
KeePass2::ProtectedStreamAlgo m_irsAlgo = KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo;
- QByteArray m_xmlData;
-
private:
QPair<quint32, quint32> m_kdbxSignature;
QPointer<Database> m_db;
- bool m_saveXml = false;
bool m_error = false;
QString m_errorStr = "";
};
diff --git a/src/format/KdbxWriter.cpp b/src/format/KdbxWriter.cpp
index 6016cf3a6..b69cedbf7 100644
--- a/src/format/KdbxWriter.cpp
+++ b/src/format/KdbxWriter.cpp
@@ -17,6 +17,10 @@
#include "KdbxWriter.h"
+#include <QBuffer>
+
+#include "format/KdbxXmlWriter.h"
+
bool KdbxWriter::hasError() const
{
return m_error;
@@ -62,6 +66,16 @@ bool KdbxWriter::writeData(QIODevice* device, const QByteArray& data)
return true;
}
+void KdbxWriter::extractDatabase(QByteArray& xmlOutput, Database* db)
+{
+ QBuffer buffer;
+ buffer.setBuffer(&xmlOutput);
+ buffer.open(QIODevice::WriteOnly);
+ KdbxXmlWriter writer(formatVersion());
+ writer.disableInnerStreamProtection(true);
+ writer.writeDatabase(&buffer, db);
+}
+
/**
* Raise an error. Use in case of an unexpected write error.
*
diff --git a/src/format/KdbxWriter.h b/src/format/KdbxWriter.h
index 4685797ca..6d759bad2 100644
--- a/src/format/KdbxWriter.h
+++ b/src/format/KdbxWriter.h
@@ -52,6 +52,13 @@ public:
*/
virtual bool writeDatabase(QIODevice* device, Database* db) = 0;
+ /**
+ * Get the database format version for the writer.
+ */
+ virtual quint32 formatVersion() = 0;
+
+ void extractDatabase(QByteArray& xmlOutput, Database* db);
+
bool hasError() const;
QString errorString() const;
diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp
index 97c361abe..1a9c25c8e 100644
--- a/src/format/KeePass2Reader.cpp
+++ b/src/format/KeePass2Reader.cpp
@@ -96,7 +96,6 @@ bool KeePass2Reader::readDatabase(QIODevice* device, QSharedPointer<const Compos
m_reader.reset(new Kdbx4Reader());
}
- m_reader->setSaveXml(m_saveXml);
return m_reader->readDatabase(device, std::move(key), db);
}
@@ -110,16 +109,6 @@ QString KeePass2Reader::errorString() const
return !m_reader.isNull() ? m_reader->errorString() : m_errorStr;
}
-bool KeePass2Reader::saveXml() const
-{
- return m_saveXml;
-}
-
-void KeePass2Reader::setSaveXml(bool save)
-{
- m_saveXml = save;
-}
-
/**
* @return detected KDBX version
*/
diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h
index c6c3b0f2b..0ea94d48c 100644
--- a/src/format/KeePass2Reader.h
+++ b/src/format/KeePass2Reader.h
@@ -41,16 +41,12 @@ public:
bool hasError() const;
QString errorString() const;
- bool saveXml() const;
- void setSaveXml(bool save);
-
QSharedPointer<KdbxReader> reader() const;
quint32 version() const;
private:
void raiseError(const QString& errorMessage);
- bool m_saveXml = false;
bool m_error = false;
QString m_errorStr = "";
diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp
index 0bd247280..494341f5e 100644
--- a/src/format/KeePass2Writer.cpp
+++ b/src/format/KeePass2Writer.cpp
@@ -84,7 +84,6 @@ bool KeePass2Writer::implicitUpgradeNeeded(Database const* db) const
* @param db source database
* @return true on success
*/
-
bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db)
{
m_error = false;
@@ -109,6 +108,22 @@ bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db)
return m_writer->writeDatabase(device, db);
}
+void KeePass2Writer::extractDatabase(Database* db, QByteArray& xmlOutput)
+{
+ m_error = false;
+ m_errorStr.clear();
+
+ if (db->kdf()->uuid() == KeePass2::KDF_AES_KDBX3) {
+ m_version = KeePass2::FILE_VERSION_3_1;
+ m_writer.reset(new Kdbx3Writer());
+ } else {
+ m_version = KeePass2::FILE_VERSION_4;
+ m_writer.reset(new Kdbx4Writer());
+ }
+
+ m_writer->extractDatabase(xmlOutput, db);
+}
+
bool KeePass2Writer::hasError() const
{
return m_error || (m_writer && m_writer->hasError());
diff --git a/src/format/KeePass2Writer.h b/src/format/KeePass2Writer.h
index e5b26eaea..a88054cae 100644
--- a/src/format/KeePass2Writer.h
+++ b/src/format/KeePass2Writer.h
@@ -33,6 +33,7 @@ class KeePass2Writer
public:
bool writeDatabase(const QString& filename, Database* db);
bool writeDatabase(QIODevice* device, Database* db);
+ void extractDatabase(Database* db, QByteArray& xmlOutput);
QSharedPointer<KdbxWriter> writer() const;
quint32 version() const;
diff --git a/src/format/OpData01.cpp b/src/format/OpData01.cpp
new file mode 100644
index 000000000..d373e5814
--- /dev/null
+++ b/src/format/OpData01.cpp
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "OpData01.h"
+
+#include "crypto/CryptoHash.h"
+#include "crypto/SymmetricCipher.h"
+
+#include <QDataStream>
+#include <QDebug>
+
+OpData01::OpData01(QObject* parent)
+ : QObject(parent)
+{
+}
+
+OpData01::~OpData01()
+{
+}
+
+bool OpData01::decodeBase64(QString const& b64String, const QByteArray& key, const QByteArray& hmacKey)
+{
+ const QByteArray b64Bytes = QByteArray::fromBase64(b64String.toUtf8());
+ return decode(b64Bytes, key, hmacKey);
+}
+
+bool OpData01::decode(const QByteArray& data, const QByteArray& key, const QByteArray& hmacKey)
+{
+ /*!
+ * The first 8 bytes of the data are the string “opdata01”.
+ */
+ const QByteArray header("opdata01");
+ if (!data.startsWith(header)) {
+ m_errorStr = tr("Invalid OpData01, does not contain header");
+ return false;
+ }
+
+ QDataStream in(data);
+ in.setByteOrder(QDataStream::LittleEndian);
+ in.skipRawData(header.size());
+
+ /*!
+ * The next 8 bytes contain the length in bytes of the plaintext as a little endian unsigned 64 bit integer.
+ */
+ qlonglong len;
+ in >> len;
+
+ /*!
+ * The next 16 bytes are the randomly chosen initialization vector.
+ */
+ QByteArray iv(16, '\0');
+ int read = in.readRawData(iv.data(), 16);
+ if (read != 16) {
+ m_errorStr = tr("Unable to read all IV bytes, wanted 16 but got %1").arg(iv.size());
+ return false;
+ }
+
+ SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt);
+ if (!cipher.init(key, iv)) {
+ m_errorStr = tr("Unable to init cipher for opdata01: %1").arg(cipher.errorString());
+ return false;
+ }
+
+ /*!
+ * The plaintext is padded using the following scheme.
+ *
+ * If the size of the plaintext is an even multiple of the block size then 1 block of random data is prepended
+ * to the plaintext. Otherwise, between 1 and 15 (inclusive) bytes of random data are prepended to the plaintext
+ * to achieve an even multiple of blocks.
+ */
+ const int blockSize = cipher.blockSize();
+ int randomBytes = blockSize - (len % blockSize);
+ if (randomBytes == 0) {
+ // add random block
+ randomBytes = blockSize;
+ }
+ qlonglong clear_len = len + randomBytes;
+ QByteArray qbaCT(clear_len, '\0');
+ in.readRawData(qbaCT.data(), clear_len);
+
+ /*!
+ * The HMAC-SHA256 is computed over the entirety of the opdata including header, length, IV and ciphertext
+ * using a 256-bit MAC key. The 256-bit MAC is not truncated. It is appended to the ciphertext.
+ */
+ const int hmacLen = 256 / 8;
+ QByteArray hmacSig(hmacLen, '\0'); // 256 / 8, '\0');
+ in.readRawData(hmacSig.data(), hmacLen);
+ if (hmacSig.size() != hmacLen) {
+ m_errorStr = tr("Unable to read all HMAC signature bytes");
+ return false;
+ }
+
+ const QByteArray hmacData = data.mid(0, data.size() - hmacSig.size());
+ const QByteArray actualHmac = CryptoHash::hmac(hmacData, hmacKey, CryptoHash::Algorithm::Sha256);
+ if (actualHmac != hmacSig) {
+ m_errorStr = tr("Malformed OpData01 due to a failed HMAC");
+ return false;
+ }
+
+ if (!cipher.processInPlace(qbaCT)) {
+ m_errorStr = tr("Unable to process clearText in place");
+ return false;
+ }
+
+ // Remove random bytes
+ const QByteArray& clearText = qbaCT.mid(randomBytes);
+ if (clearText.size() != len) {
+ m_errorStr = tr("Expected %1 bytes of clear-text, found %2").arg(len, clearText.size());
+ return false;
+ }
+ m_clearText = clearText;
+ return true;
+}
+
+QByteArray OpData01::getClearText()
+{
+ return m_clearText;
+}
+
+QString OpData01::errorString()
+{
+ return m_errorStr;
+}
diff --git a/src/format/OpData01.h b/src/format/OpData01.h
new file mode 100644
index 000000000..df6a0b442
--- /dev/null
+++ b/src/format/OpData01.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_OPDATA01_H
+#define KEEPASSXC_OPDATA01_H
+
+#include <QObject>
+
+/*!
+ * Packages and transports the AgileBits data structure called \c OpData01
+ * used to encypt and provide HMAC for encrypted data.
+ * \sa https://support.1password.com/opvault-design/#opdata01
+ */
+class OpData01 : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit OpData01(QObject* parent = nullptr);
+ ~OpData01() override;
+
+ /*!
+ * The convenience equivalent of decode01(OpData01,const QByteArray,const QByteArray,const QByteArray) that simply
+ * decodes the provided base64 string into its underlying \c QByteArray.
+ */
+ bool decodeBase64(QString const& b64String, const QByteArray& key, const QByteArray& hmacKey);
+
+ /*!
+ * Populates the given \code OpData01 structure by decoding the provided blob of data,
+ * using the given key and then verifies using the given HMAC key.
+ * \returns true if things went well and \code m_clearText is usable, false and \code m_errorStr will contain
+ * details.
+ */
+ bool decode(const QByteArray& data, const QByteArray& key, const QByteArray& hmacKey);
+
+ QByteArray getClearText();
+
+ QString errorString();
+
+private:
+ QByteArray m_clearText;
+ QString m_errorStr;
+};
+
+#endif // KEEPASSXC_OPDATA01_H
diff --git a/src/format/OpVaultReader.cpp b/src/format/OpVaultReader.cpp
new file mode 100644
index 000000000..49d62b624
--- /dev/null
+++ b/src/format/OpVaultReader.cpp
@@ -0,0 +1,478 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "OpVaultReader.h"
+#include "OpData01.h"
+
+#include "core/Group.h"
+#include "core/Tools.h"
+#include "crypto/CryptoHash.h"
+#include "crypto/SymmetricCipher.h"
+#include "keys/PasswordKey.h"
+
+#include <QDebug>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QUuid>
+#include <gcrypt.h>
+
+OpVaultReader::OpVaultReader(QObject* parent)
+ : QObject(parent)
+ , m_error(false)
+{
+}
+
+OpVaultReader::~OpVaultReader()
+{
+}
+
+Database* OpVaultReader::readDatabase(QDir& opdataDir, const QString& password)
+{
+ if (!opdataDir.exists()) {
+ m_error = true;
+ m_errorStr = tr("Directory .opvault must exist");
+ return nullptr;
+ }
+ if (!opdataDir.isReadable()) {
+ m_error = true;
+ m_errorStr = tr("Directory .opvault must be readable");
+ return nullptr;
+ }
+
+ // https://support.1password.com/opvault-design/#directory-layout
+ QDir defaultDir = QDir(opdataDir);
+ if (!defaultDir.cd("default")) {
+ m_error = true;
+ m_errorStr = tr("Directory .opvault/default must exist");
+ return nullptr;
+ }
+ if (!defaultDir.isReadable()) {
+ m_error = true;
+ m_errorStr = tr("Directory .opvault/default must be readable");
+ return nullptr;
+ }
+
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create(password));
+
+ QScopedPointer<Database> db(new Database());
+ db->setKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2));
+ db->setCipher(KeePass2::CIPHER_AES256);
+ db->setKey(key, true, false);
+ db->metadata()->setName(opdataDir.dirName());
+
+ auto rootGroup = db->rootGroup();
+ rootGroup->setTimeInfo({});
+ rootGroup->setUpdateTimeinfo(false);
+ rootGroup->setName("OPVault Root Group");
+ rootGroup->setUuid(QUuid::createUuid());
+
+ populateCategoryGroups(rootGroup);
+
+ QFile profileJsFile(defaultDir.absoluteFilePath("profile.js"));
+ QJsonObject profileJson = readAndAssertJsonFile(profileJsFile, "var profile=", ";");
+ if (profileJson.isEmpty()) {
+ return nullptr;
+ }
+ if (!processProfileJson(profileJson, password, rootGroup)) {
+ zeroKeys();
+ return nullptr;
+ }
+ if (profileJson.contains("uuid") and profileJson["uuid"].isString()) {
+ rootGroup->setUuid(Tools::hexToUuid(profileJson["uuid"].toString()));
+ }
+
+ QFile foldersJsFile(defaultDir.filePath("folders.js"));
+ if (foldersJsFile.exists()) {
+ QJsonObject foldersJs = readAndAssertJsonFile(foldersJsFile, "loadFolders(", ");");
+ if (!processFolderJson(foldersJs, rootGroup)) {
+ zeroKeys();
+ return nullptr;
+ }
+ }
+
+ const QString bandChars("0123456789ABCDEF");
+ QString bandPattern("band_%1.js");
+ for (QChar ch : bandChars) {
+ QFile bandFile(defaultDir.filePath(bandPattern.arg(ch)));
+ if (!bandFile.exists()) {
+ qWarning() << "Skipping missing file \"" << bandFile.fileName() << "\"";
+ continue;
+ }
+ // https://support.1password.com/opvault-design/#band-files
+ QJsonObject bandJs = readAndAssertJsonFile(bandFile, "ld(", ");");
+ const QStringList keys = bandJs.keys();
+ for (const QString& entryKey : keys) {
+ const QJsonObject bandEnt = bandJs[entryKey].toObject();
+ const QString uuid = bandEnt["uuid"].toString();
+ if (entryKey != uuid) {
+ qWarning() << QString("Mismatched Entry UUID, its JSON key <<%1>> and its UUID <<%2>>")
+ .arg(entryKey)
+ .arg(uuid);
+ }
+ QStringList requiredKeys({"d", "k", "hmac"});
+ bool ok = true;
+ for (const QString& requiredKey : asConst(requiredKeys)) {
+ if (!bandEnt.contains(requiredKey)) {
+ qCritical() << "Skipping malformed Entry UUID " << uuid << " without key " << requiredKey;
+ ok = false;
+ break;
+ }
+ }
+ if (!ok) {
+ continue;
+ }
+ // https://support.1password.com/opvault-design/#items
+ Entry* entry = processBandEntry(bandEnt, defaultDir, rootGroup);
+ if (!entry) {
+ qWarning() << "Unable to process Band Entry " << uuid;
+ }
+ }
+ }
+
+ zeroKeys();
+ return db.take();
+}
+
+bool OpVaultReader::hasError()
+{
+ return m_error;
+}
+
+QString OpVaultReader::errorString()
+{
+ return m_errorStr;
+}
+
+bool OpVaultReader::processProfileJson(QJsonObject& profileJson, const QString& password, Group* rootGroup)
+{
+ unsigned long iterations = profileJson["iterations"].toInt();
+ // QString lastUpdatedBy = profileJson["lastUpdatedBy"].toString();
+ QString masterKeyB64 = profileJson["masterKey"].toString();
+ QString overviewKeyB64 = profileJson["overviewKey"].toString();
+ // QString profileName = profileJs["profileName"].toString();
+ QByteArray salt;
+ {
+ QString saltB64 = profileJson["salt"].toString();
+ salt = QByteArray::fromBase64(saltB64.toUtf8());
+ }
+ auto rootGroupTime = rootGroup->timeInfo();
+ auto createdAt = static_cast<uint>(profileJson["createdAt"].toInt());
+ rootGroupTime.setCreationTime(QDateTime::fromTime_t(createdAt, Qt::UTC));
+ auto updatedAt = static_cast<uint>(profileJson["updatedAt"].toInt());
+ rootGroupTime.setLastModificationTime(QDateTime::fromTime_t(updatedAt, Qt::UTC));
+ rootGroup->setUuid(Tools::hexToUuid(profileJson["uuid"].toString()));
+
+ const auto derivedKeys = deriveKeysFromPassPhrase(salt, password, iterations);
+ if (derivedKeys->error) {
+ m_error = true;
+ m_errorStr = derivedKeys->errorStr;
+ delete derivedKeys;
+ return false;
+ }
+
+ QByteArray encKey = derivedKeys->encrypt;
+ QByteArray hmacKey = derivedKeys->hmac;
+ delete derivedKeys;
+
+ auto masterKeys = decodeB64CompositeKeys(masterKeyB64, encKey, hmacKey);
+ if (masterKeys->error) {
+ m_error = true;
+ m_errorStr = masterKeys->errorStr;
+ delete masterKeys;
+ return false;
+ }
+ m_masterKey = masterKeys->encrypt;
+ m_masterHmacKey = masterKeys->hmac;
+ delete masterKeys;
+ auto overviewKeys = decodeB64CompositeKeys(overviewKeyB64, encKey, hmacKey);
+ if (overviewKeys->error) {
+ m_error = true;
+ m_errorStr = overviewKeys->errorStr;
+ delete overviewKeys;
+ return false;
+ }
+ m_overviewKey = overviewKeys->encrypt;
+ m_overviewHmacKey = overviewKeys->hmac;
+ delete overviewKeys;
+
+ return true;
+}
+
+bool OpVaultReader::processFolderJson(QJsonObject& foldersJson, Group* rootGroup)
+{
+ const QStringList keys = foldersJson.keys();
+
+ bool result = true;
+ for (const QString& key : keys) {
+ const QJsonValueRef& folderValue = foldersJson[key];
+ if (!folderValue.isObject()) {
+ qWarning() << "Found non-Object folder with key \"" << key << "\"";
+ continue;
+ }
+ const QJsonObject folder = folderValue.toObject();
+ QJsonObject overviewJs;
+ const QString overviewStr = folder.value("overview").toString();
+ OpData01 foldOverview01;
+ if (!foldOverview01.decodeBase64(overviewStr, m_overviewKey, m_overviewHmacKey)) {
+ qCritical() << "Unable to decipher folder UUID \"" << key << "\": " << foldOverview01.errorString();
+ result = false;
+ continue;
+ }
+ auto foldOverview = foldOverview01.getClearText();
+ QJsonDocument fOverJSON = QJsonDocument::fromJson(foldOverview);
+ overviewJs = fOverJSON.object();
+
+ const QString& folderTitle = overviewJs["title"].toString();
+ auto myGroup = new Group();
+ myGroup->setParent(rootGroup);
+ myGroup->setName(folderTitle);
+ if (folder.contains("uuid")) {
+ myGroup->setUuid(Tools::hexToUuid(folder["uuid"].toString()));
+ }
+
+ if (overviewJs.contains("smart") && overviewJs["smart"].toBool()) {
+ if (!overviewJs.contains("predicate_b64")) {
+ const QString& errMsg =
+ QString(R"(Expected a predicate in smart folder[uuid="%1"; title="%2"]))").arg(key, folderTitle);
+ qWarning() << errMsg;
+ myGroup->setNotes(errMsg);
+ } else {
+ QByteArray pB64 = QByteArray::fromBase64(overviewJs["predicate_b64"].toString().toUtf8());
+ myGroup->setNotes(pB64.toHex());
+ }
+ }
+
+ TimeInfo ti;
+ bool timeInfoOk = false;
+ if (folder.contains("created")) {
+ auto createdTime = static_cast<uint>(folder["created"].toInt());
+ ti.setCreationTime(QDateTime::fromTime_t(createdTime, Qt::UTC));
+ timeInfoOk = true;
+ }
+ if (folder.contains("updated")) {
+ auto updateTime = static_cast<uint>(folder["updated"].toInt());
+ ti.setLastModificationTime(QDateTime::fromTime_t(updateTime, Qt::UTC));
+ timeInfoOk = true;
+ }
+ // "tx" is modified by sync, not by user; maybe a custom attribute?
+ if (timeInfoOk) {
+ myGroup->setTimeInfo(ti);
+ }
+ }
+ return result;
+}
+
+/*
+ * Asserts that the given file is an existing file, able to be read, contains JSON, and that
+ * the payload is a JSON object. Currently it just returns an empty QJsonObject as a means of
+ * indicating the error, although it will qCritical() if unable to actually open the file for reading.
+ *
+ * @param file the path containing the JSON file
+ * @param stripLeading any leading characters that might be present in file which should be removed
+ * @param stripTrailing the trailing characters that might be present in file which should be removed
+ * @return
+ */
+QJsonObject OpVaultReader::readAndAssertJsonFile(QFile& file, const QString& stripLeading, const QString& stripTrailing)
+{
+ QByteArray filePayload;
+ const QFileInfo& fileInfo = QFileInfo(file);
+ auto absFilePath = fileInfo.absoluteFilePath();
+ if (!fileInfo.exists()) {
+ qCritical() << QString("File \"%1\" must exist").arg(absFilePath);
+ return QJsonObject();
+ }
+ if (!fileInfo.isReadable()) {
+ qCritical() << QString("File \"%1\" must be readable").arg(absFilePath);
+ return QJsonObject();
+ }
+
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ qCritical() << QString("Unable to open \"%1\" readonly+text").arg(absFilePath);
+ }
+ filePayload = file.readAll();
+ file.close();
+ if (!stripLeading.isEmpty()) {
+ QByteArray prefix = stripLeading.toUtf8();
+ if (filePayload.startsWith(prefix)) {
+ filePayload = filePayload.remove(0, prefix.size());
+ }
+ }
+ if (!stripTrailing.isEmpty()) {
+ QByteArray suffix = stripTrailing.toUtf8();
+ if (filePayload.endsWith(suffix)) {
+ const int delBytes = suffix.size();
+ filePayload = filePayload.remove(filePayload.length() - delBytes, delBytes);
+ }
+ }
+
+ QJsonParseError* error = Q_NULLPTR;
+ QJsonDocument jDoc = QJsonDocument::fromJson(filePayload, error);
+ if (!jDoc.isObject()) {
+ qCritical() << "Expected " << filePayload << "to be a JSON Object";
+ return QJsonObject();
+ }
+ return jDoc.object();
+}
+
+/* Convenience method for calling decodeCompositeKeys when you have a base64 encrypted composite key. */
+OpVaultReader::DerivedKeyHMAC*
+OpVaultReader::decodeB64CompositeKeys(const QString& b64, const QByteArray& encKey, const QByteArray& hmacKey)
+{
+ auto result = new DerivedKeyHMAC();
+
+ OpData01 keyKey01;
+ if (!keyKey01.decodeBase64(b64, encKey, hmacKey)) {
+ result->error = true;
+ result->errorStr = tr("Unable to decode masterKey: %1").arg(keyKey01.errorString());
+ return result;
+ }
+ const QByteArray keyKey = keyKey01.getClearText();
+
+ return decodeCompositeKeys(keyKey);
+}
+
+/*
+ * Given a string of bytes, decompose it into its constituent parts, an encryption key and a HMAC key.
+ * The plaintext of the masterKey is 256 bytes of data selected randomly when the keychain was first created.
+ *
+ * The 256 byte (2048 bit) plaintext content of the masterKey is then hashed with SHA-512.
+ * The first 32 bytes (256-bits) of the resulting hash are the master encryption key,
+ * and the second 32 bytes are the master hmac key.
+ */
+OpVaultReader::DerivedKeyHMAC* OpVaultReader::decodeCompositeKeys(const QByteArray& keyKey)
+{
+ const int encKeySize = 256 / 8;
+ const int hmacKeySize = 256 / 8;
+ const int digestSize = encKeySize + hmacKeySize;
+
+ auto result = new DerivedKeyHMAC;
+ result->error = false;
+
+ result->encrypt = QByteArray(encKeySize, '\0');
+ result->hmac = QByteArray(hmacKeySize, '\0');
+
+ const char* buffer_vp = keyKey.data();
+ auto buf_len = size_t(keyKey.size());
+
+ const int algo = GCRY_MD_SHA512;
+ unsigned char digest[digestSize];
+ gcry_md_hash_buffer(algo, digest, buffer_vp, buf_len);
+
+ unsigned char* cp = digest;
+ for (int i = 0, len = encKeySize; i < len; ++i) {
+ result->encrypt[i] = *(cp++);
+ }
+ for (int i = 0, len = hmacKeySize; i < len; ++i) {
+ result->hmac[i] = *(cp++);
+ }
+
+ return result;
+}
+
+/*
+ * Translates the provided salt and passphrase into a derived set of keys, one for encryption
+ * and one for use as a HMAC key. See https://support.1password.com/opvault-design/#key-derivation
+ * @param iterations the number of rounds to apply the derivation formula
+ * @return a non-null structure containing either the error or the two password-derived keys
+ */
+OpVaultReader::DerivedKeyHMAC*
+OpVaultReader::deriveKeysFromPassPhrase(QByteArray& salt, const QString& password, unsigned long iterations)
+{
+ const int derivedEncKeySize = 256 / 8;
+ const int derivedMACSize = 256 / 8;
+ const int keysize = derivedEncKeySize + derivedMACSize;
+
+ auto result = new DerivedKeyHMAC;
+ result->error = false;
+
+ QByteArray keybuffer(keysize, '\0');
+ auto err = gcry_kdf_derive(password.toUtf8().constData(),
+ password.size(),
+ GCRY_KDF_PBKDF2,
+ GCRY_MD_SHA512,
+ salt.constData(),
+ salt.size(),
+ iterations,
+ keysize,
+ keybuffer.data());
+ if (err != 0) {
+ result->error = true;
+ result->errorStr = tr("Unable to derive master key: %1").arg(gcry_strerror(err));
+ return result;
+ }
+ if (keysize != keybuffer.size()) {
+ qWarning() << "Calling PBKDF2(keysize=" << keysize << "yielded" << keybuffer.size() << "bytes";
+ }
+
+ QByteArray::const_iterator it = keybuffer.cbegin();
+
+ result->encrypt = QByteArray(derivedEncKeySize, '\0');
+ for (int i = 0, len = derivedEncKeySize; i < len && it != keybuffer.cend(); ++i, ++it) {
+ result->encrypt[i] = *it;
+ }
+
+ result->hmac = QByteArray(derivedMACSize, '\0');
+ for (int i = 0; i < derivedMACSize && it != keybuffer.cend(); ++i, ++it) {
+ result->hmac[i] = *it;
+ }
+ return result;
+}
+
+/*!
+ * \sa https://support.1password.com/opvault-design/#category
+ */
+void OpVaultReader::populateCategoryGroups(Group* rootGroup)
+{
+ QMap<QString, QString> categoryMap;
+ categoryMap.insert("001", "Login");
+ categoryMap.insert("002", "Credit Card");
+ categoryMap.insert("003", "Secure Note");
+ categoryMap.insert("004", "Identity");
+ categoryMap.insert("005", "Password");
+ categoryMap.insert("099", "Tombstone");
+ categoryMap.insert("100", "Software License");
+ categoryMap.insert("101", "Bank Account");
+ categoryMap.insert("102", "Database");
+ categoryMap.insert("103", "Driver License");
+ categoryMap.insert("104", "Outdoor License");
+ categoryMap.insert("105", "Membership");
+ categoryMap.insert("106", "Passport");
+ categoryMap.insert("107", "Rewards");
+ categoryMap.insert("108", "SSN");
+ categoryMap.insert("109", "Router");
+ categoryMap.insert("110", "Server");
+ categoryMap.insert("111", "Email");
+ for (const QString& catNum : categoryMap.keys()) {
+ const QString& category = categoryMap[catNum];
+ auto g = new Group();
+ g->setName(category);
+ g->setProperty("code", catNum);
+ g->setUpdateTimeinfo(false);
+ // maybe make these stable, so folks can depend on them?
+ g->setUuid(QUuid::createUuid());
+ g->setParent(rootGroup);
+ }
+}
+
+void OpVaultReader::zeroKeys()
+{
+ m_masterKey.fill('\0');
+ m_masterHmacKey.fill('\0');
+ m_overviewKey.fill('\0');
+ m_overviewHmacKey.fill('\0');
+}
diff --git a/src/format/OpVaultReader.h b/src/format/OpVaultReader.h
new file mode 100644
index 000000000..585415854
--- /dev/null
+++ b/src/format/OpVaultReader.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 OPVAULT_READER_H_
+#define OPVAULT_READER_H_
+
+#include <QDir>
+
+#include "core/Database.h"
+#include "core/Metadata.h"
+
+/*!
+ * Imports a directory in the 1Password \c opvault format into a \c Database.
+ * \sa https://support.1password.com/opvault-overview/
+ * \sa https://support.1password.com/opvault-design/
+ * \sa https://cache.agilebits.com/security-kb/freddy-2013-12-04.tar.gz is the sample data used to test this class,
+ * and its password is \c freddy
+ */
+class OpVaultReader : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit OpVaultReader(QObject* parent = nullptr);
+ ~OpVaultReader() override;
+
+ Database* readDatabase(QDir& opdataDir, const QString& password);
+
+ bool hasError();
+ QString errorString();
+
+private:
+ struct DerivedKeyHMAC
+ {
+ QByteArray encrypt;
+ QByteArray hmac;
+ bool error;
+ QString errorStr;
+ };
+
+ QJsonObject readAndAssertJsonFile(QFile& file, const QString& stripLeading, const QString& stripTrailing);
+
+ DerivedKeyHMAC* deriveKeysFromPassPhrase(QByteArray& salt, const QString& password, unsigned long iterations);
+ DerivedKeyHMAC* decodeB64CompositeKeys(const QString& b64, const QByteArray& encKey, const QByteArray& hmacKey);
+ DerivedKeyHMAC* decodeCompositeKeys(const QByteArray& keyKey);
+
+ /*!
+ * \sa https://support.1password.com/opvault-design/#profile-js
+ * @param profileJson the contents of \c profile.js
+ * @return \c true if the profile data was decrypted successfully, \c false otherwise
+ */
+ bool processProfileJson(QJsonObject& profileJson, const QString& password, Group* rootGroup);
+
+ /*!
+ * \sa https://support.1password.com/opvault-design/#folders-js
+ * @param foldersJson the map from a folder UUID to its data (name and any smart query)
+ * @return \c true if the folder data was decrypted successfully, \c false otherwise
+ */
+ bool processFolderJson(QJsonObject& foldersJson, Group* rootGroup);
+
+ /*!
+ * Decrypts the provided band object into its interior structure,
+ * as well as the encryption key and HMAC key declared therein,
+ * which are used to decrypt the attachments, also.
+ * @returns \c nullptr if unable to do the decryption, otherwise the interior object and its keys
+ */
+ bool decryptBandEntry(const QJsonObject& bandEntry, QJsonObject& data, QByteArray& key, QByteArray& hmacKey);
+ Entry* processBandEntry(const QJsonObject& bandEntry, const QDir& attachmentDir, Group* rootGroup);
+
+ bool readAttachment(const QString& filePath,
+ const QByteArray& itemKey,
+ const QByteArray& itemHmacKey,
+ QJsonObject& metadata,
+ QByteArray& payload);
+ void fillAttachment(Entry* entry,
+ const QFileInfo& attachmentFileInfo,
+ const QByteArray& entryKey,
+ const QByteArray& entryHmacKey);
+ void fillAttachments(Entry* entry,
+ const QDir& attachmentDir,
+ const QByteArray& entryKey,
+ const QByteArray& entryHmacKey);
+
+ bool fillAttributes(Entry* entry, const QJsonObject& bandEntry);
+
+ void fillFromSection(Entry* entry, const QJsonObject& section);
+ void fillFromSectionField(Entry* entry, const QString& sectionName, QJsonObject& field);
+ QString resolveAttributeName(const QString& section, const QString& name, const QString& text);
+
+ void populateCategoryGroups(Group* rootGroup);
+ /*! Used to blank the memory after the keys have been used. */
+ void zeroKeys();
+
+ bool m_error;
+ QString m_errorStr;
+ QByteArray m_masterKey;
+ QByteArray m_masterHmacKey;
+ /*! Used to decrypt overview text, such as folder names. */
+ QByteArray m_overviewKey;
+ QByteArray m_overviewHmacKey;
+
+ friend class TestOpVaultReader;
+};
+
+#endif /* OPVAULT_READER_H_ */
diff --git a/src/format/OpVaultReaderAttachments.cpp b/src/format/OpVaultReaderAttachments.cpp
new file mode 100644
index 000000000..49367e306
--- /dev/null
+++ b/src/format/OpVaultReaderAttachments.cpp
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "OpData01.h"
+#include "OpVaultReader.h"
+
+#include "core/Group.h"
+#include "core/Tools.h"
+
+#include <QDebug>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QUuid>
+
+/*!
+ * This will \c qCritical() if unable to open the file for reading.
+ * @param file the \c .attachment file to decode
+ * @return \c nullptr if unable to take action, else a pair of metadata and the actual attachment bits
+ * \sa https://support.1password.com/opvault-design/#attachments
+ */
+bool OpVaultReader::readAttachment(const QString& filePath,
+ const QByteArray& itemKey,
+ const QByteArray& itemHmacKey,
+ QJsonObject& metadata,
+ QByteArray& payload)
+{
+ QFile file(filePath);
+ if (!file.open(QIODevice::ReadOnly)) {
+ qCritical() << QString("Unable to open \"%s\" for reading").arg(file.fileName());
+ return false;
+ }
+
+ QString magic("OPCLDAT");
+ QByteArray magicBytes = file.read(7);
+ if (magicBytes != magic.toUtf8()) {
+ qCritical() << "Expected OPCLDAT but found <<" << magicBytes.toHex() << ">>";
+ return false;
+ }
+
+ QByteArray version = file.read(1);
+ if (version[0] != '\001' && version[0] != '\002') {
+ qCritical() << "Unexpected version number; wanted 1 or 2, got <<" << version << ">>";
+ return false;
+ }
+ const QByteArray& metadataLenBytes = file.read(2);
+ if (metadataLenBytes.size() != 2) {
+ qCritical() << "Unable to read all metadata length bytes; wanted 2 bytes, got " << metadataLenBytes.size()
+ << ": <<" << metadataLenBytes.toHex() << ">>";
+ return false;
+ }
+ const auto b0 = static_cast<unsigned char>(metadataLenBytes[0]);
+ const auto b1 = static_cast<unsigned char>(metadataLenBytes[1]);
+ int metadataLen = ((0xFF & b1) << 8) | (0xFF & b0);
+
+ // no really: it's labeled "Junk" in the spec
+ int junkBytesRead = file.read(2).size();
+ if (junkBytesRead != 2) {
+ qCritical() << "Unable to read all \"junk\" bytes; wanted 2 bytes, got " << junkBytesRead;
+ return false;
+ }
+
+ const QByteArray& iconLenBytes = file.read(4);
+ if (iconLenBytes.size() != 4) {
+ qCritical() << "Unable to read all \"iconLen\" bytes; wanted 4 bytes, got " << iconLenBytes.size();
+ return false;
+ }
+
+ int iconLen = 0;
+ for (int i = 0, len = iconLenBytes.size(); i < len; ++i) {
+ char ch = iconLenBytes[i];
+ auto b = static_cast<unsigned char>(ch & 0xFF);
+ iconLen = (b << (i * 8)) | iconLen;
+ }
+
+ QByteArray metadataJsonBytes = file.read(metadataLen);
+ if (metadataJsonBytes.size() != metadataLen) {
+ qCritical() << "Unable to read all bytes of metadata JSON; wanted " << metadataLen << "but read "
+ << metadataJsonBytes.size();
+ return false;
+ }
+ QByteArray iconBytes = file.read(iconLen);
+ if (iconBytes.size() != iconLen) {
+ qCritical() << "Unable to read all icon bytes; wanted " << iconLen << "but read " << iconBytes.size();
+ // apologies for the icon being fatal, but it would take some gear-turning
+ // to re-sync where in the attach header we are
+ return false;
+ }
+
+ // we don't actually _care_ what the icon bytes are,
+ // but they damn well better be valid opdata01 and pass its HMAC
+ OpData01 icon01;
+ if (!icon01.decode(iconBytes, itemKey, itemHmacKey)) {
+ qCritical() << "Unable to decipher attachment icon in " << filePath << ": " << icon01.errorString();
+ return false;
+ }
+
+ QJsonParseError jsError;
+ QJsonDocument jDoc = QJsonDocument::fromJson(metadataJsonBytes, &jsError);
+ if (jsError.error != QJsonParseError::ParseError::NoError) {
+ qCritical() << "Found invalid attachment metadata JSON at offset " << jsError.offset << ": error("
+ << jsError.error << "): " << jsError.errorString() << "\n<<" << metadataJsonBytes << ">>";
+ return false;
+ }
+ if (!jDoc.isObject()) {
+ qCritical() << "Expected " << metadataJsonBytes << "to be a JSON Object";
+ return false;
+ }
+
+ metadata = jDoc.object();
+ if (metadata.contains("trashed") && metadata["trashed"].toBool()) {
+ return false;
+ }
+
+ if (!metadata.contains("contentsSize")) {
+ qWarning() << "Expected attachment metadata to contain \"contentsSize\" but nope: " << metadata;
+ return false;
+ } else if (!metadata["contentsSize"].isDouble()) {
+ qWarning() << "Expected attachment metadata to contain numeric \"contentsSize\" but nope: " << metadata;
+ return false;
+ }
+ int bytesLen = metadata["contentsSize"].toInt();
+ const QByteArray encData = file.readAll();
+ if (encData.size() < bytesLen) {
+ qCritical() << "Unable to read all of the attachment payload; wanted " << bytesLen << "but got"
+ << encData.size();
+ return false;
+ }
+
+ OpData01 att01;
+ if (!att01.decode(encData, itemKey, itemHmacKey)) {
+ qCritical() << "Unable to decipher attachment payload: " << att01.errorString();
+ return false;
+ }
+
+ payload = att01.getClearText();
+ return true;
+}
+
+/*!
+ * \sa https://support.1password.com/opvault-design/#attachments
+ */
+void OpVaultReader::fillAttachments(Entry* entry,
+ const QDir& attachmentDir,
+ const QByteArray& entryKey,
+ const QByteArray& entryHmacKey)
+{
+ /*!
+ * Attachment files are named with the UUID of the item that they are attached to followed by an underscore
+ * and then followed by the UUID of the attachment itself. The file is then given the extension .attachment.
+ */
+ auto fileFilter = QString("%1_*.attachment").arg(entry->uuidToHex().toUpper());
+ const auto& attachInfoList = attachmentDir.entryInfoList(QStringList() << fileFilter, QDir::Files);
+ int attachmentCount = attachInfoList.size();
+ if (attachmentCount == 0) {
+ return;
+ }
+
+ for (const auto& info : attachInfoList) {
+ if (!info.isReadable()) {
+ qCritical() << QString("Attachment file \"%1\" is not readable").arg(info.absoluteFilePath());
+ continue;
+ }
+ fillAttachment(entry, info, entryKey, entryHmacKey);
+ }
+}
+
+void OpVaultReader::fillAttachment(Entry* entry,
+ const QFileInfo& info,
+ const QByteArray& entryKey,
+ const QByteArray& entryHmacKey)
+{
+ QJsonObject attachMetadata;
+ QByteArray attachPayload;
+ if (!readAttachment(info.absoluteFilePath(), entryKey, entryHmacKey, attachMetadata, attachPayload)) {
+ return;
+ }
+
+ if (!attachMetadata.contains("overview")) {
+ qWarning() << "Expected \"overview\" in attachment metadata";
+ return;
+ }
+
+ const QString& overB64 = attachMetadata["overview"].toString();
+ OpData01 over01;
+
+ if (over01.decodeBase64(overB64, m_overviewKey, m_overviewHmacKey)) {
+ QByteArray overviewJson = over01.getClearText();
+ QJsonDocument overDoc = QJsonDocument::fromJson(overviewJson);
+ if (overDoc.isObject()) {
+ QJsonObject overObj = overDoc.object();
+ attachMetadata.remove("overview");
+ for (QString& key : overObj.keys()) {
+ const QJsonValueRef& value = overObj[key];
+ QString insertAs = key;
+ for (int aa = 0; attachMetadata.contains(insertAs) && aa < 5; ++aa) {
+ insertAs = QString("%1_%2").arg(key, aa);
+ }
+ attachMetadata[insertAs] = value;
+ }
+ } else {
+ qWarning() << "Expected JSON Object in \"overview\" but nope: " << overDoc;
+ }
+ } else {
+ qCritical()
+ << QString("Unable to decode attach.overview for \"%1\": %2").arg(info.fileName(), over01.errorString());
+ }
+
+ QByteArray payload;
+ payload.append(QString("attachment file is actually %1 bytes\n").arg(info.size()).toUtf8());
+ for (QString& key : attachMetadata.keys()) {
+ const QJsonValueRef& value = attachMetadata[key];
+ QByteArray valueBytes;
+ if (value.isString()) {
+ valueBytes = value.toString().toUtf8();
+ } else if (value.isDouble()) {
+ valueBytes = QString("%1").arg(value.toInt()).toUtf8();
+ } else if (value.isBool()) {
+ valueBytes = value.toBool() ? "true" : "false";
+ } else {
+ valueBytes = QString("Unexpected metadata type in attachment: %1").arg(value.type()).toUtf8();
+ }
+ payload.append(key.toUtf8()).append(":=").append(valueBytes).append("\n");
+ }
+
+ QString attachKey = info.baseName();
+ if (attachMetadata.contains("filename")) {
+ QJsonValueRef attFilename = attachMetadata["filename"];
+ if (attFilename.isString()) {
+ attachKey = attFilename.toString();
+ } else {
+ qWarning() << QString("Unexpected type of attachment \"filename\": %1").arg(attFilename.type());
+ }
+ }
+
+ entry->attachments()->set(attachKey, attachPayload);
+}
diff --git a/src/format/OpVaultReaderBandEntry.cpp b/src/format/OpVaultReaderBandEntry.cpp
new file mode 100644
index 000000000..22af783d5
--- /dev/null
+++ b/src/format/OpVaultReaderBandEntry.cpp
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "OpData01.h"
+#include "OpVaultReader.h"
+
+#include "core/Group.h"
+#include "core/Tools.h"
+#include "crypto/CryptoHash.h"
+#include "crypto/SymmetricCipher.h"
+
+#include <QDebug>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QUuid>
+
+bool OpVaultReader::decryptBandEntry(const QJsonObject& bandEntry,
+ QJsonObject& data,
+ QByteArray& key,
+ QByteArray& hmacKey)
+{
+ if (!bandEntry.contains("d")) {
+ qWarning() << "Band entries must contain a \"d\" key: " << bandEntry.keys();
+ return false;
+ }
+ if (!bandEntry.contains("k")) {
+ qWarning() << "Band entries must contain a \"k\" key: " << bandEntry.keys();
+ return false;
+ }
+
+ const QString uuid = bandEntry.value("uuid").toString();
+
+ /*!
+ * This is the encrypted item and MAC keys.
+ * It is encrypted with the master encryption key and authenticated with the master MAC key.
+ *
+ * The last 32 bytes comprise the HMAC-SHA256 of the IV and the encrypted data.
+ * The MAC is computed with the master MAC key.
+ * The data before the MAC is the AES-CBC encrypted item keys using unique random 16-byte IV.
+ * \code
+ * uint8_t crypto_key[32];
+ * uint8_t mac_key[32];
+ * \endcode
+ * \sa https://support.1password.com/opvault-design/#k
+ */
+ const QString& entKStr = bandEntry["k"].toString();
+ QByteArray kBA = QByteArray::fromBase64(entKStr.toUtf8());
+ const int wantKsize = 16 + 32 + 32 + 32;
+ if (kBA.size() != wantKsize) {
+ qCritical("Malformed \"k\" size; expected %d got %d\n", wantKsize, kBA.size());
+ return false;
+ }
+
+ QByteArray hmacSig = kBA.mid(kBA.size() - 32, 32);
+ const QByteArray& realHmacSig =
+ CryptoHash::hmac(kBA.mid(0, kBA.size() - hmacSig.size()), m_masterHmacKey, CryptoHash::Sha256);
+ if (realHmacSig != hmacSig) {
+ qCritical() << QString(R"(Entry "k" failed its HMAC in UUID "%1", wanted "%2" got "%3")")
+ .arg(uuid)
+ .arg(QString::fromUtf8(hmacSig.toHex()))
+ .arg(QString::fromUtf8(realHmacSig));
+ return false;
+ }
+
+ QByteArray iv = kBA.mid(0, 16);
+ QByteArray keyAndMacKey = kBA.mid(iv.size(), 64);
+ SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt);
+ if (!cipher.init(m_masterKey, iv)) {
+ qCritical() << "Unable to init cipher using masterKey in UUID " << uuid;
+ return false;
+ }
+ if (!cipher.processInPlace(keyAndMacKey)) {
+ qCritical() << "Unable to decipher \"k\"(key+hmac) in UUID " << uuid;
+ return false;
+ }
+
+ key = keyAndMacKey.mid(0, 32);
+ hmacKey = keyAndMacKey.mid(32);
+
+ QString dKeyB64 = bandEntry.value("d").toString();
+ OpData01 entD01;
+ if (!entD01.decodeBase64(dKeyB64, key, hmacKey)) {
+ qCritical() << R"(Unable to decipher "d" in UUID ")" << uuid << "\": " << entD01.errorString();
+ return false;
+ }
+
+ auto clearText = entD01.getClearText();
+ data = QJsonDocument::fromJson(clearText).object();
+ return true;
+}
+
+Entry* OpVaultReader::processBandEntry(const QJsonObject& bandEntry, const QDir& attachmentDir, Group* rootGroup)
+{
+ const QString uuid = bandEntry.value("uuid").toString();
+ if (!(uuid.size() == 32 || uuid.size() == 36)) {
+ qWarning() << QString("Skipping suspicious band UUID <<%1>> with length %2").arg(uuid).arg(uuid.size());
+ return nullptr;
+ }
+
+ const auto entry = new Entry();
+
+ if (bandEntry.contains("category")) {
+ const QJsonValue& categoryValue = bandEntry["category"];
+ if (categoryValue.isString()) {
+ bool found = false;
+ const QString category = categoryValue.toString();
+ for (Group* group : rootGroup->children()) {
+ const QVariant& groupCode = group->property("code");
+ if (category == groupCode.toString()) {
+ entry->setGroup(group);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ qWarning() << QString("Unable to place Entry.Category \"%1\" so using the Root instead").arg(category);
+ entry->setGroup(rootGroup);
+ }
+ } else {
+ qWarning() << QString(R"(Skipping non-String Category type "%1" in UUID "%2")")
+ .arg(categoryValue.type())
+ .arg(uuid);
+ entry->setGroup(rootGroup);
+ }
+ } else {
+ qWarning() << "Using the root group because the entry is category-less: <<\n"
+ << bandEntry << "\n>> in UUID " << uuid;
+ entry->setGroup(rootGroup);
+ }
+
+ entry->setUpdateTimeinfo(false);
+ TimeInfo ti;
+ bool timeInfoOk = false;
+ if (bandEntry.contains("created")) {
+ auto createdTime = static_cast<uint>(bandEntry["created"].toInt());
+ ti.setCreationTime(QDateTime::fromTime_t(createdTime, Qt::UTC));
+ timeInfoOk = true;
+ }
+ if (bandEntry.contains("updated")) {
+ auto updateTime = static_cast<uint>(bandEntry["updated"].toInt());
+ ti.setLastModificationTime(QDateTime::fromTime_t(updateTime, Qt::UTC));
+ timeInfoOk = true;
+ }
+ // "tx" is modified by sync, not by user; maybe a custom attribute?
+ if (timeInfoOk) {
+ entry->setTimeInfo(ti);
+ }
+ entry->setUuid(Tools::hexToUuid(uuid));
+
+ if (!fillAttributes(entry, bandEntry)) {
+ delete entry;
+ return nullptr;
+ }
+
+ QJsonObject data;
+ QByteArray entryKey;
+ QByteArray entryHmacKey;
+
+ if (!decryptBandEntry(bandEntry, data, entryKey, entryHmacKey)) {
+ return nullptr;
+ }
+
+ if (data.contains("notesPlain")) {
+ entry->setNotes(data.value("notesPlain").toString());
+ }
+
+ // it seems sometimes the password is a top-level field, and not in "fields" themselves
+ if (data.contains("password")) {
+ entry->setPassword(data.value("password").toString());
+ }
+
+ for (const auto& fieldValue : data.value("fields").toArray()) {
+ if (!fieldValue.isObject()) {
+ continue;
+ }
+
+ auto field = fieldValue.toObject();
+ auto designation = field["designation"].toString();
+ auto value = field["value"].toString();
+ if (designation == "password") {
+ entry->setPassword(value);
+ } else if (designation == "username") {
+ entry->setUsername(value);
+ }
+ }
+
+ const QJsonArray& sectionsArray = data["sections"].toArray();
+ for (const QJsonValue& sectionValue : sectionsArray) {
+ if (!sectionValue.isObject()) {
+ qWarning() << R"(Skipping non-Object in "sections" for UUID ")" << uuid << "\" << " << sectionsArray
+ << ">>";
+ continue;
+ }
+ const QJsonObject& section = sectionValue.toObject();
+
+ fillFromSection(entry, section);
+ }
+
+ fillAttachments(entry, attachmentDir, entryKey, entryHmacKey);
+ return entry;
+}
+
+bool OpVaultReader::fillAttributes(Entry* entry, const QJsonObject& bandEntry)
+{
+ const QString overviewStr = bandEntry.value("o").toString();
+ OpData01 entOver01;
+ if (!entOver01.decodeBase64(overviewStr, m_overviewKey, m_overviewHmacKey)) {
+ qCritical() << "Unable to decipher 'o' in UUID \"" << entry->uuid() << "\"\n"
+ << ": " << entOver01.errorString();
+ return false;
+ }
+
+ QByteArray overviewJsonBytes = entOver01.getClearText();
+ QJsonDocument overviewDoc = QJsonDocument::fromJson(overviewJsonBytes);
+ QJsonObject overviewJson = overviewDoc.object();
+
+ QString title = overviewJson.value("title").toString();
+ entry->setTitle(title);
+
+ QString url = overviewJson["url"].toString();
+ entry->setUrl(url);
+
+ int i = 1;
+ for (const auto& urlV : overviewJson["URLs"].toArray()) {
+ auto urlName = QString("URL_%1").arg(i);
+ auto urlValue = urlV.toString();
+ if (urlV.isObject()) {
+ const auto& urlObj = urlV.toObject();
+ if (urlObj["l"].isString() && urlObj["u"].isString()) {
+ urlName = urlObj["l"].toString();
+ urlValue = urlObj["u"].toString();
+ } else {
+ continue;
+ }
+ }
+ if (!urlValue.isEmpty() && urlValue != url) {
+ entry->attributes()->set(urlName, urlValue);
+ ++i;
+ }
+ }
+
+ QStringList tagsList;
+ for (const auto& tagV : overviewJson["tags"].toArray()) {
+ if (tagV.isString()) {
+ tagsList << tagV.toString();
+ }
+ }
+ entry->setTags(tagsList.join(','));
+
+ return true;
+}
diff --git a/src/format/OpVaultReaderSections.cpp b/src/format/OpVaultReaderSections.cpp
new file mode 100644
index 000000000..68ad478d3
--- /dev/null
+++ b/src/format/OpVaultReaderSections.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "OpData01.h"
+#include "OpVaultReader.h"
+
+#include "core/Group.h"
+#include "core/Tools.h"
+#include "crypto/CryptoHash.h"
+#include "crypto/SymmetricCipher.h"
+#include "totp/totp.h"
+
+#include <QDebug>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QUrlQuery>
+#include <QUuid>
+
+void OpVaultReader::fillFromSection(Entry* entry, const QJsonObject& section)
+{
+ const auto uuid = entry->uuid();
+ const QString& sectionName = section["name"].toString();
+
+ if (!section.contains("fields")) {
+ auto sectionNameLC = sectionName.toLower();
+ auto sectionTitleLC = section["title"].toString("").toLower();
+ if (!(sectionNameLC == "linked items" && sectionTitleLC == "related items")) {
+ qWarning() << R"(Skipping "fields"-less Section in UUID ")" << uuid << "\": <<" << section << ">>";
+ }
+ return;
+ } else if (!section["fields"].isArray()) {
+ qWarning() << R"(Skipping non-Array "fields" in UUID ")" << uuid << "\"\n";
+ return;
+ }
+ QJsonArray sectionFields = section["fields"].toArray();
+ for (const QJsonValue sectionField : sectionFields) {
+ if (!sectionField.isObject()) {
+ qWarning() << R"(Skipping non-Object "fields" in UUID ")" << uuid << "\": << " << sectionField << ">>";
+ continue;
+ }
+ QJsonObject field = sectionField.toObject();
+ fillFromSectionField(entry, sectionName, field);
+ }
+}
+
+void OpVaultReader::fillFromSectionField(Entry* entry, const QString& sectionName, QJsonObject& field)
+{
+ if (!field.contains("v")) {
+ // for our purposes, we don't care if there isn't a value in the field
+ return;
+ }
+
+ // Ignore "a" and "inputTraits" fields, they don't apply to KPXC
+
+ auto attrName = resolveAttributeName(sectionName, field["n"].toString(), field["t"].toString());
+ auto attrValue = field.value("v").toVariant().toString();
+ auto kind = field["k"].toString();
+
+ if (attrName.startsWith("TOTP_")) {
+ if (attrValue.startsWith("otpauth://")) {
+ QUrlQuery query(attrValue);
+ // at least as of 1Password 7, they don't append the digits= and period= which totp.cpp requires
+ if (!query.hasQueryItem("digits")) {
+ query.addQueryItem("digits", QString("%1").arg(Totp::DEFAULT_DIGITS));
+ }
+ if (!query.hasQueryItem("period")) {
+ query.addQueryItem("period", QString("%1").arg(Totp::DEFAULT_STEP));
+ }
+ attrValue = query.toString(QUrl::FullyEncoded);
+ }
+ entry->attributes()->set(Totp::ATTRIBUTE_SETTINGS, attrValue, true);
+ } else if (attrName.startsWith("expir", Qt::CaseInsensitive)) {
+ QDateTime expiry;
+ if (kind == "date") {
+ expiry = QDateTime::fromTime_t(attrValue.toUInt(), Qt::UTC);
+ } else {
+ expiry = QDateTime::fromString(attrValue, "yyyyMM");
+ expiry.setTimeSpec(Qt::UTC);
+ }
+
+ if (expiry.isValid()) {
+ entry->setExpiryTime(expiry);
+ entry->setExpires(true);
+ }
+ } else {
+ if (kind == "date") {
+ auto date = QDateTime::fromTime_t(attrValue.toUInt(), Qt::UTC);
+ if (date.isValid()) {
+ attrValue = date.toString();
+ }
+ }
+
+ entry->attributes()->set(attrName, attrValue, (kind == "password" || kind == "concealed"));
+ }
+}
+
+QString OpVaultReader::resolveAttributeName(const QString& section, const QString& name, const QString& text)
+{
+ // Special case for TOTP
+ if (name.startsWith("TOTP_")) {
+ return name;
+ }
+
+ auto lowName = name.toLower();
+ auto lowText = text.toLower();
+ if (section.isEmpty()) {
+ // Empty section implies these are core attributes
+ // try to find username, password, url
+ if (lowName == "password" || lowText == "password") {
+ return EntryAttributes::PasswordKey;
+ } else if (lowName == "username" || lowText == "username") {
+ return EntryAttributes::UserNameKey;
+ } else if (lowName == "url" || lowText == "url" || lowName == "hostname" || lowText == "server"
+ || lowName == "website") {
+ return EntryAttributes::URLKey;
+ }
+ return name;
+ }
+
+ return QString("%1_%2").arg(section, name);
+}
diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp
index f37baedc0..4b9fe5f85 100644
--- a/src/gui/AboutDialog.cpp
+++ b/src/gui/AboutDialog.cpp
@@ -26,7 +26,6 @@
#include <QClipboard>
-
static const QString aboutMaintainers = R"(
<p><ul>
<li>Jonathan White (<a href="https://github.com/droidmonkey">droidmonkey</a>)</li>
@@ -50,6 +49,14 @@ static const QString aboutContributors = R"(
<li>Igor Zinovik</li>
<li>Morgan Courbet</li>
<li>Sergiu Coroi</li>
+ <li>Chris Sohns</li>
+ <li>Kyle Kneitinger</li>
+ <li>Sergey Vilgelm</li>
+ <li>Roman Vaughan (NZSmartie)</li>
+ <li>Shmavon Gazanchyan</li>
+ <li>Riley Moses</li>
+ <li>Korbinian Schildmann</li>
+ <li>Andreas (nitrohorse)</li>
</ul>
<h3>Notable Code Contributions:</h3>
<ul>
@@ -62,11 +69,15 @@ static const QString aboutContributors = R"(
<li>hifi (SSH Agent)</li>
<li>ckieschnick (KeeShare)</li>
<li>seatedscribe (CSV Import)</li>
+ <li>Aetf (Secret Storage Server)</li>
<li>brainplot (many improvements)</li>
<li>kneitinger (many improvements)</li>
<li>frostasm (many improvements)</li>
<li>fonic (Entry Table View)</li>
<li>kylemanna (YubiKey)</li>
+ <li>c4rlo (Offline HIBP Checker)</li>
+ <li>wolframroesler (HTML Exporter)</li>
+ <li>mdaniel (OpVault Importer)</li>
<li>keithbennett (KeePassHTTP)</li>
<li>Typz (KeePassHTTP)</li>
<li>denk-mal (KeePassHTTP)</li>
@@ -76,7 +87,6 @@ static const QString aboutContributors = R"(
</ul>
<h3>Patreon Supporters:</h3>
<ul>
- <li>Ashura</li>
<li>Alexanderjb</li>
<li>Andreas Kollmann</li>
<li>Richard Ames</li>
@@ -84,77 +94,101 @@ static const QString aboutContributors = R"(
<li>Gregory Werbin</li>
<li>Nuutti Toivola</li>
<li>SLmanDR</li>
+ <li>Ashura</li>
<li>Tyler Gass</li>
<li>Lionel Laské</li>
<li>Dmitrii Galinskii</li>
<li>Sergei Maximov</li>
<li>John-Ivar</li>
<li>Clayton Casciato</li>
+ <li>John</li>
+ <li>Darren</li>
+ <li>Brad</li>
+ <li>Mathieu Peltier</li>
+ <li>Oleksii Aleksieiev</li>
+ <li>Daniel Epp</li>
+ <li>Gernot Premper</li>
+ <li>Julian Stier</li>
+ <li>gonczor</li>
+ <li>Ruben Schade</li>
+ <li>Esteban Martinez</li>
+ <li>turin231</li>
+ <li>judd</li>
+ <li>Niels Ganser</li>
</ul>
<h3>Translations:</h3>
<ul>
- <li><strong>Arabic</strong>: AboShanab, Night1, kmutahar, muha_abdulaziz, omar.nsy</li>
- <li><strong>Basque</strong>: azken_tximinoa, Hey_neken</li>
- <li><strong>Bengali</strong>: codesmite</li>
- <li><strong>Burmese</strong>: Phyu</li>
- <li><strong>Catalan</strong>: capitantrueno, dsoms, mcus, raulua, ZJaume</li>
- <li><strong>Chinese (China)</strong>: Biggulu, Brandon_c, Dy64, Felix2yu, Small_Ku, Z4HD,
- carp0129, ef6, holic, kikyous, kofzhanganguo, ligyxy, remonli, slgray, umi_neko, vc5</li>
- <li><strong>Chinese (Taiwan)</strong>: BestSteve, MiauLightouch, Small_Ku, flachesis, gojpdchx,
- raymondtau, th3lusive, yan12125, ymhuang0808</li>
- <li><strong>Czech</strong>: DanielMilde, JosefVitu, awesomevojta, pavelb, tpavelek</li>
- <li><strong>Danish</strong>: nlkl, KalleDK, MannVera, alfabetacain, ebbe, thniels</li>
- <li><strong>Dutch</strong>: Bubbel, Dr.Default, apie, bartlibert, evanoosten, fvw, KnooL,
- srgvg, Vistaus, wanderingidea, Stephan_P, Zombaya1, e2jk, ovisicnarf, pietermj, rigrig,
- theniels17</li>
- <li><strong>English (UK)</strong>: YCMHARHZ, rookwood01, throne3d</li>
- <li><strong>Esperanto</strong>: batisteo</li>
- <li><strong>Estonian</strong>: Hermanio</li>
- <li><strong>Finnish</strong>: artnay, Jarppi, MawKKe, petri, tomisalmi, hifi, varjolintu</li>
- <li><strong>French</strong>: yahoe.001, A1RO, Albynton, Cabirto, Fumble, Gui13, MartialBis,
- MrHeadwar, Nesousx, Raphi111, Scrat15, aghilas.messara, alexisju, b_mortgat, benoitbalon,
- bisaloo, e2jk, ebrious, frgnca, ggtr1138, gilbsgilbs, gtalbot, houdini, houdini69,
- iannick, jlutran, kyodev, lacnic, laetilodie, logut, mlpo, narzb, nekopep, pBouillon,
- plunkets, theodex, tl_pierre, wilfriedroset</li>
- <li><strong>German</strong>: origin_de, mithrial, andreas.maier, NotAName, Atalanttore,
- Hativ, muellerma, mircsicz, derhagen, Wyrrrd, mbetz, kflesch, nursoda, BasicBaer,
- mfernau77, for1real, joe776, waster, eth0, marcbone, mcliquid, transi_222, MarcEdinger,
- DavidHamburg, jensrutschmann, codejunky, vlenzer, montilo, antsas, rgloor, Calyrx,
- omnisome4, pcrcoding</li>
- <li><strong>Greek</strong>: magkopian, nplatis, tassos.b, xinomilo</li>
- <li><strong>Hungarian</strong>: bubu, meskobalazs, urbalazs, andras_tim</li>
- <li><strong>Indonesian</strong>: zk, bora_ach</li>
- <li><strong>Italian</strong>: the.sailor, VosaxAlo, tosky, seatedscribe, bovirus, Peo,
- NITAL, FranzMari, Gringoarg, amaxis, salvatorecordiano, duncanmid, lucaim</li>
- <li><strong>Japanese</strong>: masoo, metalic_cat, p2635, Shinichirou_Yamada,
- vargas.peniel, vmemjp, yukinakato, gojpdchx, saita</li>
- <li><strong>Korean</strong>: cancantun, peremen</li>
- <li><strong>Lithuanian</strong>: Moo, pauliusbaulius, rookwood101</li>
- <li><strong>Norweigian Bokmål</strong>: sattor, ysteinalver, jumpingmushroom,
- JardarBolin, eothred, torgeirf, haarek</li>
- <li><strong>Polish</strong>: keypress, konradmb, mrerexx, psobczak, SebJez, hoek</li>
- <li><strong>Portuguese</strong>: weslly, xendez</li>
- <li><strong>Portuguese (Brazil)</strong>: danielbibit, guilherme__sr, Havokdan, fabiom,
- flaviobn, weslly, newmanisaac, rafaelnp, RockyTV, xendez, lucasjsoliveira, vitor895,
- mauri.andres, andersoniop</li>
- <li><strong>Portuguese (Portugal)</strong>: American_Jesus, xendez, hds, arainho, a.santos,
- pfialho, smarquespt, mihai.ile, smiguel, lmagomes, xnenjm</li>
- <li><strong>Russian</strong>: Mogost, alexminza, KekcuHa, NcNZllQnHVU, ruslan.denisenko,
- agag11507, anm, cl0ne, JayDi85, RKuchma, Rakleed, vsvyatski, NetWormKido, DG,
- Mr.GreyWolf, VictorR2007, _nomoretears_, netforhack, denoos, wkill95, Shevchuk,
- talvind, artemkonenko, ShareDVI</li>
- <li><strong>Slovak</strong>: l.martinicky, Slavko, crazko, pecer</li>
- <li><strong>Spanish</strong>: gonrial, iglpdc, vsvyatski, Xlate1984, erinm, AndreachongB,
- piegope, lupa18, e2jk, capitantrueno, LeoBeltran, antifaz, Zranz, AdrianClv,
- EdwardNavarro, rodolfo.guagnini, NicolasCGN, caralu74, puchrojo, DarkHolme,
- pdinoto, masanchez5000, adolfogc, systurbed, mauri.andres, Bendhet, vargas.peniel,
- eliluminado, jojobrambs, pquin</li>
- <li><strong>Swedish</strong>: theschitz, Anders_Bergqvist, LIINdd, krklns, henziger,
- jpyllman, peron, Thelin, baxtex, zeroxfourc</li>
- <li><strong>Thai</strong>: arthit, rayg</li>
- <li><strong>Turkish</strong>: TeknoMobil, etc, SeLeNLeR, ethem578, cagries, N3pp</li>
- <li><strong>Ukrainian</strong>: brisk022, exlevan, chulivska, cl0ne, zoresvit,
- netforhack, ShareDVI</li>
+ <li><strong>العربية (Arabic)</strong>: AboShanab, kmutahar, muha_abdulaziz, Night1, omar.nsy</li>
+ <li><strong>euskara (Basque)</strong>: azken_tximinoa, Galaipa, Hey_neken</li>
+ <li><strong>বাংলা (Bengali)</strong>: codesmite</li>
+ <li><strong>ဗမာစာ (Burmese)</strong>: Snooooowwwwwman</li>
+ <li><strong>català (Catalan)</strong>: antoniopolonio, capitantrueno, dsoms, MarcRiera, mcus, raulua, ZJaume</li>
+ <li><strong>中文 (Chinese (Simplified))</strong>: Biggulu, Brandon_c, carp0129, Dy64, ef6, Felix2yu, hoilc, ivlioioilvi,
+ kikyous, kofzhanganguo, ligyxy, lxx4380, remonli, ShuiHuo, slgray, Small_Ku, snhun, umi_neko, vc5, Wylmer_Wang, Z4HD</li>
+ <li><strong>中文 (台灣) (Chinese (Traditional))</strong>: BestSteve, flachesis, gojpdchx, ligyxy, MiauLightouch, plesry,
+ priv, raymondtau, Small_Ku, th3lusive, yan12125, ymhuang0808</li>
+ <li><strong>hrvatski jezik (Croatian)</strong>: Halberd, mladenuzelac</li>
+ <li><strong>čeština (Czech)</strong>: awesomevojta, DanielMilde, JosefVitu, pavelb, stps, tpavelek</li>
+ <li><strong>dansk (Danish)</strong>: alfabetacain, ebbe, GimliDk, JakobPP, KalleDK, MannVera, nlkl, thniels</li>
+ <li><strong>Nederlands (Dutch)</strong>: apie, bartlibert, Bubbel, bython, Dr.Default, e2jk, evanoosten, fourwood,
+ fvw, glotzbach, JCKalman, KnooL, ovisicnarf, pietermj, rigrig, srgvg, Stephan_P, stijndubrul, theniels17,
+ ThomasChurchman, Vistaus, wanderingidea, Zombaya1</li>
+ <li><strong>English (UK)</strong>: CisBetter, rookwood101, spacemanspiff, throne3d, YCMHARHZ</li>
+ <li><strong>English (USA)</strong>: alexandercrice, caralu74, cl0ne, DarkHolme, nguyenlekhtn, thedoctorsoad, throne3d</li>
+ <li><strong>Esperanto (Esperanto)</strong>: batisteo</li>
+ <li><strong>eesti (Estonian)</strong>: Hermanio</li>
+ <li><strong>suomi (Finnish)</strong>: artnay, hif1, MawKKe, petri, tomisalmi, varjolintu</li>
+ <li><strong>français (French)</strong>: A1RO, aghilas.messara, Albynton, alexisju, b_mortgat, Beatussum, benoitbalon,
+ bertranoel, bisaloo, Cabirto, Code2Mirabeau, e2jk, ebrious, frgnca, Fumble, ggtr1138, gilbsgilbs, gohuros, gtalbot,
+ Gui13, houdini, houdini69, iannick, jlutran, John.Mickael, kyodev, lacnic, laetilodie, logut, MartialBis, Maxime_J,
+ mlpo, Morgan, MrHeadwar, narzb, nekopep, Nesousx, pBouillon, Raphi111, Scrat15, TheFrenchGhosty, theodex, tl_pierre,
+ webafrancois, wilfriedroset, yahoe.001, zedentox</li>
+ <li><strong>Galego (Galician)</strong>: enfeitizador</li>
+ <li><strong>Deutsch (German)</strong>: andreas.maier, antsas, Atalanttore, BasicBaer, bwolkchen, Calyrx, codejunky,
+ DavidHamburg, derhagen, eth0, fahstat, for1real, Gyges, Hativ, hjonas, HoferJulian, janis91, jensrutschmann,
+ joe776, kflesch, man_at_home, marcbone, MarcEdinger, markusd112, Maxime_J, mbetz, mcliquid, mfernau77, mircsicz,
+ mithrial, montilo, MuehlburgPhoenix, muellerma, nautilusx, Nerzahd, Nightwriter, NotAName, nursoda, omnisome4,
+ origin_de, pcrcoding, PFischbeck, rgloor, rugk, ScholliYT, Silas_229, spacemanspiff, testarossa47, TheForcer,
+ transi_222, traschke, vlenzer, vpav, waster, wolfram.roesler, Wyrrrd</li>
+ <li><strong>ελληνικά (Greek)</strong>: anvo, magkopian, nplatis, tassos.b, xinomilo</li>
+ <li><strong>עברית (Hebrew)</strong>: shmag18</li>
+ <li><strong>magyar (Hungarian)</strong>: andras_tim, bubu, meskobalazs, urbalazs</li>
+ <li><strong>Íslenska (Icelandic)</strong>: MannVera</li>
+ <li><strong>Bahasa (Indonesian)</strong>: achmad, bora_ach, zk</li>
+ <li><strong>Italiano (Italian)</strong>: amaxis, bovirus, duncanmid, FranzMari, Gringoarg, lucaim, NITAL, Peo,
+ salvatorecordiano, seatedscribe, Stemby, the.sailor, tosky, VosaxAlo</li>
+ <li><strong>日本語 (Japanese)</strong>: gojpdchx, masoo, metalic_cat, p2635, saita, Shinichirou_Yamada, take100yen,
+ Umoxfo, vargas.peniel, vmemjp, WatanabeShint, yukinakato</li>
+ <li><strong>қазақ тілі (Kazakh)</strong>: sotrud_nik</li>
+ <li><strong>한국어 (Korean)</strong>: cancantun, peremen</li>
+ <li><strong>latine (Latin)</strong>: alexandercrice</li>
+ <li><strong>lietuvių kalba (Lithuanian)</strong>: Moo, pauliusbaulius, rookwood101</li>
+ <li><strong>Norsk Bokmål (Norwegian Bokmål)</strong>: eothred, haarek, JardarBolin, jumpingmushroom, sattor, torgeirf,
+ ysteinalver</li>
+ <li><strong>język polski (Polish)</strong>: AreYouLoco, dedal123, hoek, keypress, konradmb, mrerexx, pabli, psobczak,
+ SebJez</li>
+ <li><strong>Português (Portuguese)</strong>: weslly, xendez</li>
+ <li><strong>Português (Portuguese (Brazil))</strong>: andersoniop, danielbibit, fabiom, flaviobn, guilherme__sr,
+ Havokdan, lucasjsoliveira, mauri.andres, newmanisaac, rafaelnp, RockyTV, vitor895, weslly, xendez</li>
+ <li><strong>Português (Portuguese (Portugal))</strong>: a.santos, American_Jesus, arainho, hds, lmagomes, mihai.ile,
+ pfialho, smarquespt, smiguel, xendez, xnenjm</li>
+ <li><strong>Română (Romanian)</strong>: alexminza, drazvan, polearnik</li>
+ <li><strong>русский (Russian)</strong>: _nomoretears_, agag11507, alexminza, anm, artemkonenko, cl0ne, denoos, DG,
+ JayDi85, KekcuHa, Mogost, Mr.GreyWolf, MustangDSG, NcNZllQnHVU, netforhack, NetWormKido, Rakleed, RKuchma,
+ ruslan.denisenko, ShareDVI, Shevchuk, solodyagin, talvind, VictorR2007, vsvyatski, wkill95</li>
+ <li><strong>српски језик (Serbian)</strong>: ArtBIT, oros</li>
+ <li><strong>Slovenčina (Slovak)</strong>: Asprotes, crazko, l.martinicky, pecer, Slavko</li>
+ <li><strong>Español (Spanish)</strong>: adolfogc, AdrianClv, AndreachongB, AndresQ, antifaz, Bendhet, capitantrueno,
+ caralu74, DarkHolme, e2jk, EdwardNavarro, eliluminado, erinm, gonrial, iglpdc, jojobrambs, LeoBeltran, lupa18,
+ masanchez5000, mauri.andres, NicolasCGN, Pablohn, pdinoto, picodotdev, piegope, pquin, puchrojo, rcalpha,
+ rodolfo.guagnini, systurbed, vargas.peniel, ventolinmono, vsvyatski, Xlate1984, zmzpa, Zranz</li>
+ <li><strong>Svenska (Swedish)</strong>: 0x9fff00, Anders_Bergqvist, ArmanB, baxtex, eson, henziger, jpyllman, krklns,
+ LIINdd, malkus, peron, Thelin, theschitz, victorhggqvst, zeroxfourc</li>
+ <li><strong>ไทย (Thai)</strong>: arthit, ben_cm, chumaporn.t, darika, digitalthailandproject, GitJirasamatakij,
+ muhammadmumean, nipattra, ordinaryjane, rayg, sirawat, Socialister, Wipanee</li>
+ <li><strong>Türkçe (Turkish)</strong>: cagries, etc, ethem578, mcveri, N3pp, SeLeNLeR, TeknoMobil, Ven_Zallow</li>
+ <li><strong>Українська (Ukrainian)</strong>: brisk022, chulivska, cl0ne, exlevan, m0stik, netforhack, paul_sm, ShareDVI,
+ zoresvit</li>
</ul>
)";
diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp
index 2461230c8..d3cc994f8 100644
--- a/src/gui/ApplicationSettingsWidget.cpp
+++ b/src/gui/ApplicationSettingsWidget.cpp
@@ -28,6 +28,7 @@
#include "core/Global.h"
#include "core/Translator.h"
+#include "MessageBox.h"
#include "touchid/TouchID.h"
class ApplicationSettingsWidget::ExtraPage
@@ -54,6 +55,28 @@ private:
QWidget* widget;
};
+/**
+ * Helper class to ignore mouse wheel events on non-focused widgets
+ * NOTE: The widget must NOT have a focus policy of "WHEEL"
+ */
+class MouseWheelEventFilter : public QObject
+{
+public:
+ explicit MouseWheelEventFilter(QObject* parent)
+ : QObject(parent){};
+
+protected:
+ bool eventFilter(QObject* obj, QEvent* event) override
+ {
+ const auto* widget = qobject_cast<QWidget*>(obj);
+ if (event->type() == QEvent::Wheel && widget && !widget->hasFocus()) {
+ event->ignore();
+ return true;
+ }
+ return QObject::eventFilter(obj, event);
+ }
+};
+
ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
: EditWidget(parent)
, m_secWidget(new QWidget())
@@ -80,28 +103,41 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
// clang-format off
connect(m_generalUi->autoSaveAfterEveryChangeCheckBox, SIGNAL(toggled(bool)), SLOT(autoSaveToggled(bool)));
+ connect(m_generalUi->hideWindowOnCopyCheckBox, SIGNAL(toggled(bool)), SLOT(hideWindowOnCopyCheckBoxToggled(bool)));
connect(m_generalUi->systrayShowCheckBox, SIGNAL(toggled(bool)), SLOT(systrayToggled(bool)));
connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(toolbarSettingsToggled(bool)));
connect(m_generalUi->rememberLastDatabasesCheckBox, SIGNAL(toggled(bool)), SLOT(rememberDatabasesToggled(bool)));
+ connect(m_generalUi->resetSettingsButton, SIGNAL(clicked()), SLOT(resetSettings()));
connect(m_secUi->clearClipboardCheckBox, SIGNAL(toggled(bool)),
m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool)));
+ connect(m_secUi->clearSearchCheckBox, SIGNAL(toggled(bool)),
+ m_secUi->clearSearchSpinBox, SLOT(setEnabled(bool)));
connect(m_secUi->lockDatabaseIdleCheckBox, SIGNAL(toggled(bool)),
m_secUi->lockDatabaseIdleSpinBox, SLOT(setEnabled(bool)));
connect(m_secUi->touchIDResetCheckBox, SIGNAL(toggled(bool)),
m_secUi->touchIDResetSpinBox, SLOT(setEnabled(bool)));
// clang-format on
+ // Disable mouse wheel grab when scrolling
+ // This prevents combo box and spinner values from changing without explicit focus
+ auto mouseWheelFilter = new MouseWheelEventFilter(this);
+ m_generalUi->faviconTimeoutSpinBox->installEventFilter(mouseWheelFilter);
+ m_generalUi->toolButtonStyleComboBox->installEventFilter(mouseWheelFilter);
+ m_generalUi->languageComboBox->installEventFilter(mouseWheelFilter);
+
#ifdef WITH_XC_UPDATECHECK
connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool)));
#else
m_generalUi->checkForUpdatesOnStartupCheckBox->setVisible(false);
m_generalUi->checkForUpdatesIncludeBetasCheckBox->setVisible(false);
- m_generalUi->checkUpdatesSpacer->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed);
+ m_generalUi->checkUpdatesSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
#endif
#ifndef WITH_XC_NETWORKING
m_secUi->privacy->setVisible(false);
+ m_generalUi->faviconTimeoutLabel->setVisible(false);
+ m_generalUi->faviconTimeoutSpinBox->setVisible(false);
#endif
#ifndef WITH_XC_TOUCHID
@@ -147,11 +183,20 @@ void ApplicationSettingsWidget::loadSettings()
m_generalUi->backupBeforeSaveCheckBox->setChecked(config()->get("BackupBeforeSave").toBool());
m_generalUi->useAtomicSavesCheckBox->setChecked(config()->get("UseAtomicSaves").toBool());
m_generalUi->autoReloadOnChangeCheckBox->setChecked(config()->get("AutoReloadOnChange").toBool());
- m_generalUi->minimizeOnCopyCheckBox->setChecked(config()->get("MinimizeOnCopy").toBool());
+ m_generalUi->minimizeAfterUnlockCheckBox->setChecked(config()->get("MinimizeAfterUnlock").toBool());
+ m_generalUi->minimizeOnOpenUrlCheckBox->setChecked(config()->get("MinimizeOnOpenUrl").toBool());
+ m_generalUi->hideWindowOnCopyCheckBox->setChecked(config()->get("HideWindowOnCopy").toBool());
+ m_generalUi->minimizeOnCopyRadioButton->setChecked(config()->get("MinimizeOnCopy").toBool());
+ m_generalUi->dropToBackgroundOnCopyRadioButton->setChecked(config()->get("DropToBackgroundOnCopy").toBool());
m_generalUi->useGroupIconOnEntryCreationCheckBox->setChecked(config()->get("UseGroupIconOnEntryCreation").toBool());
m_generalUi->autoTypeEntryTitleMatchCheckBox->setChecked(config()->get("AutoTypeEntryTitleMatch").toBool());
m_generalUi->autoTypeEntryURLMatchCheckBox->setChecked(config()->get("AutoTypeEntryURLMatch").toBool());
m_generalUi->ignoreGroupExpansionCheckBox->setChecked(config()->get("IgnoreGroupExpansion").toBool());
+ m_generalUi->faviconTimeoutSpinBox->setValue(config()->get("FaviconDownloadTimeout").toInt());
+
+ if (!m_generalUi->hideWindowOnCopyCheckBox->isChecked()) {
+ hideWindowOnCopyCheckBoxToggled(false);
+ }
m_generalUi->languageComboBox->clear();
QList<QPair<QString, QString>> languages = Translator::availableLanguages();
@@ -166,6 +211,7 @@ void ApplicationSettingsWidget::loadSettings()
m_generalUi->previewHideCheckBox->setChecked(config()->get("GUI/HidePreviewPanel").toBool());
m_generalUi->toolbarHideCheckBox->setChecked(config()->get("GUI/HideToolbar").toBool());
m_generalUi->toolbarMovableCheckBox->setChecked(config()->get("GUI/MovableToolbar").toBool());
+ m_generalUi->monospaceNotesCheckBox->setChecked(config()->get("GUI/MonospaceNotes").toBool());
m_generalUi->toolButtonStyleComboBox->clear();
m_generalUi->toolButtonStyleComboBox->addItem(tr("Icon only"), Qt::ToolButtonIconOnly);
@@ -203,6 +249,9 @@ void ApplicationSettingsWidget::loadSettings()
m_secUi->clearClipboardCheckBox->setChecked(config()->get("security/clearclipboard").toBool());
m_secUi->clearClipboardSpinBox->setValue(config()->get("security/clearclipboardtimeout").toInt());
+ m_secUi->clearSearchCheckBox->setChecked(config()->get("security/clearsearch").toBool());
+ m_secUi->clearSearchSpinBox->setValue(config()->get("security/clearsearchtimeout").toInt());
+
m_secUi->lockDatabaseIdleCheckBox->setChecked(config()->get("security/lockdatabaseidle").toBool());
m_secUi->lockDatabaseIdleSpinBox->setValue(config()->get("security/lockdatabaseidlesec").toInt());
m_secUi->lockDatabaseMinimizeCheckBox->setChecked(config()->get("security/lockdatabaseminimize").toBool());
@@ -229,7 +278,6 @@ void ApplicationSettingsWidget::loadSettings()
void ApplicationSettingsWidget::saveSettings()
{
-
if (config()->hasAccessError()) {
showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error);
// We prevent closing the settings page if we could not write to
@@ -246,18 +294,24 @@ void ApplicationSettingsWidget::saveSettings()
config()->set("BackupBeforeSave", m_generalUi->backupBeforeSaveCheckBox->isChecked());
config()->set("UseAtomicSaves", m_generalUi->useAtomicSavesCheckBox->isChecked());
config()->set("AutoReloadOnChange", m_generalUi->autoReloadOnChangeCheckBox->isChecked());
- config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyCheckBox->isChecked());
+ config()->set("MinimizeAfterUnlock", m_generalUi->minimizeAfterUnlockCheckBox->isChecked());
+ config()->set("MinimizeOnOpenUrl", m_generalUi->minimizeOnOpenUrlCheckBox->isChecked());
+ config()->set("HideWindowOnCopy", m_generalUi->hideWindowOnCopyCheckBox->isChecked());
+ config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyRadioButton->isChecked());
+ config()->set("DropToBackgroundOnCopy", m_generalUi->dropToBackgroundOnCopyRadioButton->isChecked());
config()->set("UseGroupIconOnEntryCreation", m_generalUi->useGroupIconOnEntryCreationCheckBox->isChecked());
config()->set("IgnoreGroupExpansion", m_generalUi->ignoreGroupExpansionCheckBox->isChecked());
config()->set("AutoTypeEntryTitleMatch", m_generalUi->autoTypeEntryTitleMatchCheckBox->isChecked());
config()->set("AutoTypeEntryURLMatch", m_generalUi->autoTypeEntryURLMatchCheckBox->isChecked());
int currentLangIndex = m_generalUi->languageComboBox->currentIndex();
+ config()->set("FaviconDownloadTimeout", m_generalUi->faviconTimeoutSpinBox->value());
config()->set("GUI/Language", m_generalUi->languageComboBox->itemData(currentLangIndex).toString());
config()->set("GUI/HidePreviewPanel", m_generalUi->previewHideCheckBox->isChecked());
config()->set("GUI/HideToolbar", m_generalUi->toolbarHideCheckBox->isChecked());
config()->set("GUI/MovableToolbar", m_generalUi->toolbarMovableCheckBox->isChecked());
+ config()->set("GUI/MonospaceNotes", m_generalUi->monospaceNotesCheckBox->isChecked());
int currentToolButtonStyleIndex = m_generalUi->toolButtonStyleComboBox->currentIndex();
config()->set("GUI/ToolButtonStyle",
@@ -282,6 +336,9 @@ void ApplicationSettingsWidget::saveSettings()
config()->set("security/clearclipboard", m_secUi->clearClipboardCheckBox->isChecked());
config()->set("security/clearclipboardtimeout", m_secUi->clearClipboardSpinBox->value());
+ config()->set("security/clearsearch", m_secUi->clearSearchCheckBox->isChecked());
+ config()->set("security/clearsearchtimeout", m_secUi->clearSearchSpinBox->value());
+
config()->set("security/lockdatabaseidle", m_secUi->lockDatabaseIdleCheckBox->isChecked());
config()->set("security/lockdatabaseidlesec", m_secUi->lockDatabaseIdleSpinBox->value());
config()->set("security/lockdatabaseminimize", m_secUi->lockDatabaseMinimizeCheckBox->isChecked());
@@ -305,6 +362,7 @@ void ApplicationSettingsWidget::saveSettings()
config()->set("LastDatabases", {});
config()->set("OpenPreviousDatabasesOnStartup", {});
config()->set("LastActiveDatabase", {});
+ config()->set("LastAttachmentDir", {});
}
if (!config()->get("RememberLastKeyFiles").toBool()) {
@@ -317,6 +375,48 @@ void ApplicationSettingsWidget::saveSettings()
}
}
+void ApplicationSettingsWidget::resetSettings()
+{
+ // Confirm reset
+ auto ans = MessageBox::question(this,
+ tr("Reset Settings?"),
+ tr("Are you sure you want to reset all general and security settings to default?"),
+ MessageBox::Reset | MessageBox::Cancel,
+ MessageBox::Cancel);
+ if (ans == MessageBox::Cancel) {
+ return;
+ }
+
+ if (config()->hasAccessError()) {
+ showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error);
+ // We prevent closing the settings page if we could not write to
+ // the config file.
+ return;
+ }
+
+ // Reset general and security settings to default
+ config()->resetToDefaults();
+
+ // Clear recently used data
+ config()->set("LastDatabases", {});
+ config()->set("OpenPreviousDatabasesOnStartup", {});
+ config()->set("LastActiveDatabase", {});
+ config()->set("LastAttachmentDir", {});
+ config()->set("LastKeyFiles", {});
+ config()->set("LastDir", "");
+
+ // Save the Extra Pages (these are NOT reset)
+ for (const ExtraPage& page : asConst(m_extraPages)) {
+ page.saveSettings();
+ }
+
+ config()->sync();
+
+ // Refresh the settings widget and notify listeners
+ loadSettings();
+ emit settingsReset();
+}
+
void ApplicationSettingsWidget::reject()
{
// register the old key again as it might have changed
@@ -334,6 +434,12 @@ void ApplicationSettingsWidget::autoSaveToggled(bool checked)
m_generalUi->autoSaveOnExitCheckBox->setEnabled(!checked);
}
+void ApplicationSettingsWidget::hideWindowOnCopyCheckBoxToggled(bool checked)
+{
+ m_generalUi->minimizeOnCopyRadioButton->setEnabled(checked);
+ m_generalUi->dropToBackgroundOnCopyRadioButton->setEnabled(checked);
+}
+
void ApplicationSettingsWidget::systrayToggled(bool checked)
{
m_generalUi->systrayDarkIconCheckBox->setEnabled(checked);
diff --git a/src/gui/ApplicationSettingsWidget.h b/src/gui/ApplicationSettingsWidget.h
index dfffbddbd..63487e1b5 100644
--- a/src/gui/ApplicationSettingsWidget.h
+++ b/src/gui/ApplicationSettingsWidget.h
@@ -50,10 +50,15 @@ public:
void addSettingsPage(ISettingsPage* page);
void loadSettings();
+signals:
+ void settingsReset();
+
private slots:
void saveSettings();
+ void resetSettings();
void reject();
void autoSaveToggled(bool checked);
+ void hideWindowOnCopyCheckBoxToggled(bool checked);
void systrayToggled(bool checked);
void toolbarSettingsToggled(bool checked);
void rememberDatabasesToggled(bool checked);
diff --git a/src/gui/ApplicationSettingsWidgetGeneral.ui b/src/gui/ApplicationSettingsWidgetGeneral.ui
index 9f03bbb50..3c6de499a 100644
--- a/src/gui/ApplicationSettingsWidgetGeneral.ui
+++ b/src/gui/ApplicationSettingsWidgetGeneral.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>684</width>
- <height>881</height>
+ <height>951</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
@@ -57,6 +57,13 @@
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="minimizeAfterUnlockCheckBox">
+ <property name="text">
+ <string>Minimize window after unlocking database</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QCheckBox" name="rememberLastDatabasesCheckBox">
<property name="text">
<string>Remember previously used databases</string>
@@ -249,19 +256,141 @@
</widget>
</item>
<item>
- <widget class="QCheckBox" name="minimizeOnCopyCheckBox">
+ <widget class="QCheckBox" name="previewHideCheckBox">
<property name="text">
- <string>Minimize when copying to clipboard</string>
+ <string>Hide the entry preview panel</string>
</property>
</widget>
</item>
<item>
- <widget class="QCheckBox" name="previewHideCheckBox">
+ <widget class="QCheckBox" name="minimizeOnOpenUrlCheckBox">
<property name="text">
- <string>Hide the entry preview panel</string>
+ <string>Minimize when opening a URL</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="hideWindowOnCopyCheckBox">
+ <property name="text">
+ <string>Hide window when copying to clipboard</string>
</property>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="hideWindowLayout_1">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="hideWindowSpacer_1">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="minimizeOnCopyRadioButton">
+ <property name="text">
+ <string>Minimize</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="hideWindowLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="hideWindowSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="dropToBackgroundOnCopyRadioButton">
+ <property name="text">
+ <string>Drop to background</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1">
+ <item>
+ <widget class="QLabel" name="faviconTimeoutLabel">
+ <property name="text">
+ <string>Favicon download timeout:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="faviconTimeoutSpinBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="accessibleName">
+ <string>Website icon download timeout in seconds</string>
+ </property>
+ <property name="suffix">
+ <string comment="Seconds"> sec</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>60</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</item>
@@ -321,7 +450,7 @@
</layout>
</item>
<item>
- <layout class="QHBoxLayout" name="toolButtonStyleLayout">
+ <layout class="QHBoxLayout" name="toolButtonStyleLayout" stretch="0,0,0,1">
<property name="spacing">
<number>0</number>
</property>
@@ -371,11 +500,40 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="accessibleName">
+ <string>Toolbar button style</string>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QComboBox::AdjustToContents</enum>
+ </property>
</widget>
</item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</item>
<item>
+ <widget class="QCheckBox" name="monospaceNotesCheckBox">
+ <property name="text">
+ <string>Use monospaced font for Notes</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QCheckBox" name="minimizeOnCloseCheckBox">
<property name="text">
<string>Minimize instead of app exit</string>
@@ -398,7 +556,7 @@
<enum>QLayout::SetMaximumSize</enum>
</property>
<item>
- <spacer name="horizontalSpacer_3">
+ <spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -486,7 +644,7 @@
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="languageLabelLayout_2">
+ <layout class="QHBoxLayout" name="languageLabelLayout_2" stretch="0,0,0,1">
<property name="spacing">
<number>8</number>
</property>
@@ -511,6 +669,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="accessibleName">
+ <string>Language selection</string>
+ </property>
</widget>
</item>
<item>
@@ -520,6 +684,68 @@
</property>
</widget>
</item>
+ <item>
+ <spacer name="spacer3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="resetSettingsSubLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMaximumSize</enum>
+ </property>
+ <item>
+ <widget class="QPushButton" name="resetSettingsButton">
+ <property name="text">
+ <string>Reset Settings to Default</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="spacer4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>50</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</item>
</layout>
@@ -592,6 +818,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Global auto-type shortcut</string>
+ </property>
</widget>
</item>
<item row="3" column="0">
@@ -609,6 +838,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Auto-type character typing delay milliseconds</string>
+ </property>
<property name="suffix">
<string comment="Milliseconds"> ms</string>
</property>
@@ -638,6 +870,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Auto-type start delay milliseconds</string>
+ </property>
<property name="suffix">
<string comment="Milliseconds"> ms</string>
</property>
diff --git a/src/gui/ApplicationSettingsWidgetSecurity.ui b/src/gui/ApplicationSettingsWidgetSecurity.ui
index bf5cce2d3..2310bd07d 100644
--- a/src/gui/ApplicationSettingsWidgetSecurity.ui
+++ b/src/gui/ApplicationSettingsWidgetSecurity.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>595</width>
- <height>478</height>
+ <height>541</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
@@ -28,14 +28,7 @@
<property name="title">
<string>Timeouts</string>
</property>
- <layout class="QFormLayout" name="formLayout">
- <item row="0" column="0">
- <widget class="QCheckBox" name="clearClipboardCheckBox">
- <property name="text">
- <string>Clear clipboard after</string>
- </property>
- </widget>
- </item>
+ <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1">
<item row="0" column="1">
<widget class="QSpinBox" name="clearClipboardSpinBox">
<property name="enabled">
@@ -47,6 +40,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Clipboard clear seconds</string>
+ </property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
@@ -61,7 +57,52 @@
</property>
</widget>
</item>
- <item row="2" column="0">
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="touchIDResetCheckBox">
+ <property name="text">
+ <string>Forget TouchID after inactivity of</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="touchIDResetSpinBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="accessibleName">
+ <string>Touch ID inactivity reset</string>
+ </property>
+ <property name="suffix">
+ <string> min</string>
+ </property>
+ <property name="maximum">
+ <number>1440</number>
+ </property>
+ <property name="value">
+ <number>30</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
<widget class="QCheckBox" name="lockDatabaseIdleCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@@ -74,7 +115,7 @@
</property>
</widget>
</item>
- <item row="2" column="1">
+ <item row="1" column="1">
<widget class="QSpinBox" name="lockDatabaseIdleSpinBox">
<property name="enabled">
<bool>false</bool>
@@ -85,6 +126,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Database lock timeout seconds</string>
+ </property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
@@ -99,8 +143,8 @@
</property>
</widget>
</item>
- <item row="3" column="1">
- <widget class="QSpinBox" name="touchIDResetSpinBox">
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="clearSearchSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
@@ -111,20 +155,33 @@
</sizepolicy>
</property>
<property name="suffix">
- <string> min</string>
+ <string comment="Minutes"> min</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
</property>
<property name="maximum">
<number>1440</number>
</property>
<property name="value">
- <number>30</number>
+ <number>5</number>
+ </property>
+ <property name="displayIntegerBase">
+ <number>10</number>
</property>
</widget>
</item>
- <item row="3" column="0">
- <widget class="QCheckBox" name="touchIDResetCheckBox">
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="clearClipboardCheckBox">
<property name="text">
- <string>Forget TouchID after inactivity of</string>
+ <string>Clear clipboard after</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="clearSearchCheckBox">
+ <property name="text">
+ <string>Clear search query after</string>
</property>
</widget>
</item>
@@ -237,6 +294,21 @@
</item>
</layout>
</widget>
+ <tabstops>
+ <tabstop>clearClipboardCheckBox</tabstop>
+ <tabstop>clearClipboardSpinBox</tabstop>
+ <tabstop>touchIDResetSpinBox</tabstop>
+ <tabstop>lockDatabaseOnScreenLockCheckBox</tabstop>
+ <tabstop>touchIDResetOnScreenLockCheckBox</tabstop>
+ <tabstop>lockDatabaseMinimizeCheckBox</tabstop>
+ <tabstop>relockDatabaseAutoTypeCheckBox</tabstop>
+ <tabstop>passwordRepeatCheckBox</tabstop>
+ <tabstop>passwordCleartextCheckBox</tabstop>
+ <tabstop>passwordShowDotsCheckBox</tabstop>
+ <tabstop>passwordPreviewCleartextCheckBox</tabstop>
+ <tabstop>hideNotesCheckBox</tabstop>
+ <tabstop>fallbackToSearch</tabstop>
+ </tabstops>
<resources/>
<connections/>
</ui>
diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp
index ced72485e..1cadc5e21 100644
--- a/src/gui/DatabaseOpenWidget.cpp
+++ b/src/gui/DatabaseOpenWidget.cpp
@@ -34,6 +34,8 @@
#include "config-keepassx.h"
+#include <QDesktopServices>
+#include <QFont>
#include <QSharedPointer>
#include <QtConcurrentRun>
@@ -46,21 +48,30 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
m_ui->messageWidget->setHidden(true);
- QFont font = m_ui->labelHeadline->font();
+ QFont font;
+ font.setPointSize(font.pointSize() + 4);
font.setBold(true);
- font.setPointSize(font.pointSize() + 2);
m_ui->labelHeadline->setFont(font);
+ m_ui->labelHeadline->setText(tr("Unlock KeePassXC Database"));
+
+ m_ui->comboKeyFile->lineEdit()->addAction(m_ui->keyFileClearIcon, QLineEdit::TrailingPosition);
m_ui->buttonTogglePassword->setIcon(filePath()->onOffIcon("actions", "password-show"));
connect(m_ui->buttonTogglePassword, SIGNAL(toggled(bool)), m_ui->editPassword, SLOT(setShowPassword(bool)));
connect(m_ui->buttonBrowseFile, SIGNAL(clicked()), SLOT(browseKeyFile()));
- connect(m_ui->editPassword, SIGNAL(textChanged(QString)), SLOT(activatePassword()));
- connect(m_ui->comboKeyFile, SIGNAL(editTextChanged(QString)), SLOT(activateKeyFile()));
-
connect(m_ui->buttonBox, SIGNAL(accepted()), SLOT(openDatabase()));
connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(reject()));
+ m_ui->hardwareKeyLabelHelp->setIcon(filePath()->icon("actions", "system-help").pixmap(QSize(12, 12)));
+ connect(m_ui->hardwareKeyLabelHelp, SIGNAL(clicked(bool)), SLOT(openHardwareKeyHelp()));
+
+ connect(m_ui->comboKeyFile->lineEdit(), SIGNAL(textChanged(QString)), SLOT(handleKeyFileComboEdited()));
+ connect(m_ui->comboKeyFile, SIGNAL(currentIndexChanged(int)), SLOT(handleKeyFileComboChanged()));
+ m_ui->keyFileClearIcon->setIcon(filePath()->icon("actions", "edit-clear-locationbar-rtl"));
+ m_ui->keyFileClearIcon->setVisible(false);
+ connect(m_ui->keyFileClearIcon, SIGNAL(triggered(bool)), SLOT(clearKeyFileEdit()));
+
#ifdef WITH_XC_YUBIKEY
m_ui->yubikeyProgress->setVisible(false);
QSizePolicy sp = m_ui->yubikeyProgress->sizePolicy();
@@ -68,9 +79,9 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
m_ui->yubikeyProgress->setSizePolicy(sp);
connect(m_ui->buttonRedetectYubikey, SIGNAL(clicked()), SLOT(pollYubikey()));
- connect(m_ui->comboChallengeResponse, SIGNAL(activated(int)), SLOT(activateChallengeResponse()));
#else
- m_ui->checkChallengeResponse->setVisible(false);
+ m_ui->hardwareKeyLabel->setVisible(false);
+ m_ui->hardwareKeyLabelHelp->setVisible(false);
m_ui->buttonRedetectYubikey->setVisible(false);
m_ui->comboChallengeResponse->setVisible(false);
m_ui->yubikeyProgress->setVisible(false);
@@ -80,11 +91,10 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
// add random padding to layouts to align widgets properly
m_ui->dialogButtonsLayout->setContentsMargins(10, 0, 15, 0);
m_ui->gridLayout->setContentsMargins(10, 0, 0, 0);
- m_ui->labelLayout->setContentsMargins(10, 0, 10, 0);
#endif
#ifndef WITH_XC_TOUCHID
- m_ui->checkTouchID->setVisible(false);
+ m_ui->touchIDContainer->setVisible(false);
#else
if (!TouchID::getInstance().isAvailable()) {
m_ui->checkTouchID->setVisible(false);
@@ -136,14 +146,18 @@ void DatabaseOpenWidget::hideEvent(QHideEvent* event)
void DatabaseOpenWidget::load(const QString& filename)
{
m_filename = filename;
+ m_ui->fileNameLabel->setRawText(m_filename);
- m_ui->labelFilename->setText(filename);
+ m_ui->comboKeyFile->addItem(tr("Select file..."), -1);
+ m_ui->comboKeyFile->setCurrentIndex(0);
+ m_ui->keyFileClearIcon->setVisible(false);
+ m_keyFileComboEdited = false;
if (config()->get("RememberLastKeyFiles").toBool()) {
QHash<QString, QVariant> lastKeyFiles = config()->get("LastKeyFiles").toHash();
if (lastKeyFiles.contains(m_filename)) {
- m_ui->checkKeyFile->setChecked(true);
m_ui->comboKeyFile->addItem(lastKeyFiles[m_filename].toString());
+ m_ui->comboKeyFile->setCurrentIndex(1);
}
}
@@ -158,9 +172,6 @@ void DatabaseOpenWidget::clearForms()
m_ui->editPassword->setText("");
m_ui->comboKeyFile->clear();
m_ui->comboKeyFile->setEditText("");
- m_ui->checkPassword->setChecked(false);
- m_ui->checkKeyFile->setChecked(false);
- m_ui->checkChallengeResponse->setChecked(false);
m_ui->checkTouchID->setChecked(false);
m_ui->buttonTogglePassword->setChecked(false);
m_db.reset();
@@ -174,6 +185,7 @@ QSharedPointer<Database> DatabaseOpenWidget::database()
void DatabaseOpenWidget::enterKey(const QString& pw, const QString& keyFile)
{
m_ui->editPassword->setText(pw);
+ m_ui->comboKeyFile->setCurrentIndex(-1);
m_ui->comboKeyFile->setEditText(keyFile);
openDatabase();
}
@@ -186,6 +198,7 @@ void DatabaseOpenWidget::openDatabase()
}
m_ui->editPassword->setShowPassword(false);
+ m_ui->buttonTogglePassword->setChecked(false);
QCoreApplication::processEvents();
m_db.reset(new Database());
@@ -194,6 +207,26 @@ void DatabaseOpenWidget::openDatabase()
bool ok = m_db->open(m_filename, masterKey, &error, false);
QApplication::restoreOverrideCursor();
if (!ok) {
+ if (m_ui->editPassword->text().isEmpty() && !m_retryUnlockWithEmptyPassword) {
+ QScopedPointer<QMessageBox> msgBox(new QMessageBox(this));
+ msgBox->setIcon(QMessageBox::Critical);
+ msgBox->setWindowTitle(tr("Unlock failed and no password given"));
+ msgBox->setText(tr("Unlocking the database failed and you did not enter a password.\n"
+ "Do you want to retry with an \"empty\" password instead?\n\n"
+ "To prevent this error from appearing, you must go to "
+ "\"Database Settings / Security\" and reset your password."));
+ auto btn = msgBox->addButton(tr("Retry with empty password"), QMessageBox::ButtonRole::AcceptRole);
+ msgBox->setDefaultButton(btn);
+ msgBox->addButton(QMessageBox::Cancel);
+ msgBox->exec();
+
+ if (msgBox->clickedButton() == btn) {
+ m_retryUnlockWithEmptyPassword = true;
+ openDatabase();
+ return;
+ }
+ }
+ m_retryUnlockWithEmptyPassword = false;
m_ui->messageWidget->showMessage(error, MessageWidget::MessageType::Error);
return;
}
@@ -236,7 +269,7 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
{
auto masterKey = QSharedPointer<CompositeKey>::create();
- if (m_ui->checkPassword->isChecked()) {
+ if (!m_ui->editPassword->text().isEmpty() || m_retryUnlockWithEmptyPassword) {
masterKey->addKey(QSharedPointer<PasswordKey>::create(m_ui->editPassword->text()));
}
@@ -260,11 +293,11 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
#endif
QHash<QString, QVariant> lastKeyFiles = config()->get("LastKeyFiles").toHash();
- QHash<QString, QVariant> lastChallengeResponse = config()->get("LastChallengeResponse").toHash();
+ lastKeyFiles.remove(m_filename);
- if (m_ui->checkKeyFile->isChecked()) {
- auto key = QSharedPointer<FileKey>::create();
- QString keyFilename = m_ui->comboKeyFile->currentText();
+ auto key = QSharedPointer<FileKey>::create();
+ QString keyFilename = m_ui->comboKeyFile->currentText();
+ if (!m_ui->comboKeyFile->currentText().isEmpty() && m_keyFileComboEdited) {
QString errorMsg;
if (!key->load(keyFilename, &errorMsg)) {
m_ui->messageWidget->showMessage(tr("Failed to open key file: %1").arg(errorMsg), MessageWidget::Error);
@@ -289,14 +322,6 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
}
masterKey->addKey(key);
lastKeyFiles[m_filename] = keyFilename;
- } else {
- lastKeyFiles.remove(m_filename);
- }
-
- if (m_ui->checkChallengeResponse->isChecked()) {
- lastChallengeResponse[m_filename] = true;
- } else {
- lastChallengeResponse.remove(m_filename);
}
if (config()->get("RememberLastKeyFiles").toBool()) {
@@ -304,19 +329,23 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
}
#ifdef WITH_XC_YUBIKEY
- if (config()->get("RememberLastKeyFiles").toBool()) {
- config()->set("LastChallengeResponse", lastChallengeResponse);
- }
+ QHash<QString, QVariant> lastChallengeResponse = config()->get("LastChallengeResponse").toHash();
+ lastChallengeResponse.remove(m_filename);
- if (m_ui->checkChallengeResponse->isChecked()) {
- int selectionIndex = m_ui->comboChallengeResponse->currentIndex();
+ int selectionIndex = m_ui->comboChallengeResponse->currentIndex();
+ if (selectionIndex > 0) {
int comboPayload = m_ui->comboChallengeResponse->itemData(selectionIndex).toInt();
// read blocking mode from LSB and slot index number from second LSB
bool blocking = comboPayload & 1;
int slot = comboPayload >> 1;
- auto key = QSharedPointer<YkChallengeResponseKey>(new YkChallengeResponseKey(slot, blocking));
- masterKey->addChallengeResponseKey(key);
+ auto crKey = QSharedPointer<YkChallengeResponseKey>(new YkChallengeResponseKey(slot, blocking));
+ masterKey->addChallengeResponseKey(crKey);
+ lastChallengeResponse[m_filename] = true;
+ }
+
+ if (config()->get("RememberLastKeyFiles").toBool()) {
+ config()->set("LastChallengeResponse", lastChallengeResponse);
}
#endif
@@ -328,24 +357,6 @@ void DatabaseOpenWidget::reject()
emit dialogFinished(false);
}
-void DatabaseOpenWidget::activatePassword()
-{
- bool hasPassword = !m_ui->editPassword->text().isEmpty();
- m_ui->checkPassword->setChecked(hasPassword);
-}
-
-void DatabaseOpenWidget::activateKeyFile()
-{
- bool hasKeyFile = !m_ui->comboKeyFile->lineEdit()->text().isEmpty();
- m_ui->checkKeyFile->setChecked(hasKeyFile);
-}
-
-void DatabaseOpenWidget::activateChallengeResponse()
-{
- bool hasCR = m_ui->comboChallengeResponse->currentData().toInt() != -1;
- m_ui->checkChallengeResponse->setChecked(hasCR);
-}
-
void DatabaseOpenWidget::browseKeyFile()
{
QString filters = QString("%1 (*);;%2 (*.key)").arg(tr("All files"), tr("Key files"));
@@ -355,15 +366,33 @@ void DatabaseOpenWidget::browseKeyFile()
QString filename = fileDialog()->getOpenFileName(this, tr("Select key file"), QString(), filters);
if (!filename.isEmpty()) {
- m_ui->comboKeyFile->lineEdit()->setText(filename);
+ m_ui->comboKeyFile->setCurrentIndex(-1);
+ m_ui->comboKeyFile->setEditText(filename);
}
}
+void DatabaseOpenWidget::clearKeyFileEdit()
+{
+ m_ui->comboKeyFile->setCurrentIndex(0);
+ // make sure that handler is called even if 0 was the current index already
+ handleKeyFileComboChanged();
+}
+
+void DatabaseOpenWidget::handleKeyFileComboEdited()
+{
+ m_keyFileComboEdited = true;
+ m_ui->keyFileClearIcon->setVisible(true);
+}
+
+void DatabaseOpenWidget::handleKeyFileComboChanged()
+{
+ m_keyFileComboEdited = m_ui->comboKeyFile->currentIndex() != 0;
+ m_ui->keyFileClearIcon->setVisible(m_keyFileComboEdited);
+}
+
void DatabaseOpenWidget::pollYubikey()
{
m_ui->buttonRedetectYubikey->setEnabled(false);
- m_ui->checkChallengeResponse->setEnabled(false);
- m_ui->checkChallengeResponse->setChecked(false);
m_ui->comboChallengeResponse->setEnabled(false);
m_ui->comboChallengeResponse->clear();
m_ui->comboChallengeResponse->addItem(tr("Select slot..."), -1);
@@ -382,7 +411,6 @@ void DatabaseOpenWidget::yubikeyDetected(int slot, bool blocking)
if (config()->get("RememberLastKeyFiles").toBool()) {
QHash<QString, QVariant> lastChallengeResponse = config()->get("LastChallengeResponse").toHash();
if (lastChallengeResponse.contains(m_filename)) {
- m_ui->checkChallengeResponse->setChecked(true);
m_ui->comboChallengeResponse->setCurrentIndex(1);
}
}
@@ -391,7 +419,6 @@ void DatabaseOpenWidget::yubikeyDetected(int slot, bool blocking)
void DatabaseOpenWidget::yubikeyDetectComplete()
{
m_ui->comboChallengeResponse->setEnabled(true);
- m_ui->checkChallengeResponse->setEnabled(true);
m_ui->buttonRedetectYubikey->setEnabled(true);
m_ui->yubikeyProgress->setVisible(false);
m_yubiKeyBeingPolled = false;
@@ -403,3 +430,8 @@ void DatabaseOpenWidget::noYubikeyFound()
m_ui->yubikeyProgress->setVisible(false);
m_yubiKeyBeingPolled = false;
}
+
+void DatabaseOpenWidget::openHardwareKeyHelp()
+{
+ QDesktopServices::openUrl(QUrl("https://keepassxc.org/docs#hwtoken"));
+} \ No newline at end of file
diff --git a/src/gui/DatabaseOpenWidget.h b/src/gui/DatabaseOpenWidget.h
index 72f07cfa8..1ea05ca9f 100644
--- a/src/gui/DatabaseOpenWidget.h
+++ b/src/gui/DatabaseOpenWidget.h
@@ -60,21 +60,24 @@ protected slots:
void reject();
private slots:
- void activatePassword();
- void activateKeyFile();
- void activateChallengeResponse();
void browseKeyFile();
+ void clearKeyFileEdit();
+ void handleKeyFileComboEdited();
+ void handleKeyFileComboChanged();
void yubikeyDetected(int slot, bool blocking);
void yubikeyDetectComplete();
void noYubikeyFound();
+ void openHardwareKeyHelp();
protected:
const QScopedPointer<Ui::DatabaseOpenWidget> m_ui;
QSharedPointer<Database> m_db;
QString m_filename;
+ bool m_retryUnlockWithEmptyPassword = false;
private:
bool m_yubiKeyBeingPolled = false;
+ bool m_keyFileComboEdited = false;
Q_DISABLE_COPY(DatabaseOpenWidget)
};
diff --git a/src/gui/DatabaseOpenWidget.ui b/src/gui/DatabaseOpenWidget.ui
index 641d67da0..ac60413b7 100644
--- a/src/gui/DatabaseOpenWidget.ui
+++ b/src/gui/DatabaseOpenWidget.ui
@@ -6,14 +6,14 @@
<rect>
<x>0</x>
<y>0</y>
- <width>841</width>
- <height>467</height>
+ <width>592</width>
+ <height>462</height>
</rect>
</property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>8</number>
- </property>
+ <property name="accessibleName">
+ <string>Unlock KeePassXC Database</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0,2">
<item>
<widget class="MessageWidget" name="messageWidget" native="true"/>
</item>
@@ -22,216 +22,469 @@
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QVBoxLayout" name="labelLayout">
- <property name="leftMargin">
- <number>5</number>
- </property>
- <property name="rightMargin">
- <number>5</number>
- </property>
- <item>
- <widget class="QLabel" name="labelHeadline">
- <property name="text">
- <string>Enter master key</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="labelFilename"/>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
<property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
+ <enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
- <height>20</height>
+ <height>5</height>
</size>
</property>
</spacer>
</item>
<item>
- <layout class="QGridLayout" name="gridLayout">
- <property name="leftMargin">
- <number>5</number>
+ <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,1,0">
+ <property name="spacing">
+ <number>0</number>
</property>
- <property name="verticalSpacing">
- <number>8</number>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
</property>
- <item row="1" column="0" alignment="Qt::AlignVCenter">
- <widget class="QCheckBox" name="checkKeyFile">
- <property name="text">
- <string>Key File:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0" alignment="Qt::AlignVCenter">
- <widget class="QCheckBox" name="checkPassword">
- <property name="text">
- <string>Password:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <layout class="QHBoxLayout" name="keyFileLayout">
- <property name="leftMargin">
- <number>5</number>
- </property>
- <property name="rightMargin">
- <number>5</number>
- </property>
- <item>
- <widget class="QComboBox" name="comboKeyFile">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="editable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="buttonBrowseFile">
- <property name="text">
- <string>Browse</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="2">
- <layout class="QHBoxLayout" name="passwordLayout">
- <property name="leftMargin">
- <number>5</number>
- </property>
- <property name="rightMargin">
- <number>5</number>
- </property>
- <item>
- <widget class="PasswordEdit" name="editPassword">
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="buttonTogglePassword">
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="2">
- <layout class="QGridLayout" name="gridLayout_2">
- <property name="leftMargin">
- <number>5</number>
- </property>
- <property name="rightMargin">
- <number>5</number>
- </property>
- <property name="verticalSpacing">
- <number>0</number>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
</property>
- <item row="0" column="1">
- <widget class="QPushButton" name="buttonRedetectYubikey">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Refresh</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QComboBox" name="comboChallengeResponse">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="editable">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QProgressBar" name="yubikeyProgress">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>2</height>
- </size>
- </property>
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>0</number>
- </property>
- <property name="value">
- <number>-1</number>
- </property>
- <property name="textVisible">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="checkChallengeResponse">
- <property name="enabled">
- <bool>false</bool>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
</property>
- <property name="text">
- <string>Challenge Response:</string>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
</property>
- </widget>
+ </spacer>
</item>
- <item row="3" column="0">
- <widget class="QCheckBox" name="checkTouchID">
- <property name="text">
- <string>TouchID for quick unlock</string>
+ <item>
+ <widget class="QWidget" name="formContainer" native="true">
+ <property name="maximumSize">
+ <size>
+ <width>700</width>
+ <height>16777215</height>
+ </size>
</property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelHeadline">
+ <property name="font">
+ <font>
+ <pointsize>12</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Unlock KeePassXC Database</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="ElidedLabel" name="fileNameLabel">
+ <property name="text">
+ <string notr="true">filename.kdbx</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>439</width>
+ <height>13</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QFrame" name="horizontalFrame">
+ <property name="minimumSize">
+ <size>
+ <width>550</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="topMargin">
+ <number>15</number>
+ </property>
+ <property name="rightMargin">
+ <number>20</number>
+ </property>
+ <property name="bottomMargin">
+ <number>15</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="verticalFrame">
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>700</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Enter Password:</string>
+ </property>
+ <property name="buddy">
+ <cstring>editPassword</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="passwordLayout">
+ <item>
+ <widget class="PasswordEdit" name="editPassword">
+ <property name="accessibleName">
+ <string>Password field</string>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonTogglePassword">
+ <property name="toolTip">
+ <string>Toggle password visibility</string>
+ </property>
+ <property name="accessibleName">
+ <string>Toggle password visibility</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>5</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Enter Additional Credentials:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>15</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <property name="topMargin">
+ <number>3</number>
+ </property>
+ <item row="0" column="3">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="comboKeyFile">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="accessibleName">
+ <string>Key file selection</string>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="3">
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="1" column="2">
+ <widget class="QProgressBar" name="yubikeyProgress">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>2</height>
+ </size>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>-1</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="comboChallengeResponse">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="accessibleName">
+ <string>Hardware key slot selection</string>
+ </property>
+ <property name="editable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="4">
+ <widget class="QPushButton" name="buttonBrowseFile">
+ <property name="toolTip">
+ <string>Browse for key file</string>
+ </property>
+ <property name="accessibleName">
+ <string>Browse for key file</string>
+ </property>
+ <property name="text">
+ <string>Browse...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QPushButton" name="buttonRedetectYubikey">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip">
+ <string>Refresh hardware tokens</string>
+ </property>
+ <property name="accessibleName">
+ <string>Refresh hardware tokens</string>
+ </property>
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="hardwareKeyLabel">
+ <property name="text">
+ <string>Hardware Key:</string>
+ </property>
+ <property name="buddy">
+ <cstring>comboChallengeResponse</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="hardwareKeyLabelHelp">
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="toolTip">
+ <string>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
+ &lt;p&gt;Click for more information...&lt;/p&gt;</string>
+ </property>
+ <property name="accessibleName">
+ <string>Hardware key help</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QToolButton {
+ border: none;
+ background: none;
+ }</string>
+ </property>
+ <property name="text">
+ <string notr="true">?</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>12</width>
+ <height>12</height>
+ </size>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="keyFileLabel">
+ <property name="text">
+ <string>Key File:</string>
+ </property>
+ <property name="buddy">
+ <cstring>comboKeyFile</cstring>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QWidget" name="touchIDContainer" native="true">
+ <layout class="QHBoxLayout" name="touchIDLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkTouchID">
+ <property name="text">
+ <string>TouchID for Quick Unlock</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="dialogButtonsLayout">
+ <property name="topMargin">
+ <number>15</number>
+ </property>
+ <item alignment="Qt::AlignRight">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
- <item row="3" column="2">
- <spacer name="verticalSpacer_4">
+ <item>
+ <spacer name="horizontalSpacer_4">
<property name="orientation">
- <enum>Qt::Vertical</enum>
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>20</width>
- <height>40</height>
+ <width>0</width>
+ <height>0</height>
</size>
</property>
</spacer>
@@ -239,36 +492,30 @@
</layout>
</item>
<item>
- <layout class="QHBoxLayout" name="dialogButtonsLayout">
- <property name="leftMargin">
- <number>5</number>
- </property>
- <property name="rightMargin">
- <number>5</number>
- </property>
- <item alignment="Qt::AlignRight">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
- <height>40</height>
+ <height>55</height>
</size>
</property>
</spacer>
</item>
</layout>
+ <action name="keyFileClearIcon">
+ <property name="text">
+ <string>Clear</string>
+ </property>
+ <property name="toolTip">
+ <string>Clear Key File</string>
+ </property>
+ </action>
</widget>
<customwidgets>
<customwidget>
@@ -282,14 +529,21 @@
<header>gui/MessageWidget.h</header>
<container>1</container>
</customwidget>
+ <customwidget>
+ <class>ElidedLabel</class>
+ <extends>QLabel</extends>
+ <header>gui/widgets/ElidedLabel.h</header>
+ </customwidget>
</customwidgets>
<tabstops>
- <tabstop>checkPassword</tabstop>
<tabstop>editPassword</tabstop>
<tabstop>buttonTogglePassword</tabstop>
- <tabstop>checkKeyFile</tabstop>
<tabstop>comboKeyFile</tabstop>
<tabstop>buttonBrowseFile</tabstop>
+ <tabstop>hardwareKeyLabelHelp</tabstop>
+ <tabstop>comboChallengeResponse</tabstop>
+ <tabstop>buttonRedetectYubikey</tabstop>
+ <tabstop>checkTouchID</tabstop>
</tabstops>
<resources/>
<connections/>
diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp
index 92d706b6e..4c8458e52 100644
--- a/src/gui/DatabaseTabWidget.cpp
+++ b/src/gui/DatabaseTabWidget.cpp
@@ -30,6 +30,7 @@
#include "core/Metadata.h"
#include "core/Tools.h"
#include "format/CsvExporter.h"
+#include "format/HtmlExporter.h"
#include "gui/Clipboard.h"
#include "gui/DatabaseOpenDialog.h"
#include "gui/DatabaseWidget.h"
@@ -116,15 +117,17 @@ QSharedPointer<Database> DatabaseTabWidget::execNewDatabaseWizard()
return db;
}
-void DatabaseTabWidget::newDatabase()
+DatabaseWidget* DatabaseTabWidget::newDatabase()
{
auto db = execNewDatabaseWizard();
if (!db) {
- return;
+ return nullptr;
}
- addDatabaseTab(new DatabaseWidget(db, this));
+ auto dbWidget = new DatabaseWidget(db, this);
+ addDatabaseTab(dbWidget);
db->markAsModified();
+ return dbWidget;
}
void DatabaseTabWidget::openDatabase()
@@ -187,18 +190,24 @@ void DatabaseTabWidget::addDatabaseTab(DatabaseWidget* dbWidget, bool inBackgrou
{
Q_ASSERT(dbWidget->database());
+ // emit before index change
+ emit databaseOpened(dbWidget);
+
int index = addTab(dbWidget, "");
updateTabName(index);
toggleTabbar();
-
if (!inBackground) {
setCurrentIndex(index);
}
+ connect(dbWidget,
+ SIGNAL(requestOpenDatabase(QString, bool, QString, QString)),
+ SLOT(addDatabaseTab(QString, bool, QString, QString)));
connect(dbWidget, SIGNAL(databaseFilePathChanged(QString, QString)), SLOT(updateTabName()));
- connect(
- dbWidget, SIGNAL(requestOpenDatabase(QString, bool, QString)), SLOT(addDatabaseTab(QString, bool, QString)));
connect(dbWidget, SIGNAL(closeRequest()), SLOT(closeDatabaseTabFromSender()));
+ connect(dbWidget,
+ SIGNAL(databaseReplaced(const QSharedPointer<Database>&, const QSharedPointer<Database>&)),
+ SLOT(updateTabName()));
connect(dbWidget, SIGNAL(databaseModified()), SLOT(updateTabName()));
connect(dbWidget, SIGNAL(databaseSaved()), SLOT(updateTabName()));
connect(dbWidget, SIGNAL(databaseUnlocked()), SLOT(updateTabName()));
@@ -258,6 +267,20 @@ void DatabaseTabWidget::importKeePass1Database()
dbWidget->switchToImportKeepass1(fileName);
}
+void DatabaseTabWidget::importOpVaultDatabase()
+{
+ QString fileName = fileDialog()->getExistingDirectory(this, "Open .opvault database");
+
+ if (fileName.isEmpty()) {
+ return;
+ }
+
+ auto db = QSharedPointer<Database>::create();
+ auto* dbWidget = new DatabaseWidget(db, this);
+ addDatabaseTab(dbWidget);
+ dbWidget->switchToImportOpVault(fileName);
+}
+
/**
* Attempt to close the current database and remove its tab afterwards.
*
@@ -371,8 +394,12 @@ void DatabaseTabWidget::exportToCsv()
return;
}
- QString fileName = fileDialog()->getSaveFileName(
- this, tr("Export database to CSV file"), QString(), tr("CSV file").append(" (*.csv)"), nullptr, nullptr, "csv");
+ if (!warnOnExport()) {
+ return;
+ }
+
+ const QString fileName = fileDialog()->getSaveFileName(
+ this, tr("Export database to CSV file"), QString(), tr("CSV file").append(" (*.csv)"), nullptr, nullptr);
if (fileName.isEmpty()) {
return;
}
@@ -384,6 +411,43 @@ void DatabaseTabWidget::exportToCsv()
}
}
+void DatabaseTabWidget::exportToHtml()
+{
+ auto db = databaseWidgetFromIndex(currentIndex())->database();
+ if (!db) {
+ Q_ASSERT(false);
+ return;
+ }
+
+ if (!warnOnExport()) {
+ return;
+ }
+
+ const QString fileName = fileDialog()->getSaveFileName(
+ this, tr("Export database to HTML file"), QString(), tr("HTML file").append(" (*.html)"), nullptr, nullptr);
+ if (fileName.isEmpty()) {
+ return;
+ }
+
+ HtmlExporter htmlExporter;
+ if (!htmlExporter.exportDatabase(fileName, db)) {
+ emit messageGlobal(tr("Writing the HTML file failed.").append("\n").append(htmlExporter.errorString()),
+ MessageWidget::Error);
+ }
+}
+
+bool DatabaseTabWidget::warnOnExport()
+{
+ auto ans =
+ MessageBox::question(this,
+ tr("Export Confirmation"),
+ tr("You are about to export your database to an unencrypted file. This will leave your "
+ "passwords and sensitive information vulnerable! Are you sure you want to continue?"),
+ MessageBox::Yes | MessageBox::No,
+ MessageBox::No);
+ return ans == MessageBox::Yes;
+}
+
void DatabaseTabWidget::changeMasterKey()
{
currentDatabaseWidget()->switchToMasterKeyChange();
diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h
index bafbfa37a..87e9bbf77 100644
--- a/src/gui/DatabaseTabWidget.h
+++ b/src/gui/DatabaseTabWidget.h
@@ -60,14 +60,16 @@ public slots:
bool closeDatabaseTabFromSender();
void updateTabName(int index = -1);
- void newDatabase();
+ DatabaseWidget* newDatabase();
void openDatabase();
void mergeDatabase();
void importCsv();
void importKeePass1Database();
+ void importOpVaultDatabase();
bool saveDatabase(int index = -1);
bool saveDatabaseAs(int index = -1);
void exportToCsv();
+ void exportToHtml();
void lockDatabases();
void closeDatabaseFromSender();
@@ -80,6 +82,7 @@ public slots:
void performGlobalAutoType();
signals:
+ void databaseOpened(DatabaseWidget* dbWidget);
void databaseClosed(const QString& filePath);
void databaseUnlocked(DatabaseWidget* dbWidget);
void databaseLocked(DatabaseWidget* dbWidget);
@@ -96,6 +99,7 @@ private slots:
private:
QSharedPointer<Database> execNewDatabaseWizard();
void updateLastDatabases(const QString& filename);
+ bool warnOnExport();
QPointer<DatabaseWidgetStateSync> m_dbWidgetStateSync;
QPointer<DatabaseWidget> m_dbWidgetPendingLock;
diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp
index 51a0d7d81..45645fa55 100644
--- a/src/gui/DatabaseWidget.cpp
+++ b/src/gui/DatabaseWidget.cpp
@@ -50,6 +50,7 @@
#include "gui/FileDialog.h"
#include "gui/KeePass1OpenWidget.h"
#include "gui/MessageBox.h"
+#include "gui/OpVaultOpenWidget.h"
#include "gui/TotpDialog.h"
#include "gui/TotpExportSettingsDialog.h"
#include "gui/TotpSetupDialog.h"
@@ -61,6 +62,10 @@
#include "keeshare/KeeShare.h"
#include "touchid/TouchID.h"
+#ifdef WITH_XC_NETWORKING
+#include "gui/IconDownloaderDialog.h"
+#endif
+
#ifdef Q_OS_LINUX
#include <sys/vfs.h>
#endif
@@ -86,9 +91,9 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
, m_databaseSettingDialog(new DatabaseSettingsDialog(this))
, m_databaseOpenWidget(new DatabaseOpenWidget(this))
, m_keepass1OpenWidget(new KeePass1OpenWidget(this))
+ , m_opVaultOpenWidget(new OpVaultOpenWidget(this))
, m_groupView(new GroupView(m_db.data(), m_mainSplitter))
, m_saveAttempts(0)
- , m_fileWatcher(new DelayingFileWatcher(this))
{
m_messageWidget->setHidden(true);
@@ -160,6 +165,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
m_databaseSettingDialog->setObjectName("databaseSettingsDialog");
m_databaseOpenWidget->setObjectName("databaseOpenWidget");
m_keepass1OpenWidget->setObjectName("keepass1OpenWidget");
+ m_opVaultOpenWidget->setObjectName("opVaultOpenWidget");
addChildWidget(m_mainWidget);
addChildWidget(m_editEntryWidget);
@@ -169,6 +175,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
addChildWidget(m_databaseOpenWidget);
addChildWidget(m_csvImportWizard);
addChildWidget(m_keepass1OpenWidget);
+ addChildWidget(m_opVaultOpenWidget);
// clang-format off
connect(m_mainSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(mainSplitterSizesChanged()));
@@ -189,8 +196,8 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
connect(m_databaseSettingDialog, SIGNAL(editFinished(bool)), SLOT(switchToMainView(bool)));
connect(m_databaseOpenWidget, SIGNAL(dialogFinished(bool)), SLOT(loadDatabase(bool)));
connect(m_keepass1OpenWidget, SIGNAL(dialogFinished(bool)), SLOT(loadDatabase(bool)));
+ connect(m_opVaultOpenWidget, SIGNAL(dialogFinished(bool)), SLOT(loadDatabase(bool)));
connect(m_csvImportWizard, SIGNAL(importFinished(bool)), SLOT(csvImportFinished(bool)));
- connect(m_fileWatcher.data(), SIGNAL(fileChanged()), this, SLOT(reloadDatabaseFile()));
connect(this, SIGNAL(currentChanged(int)), SLOT(emitCurrentModeChanged()));
// clang-format on
@@ -257,6 +264,11 @@ bool DatabaseWidget::isSearchActive() const
return m_entryView->inSearchMode();
}
+bool DatabaseWidget::isEntryEditActive() const
+{
+ return currentWidget() == m_editEntryWidget;
+}
+
bool DatabaseWidget::isEditWidgetModified() const
{
if (currentWidget() == m_editEntryWidget) {
@@ -363,29 +375,18 @@ void DatabaseWidget::createEntry()
m_newEntry->setUuid(QUuid::createUuid());
m_newEntry->setUsername(m_db->metadata()->defaultUserName());
m_newParent = m_groupView->currentGroup();
- setIconFromParent();
+ m_newParent->applyGroupIconOnCreateTo(m_newEntry.data());
switchToEntryEdit(m_newEntry.data(), true);
}
-void DatabaseWidget::setIconFromParent()
+void DatabaseWidget::replaceDatabase(QSharedPointer<Database> db)
{
- if (!config()->get("UseGroupIconOnEntryCreation").toBool()) {
- return;
- }
-
- if (m_newParent->iconNumber() == Group::DefaultIconNumber && m_newParent->iconUuid().isNull()) {
- return;
+ // Save off new parent UUID which will be valid when creating a new entry
+ QUuid newParentUuid;
+ if (m_newParent) {
+ newParentUuid = m_newParent->uuid();
}
- if (m_newParent->iconUuid().isNull()) {
- m_newEntry->setIcon(m_newParent->iconNumber());
- } else {
- m_newEntry->setIcon(m_newParent->iconUuid());
- }
-}
-
-void DatabaseWidget::replaceDatabase(QSharedPointer<Database> db)
-{
// TODO: instead of increasing the ref count temporarily, there should be a clean
// break from the old database. Without this crashes occur due to the change
// signals triggering dangling pointers.
@@ -394,6 +395,18 @@ void DatabaseWidget::replaceDatabase(QSharedPointer<Database> db)
connectDatabaseSignals();
m_groupView->changeDatabase(m_db);
processAutoOpen();
+
+ // Restore the new parent group pointer, if not found default to the root group
+ // this prevents data loss when merging a database while creating a new entry
+ if (!newParentUuid.isNull()) {
+ m_newParent = m_db->rootGroup()->findGroupByUuid(newParentUuid);
+ if (!m_newParent) {
+ m_newParent = m_db->rootGroup();
+ }
+ }
+
+ emit databaseReplaced(oldDb, m_db);
+
#if defined(WITH_XC_KEESHARE)
KeeShare::instance()->connectDatabase(m_db, oldDb);
#else
@@ -404,7 +417,7 @@ void DatabaseWidget::replaceDatabase(QSharedPointer<Database> db)
void DatabaseWidget::cloneEntry()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return;
@@ -416,7 +429,7 @@ void DatabaseWidget::cloneEntry()
void DatabaseWidget::showTotp()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return;
@@ -428,7 +441,7 @@ void DatabaseWidget::showTotp()
void DatabaseWidget::copyTotp()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return;
@@ -438,7 +451,7 @@ void DatabaseWidget::copyTotp()
void DatabaseWidget::setupTotp()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return;
@@ -462,6 +475,11 @@ void DatabaseWidget::deleteSelectedEntries()
selectedEntries.append(m_entryView->entryFromIndex(index));
}
+ deleteEntries(std::move(selectedEntries));
+}
+
+void DatabaseWidget::deleteEntries(QList<Entry*> selectedEntries)
+{
// Confirm entry removal before moving forward
auto* recycleBin = m_db->metadata()->recycleBin();
bool permanent = (recycleBin && recycleBin->findEntryByUuid(selectedEntries.first()->uuid()))
@@ -570,7 +588,7 @@ void DatabaseWidget::setFocus()
void DatabaseWidget::copyTitle()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->title()));
}
@@ -578,7 +596,7 @@ void DatabaseWidget::copyTitle()
void DatabaseWidget::copyUsername()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->username()));
}
@@ -586,7 +604,7 @@ void DatabaseWidget::copyUsername()
void DatabaseWidget::copyPassword()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->password()));
}
@@ -594,7 +612,7 @@ void DatabaseWidget::copyPassword()
void DatabaseWidget::copyURL()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->url()));
}
@@ -602,7 +620,7 @@ void DatabaseWidget::copyURL()
void DatabaseWidget::copyNotes()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->notes()));
}
@@ -610,7 +628,7 @@ void DatabaseWidget::copyNotes()
void DatabaseWidget::copyAttribute(QAction* action)
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
setClipboardTextAndMinimize(
currentEntry->resolveMultiplePlaceholders(currentEntry->attributes()->value(action->data().toString())));
@@ -619,7 +637,7 @@ void DatabaseWidget::copyAttribute(QAction* action)
void DatabaseWidget::showTotpKeyQrCode()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
auto totpDisplayDialog = new TotpExportSettingsDialog(this, currentEntry);
totpDisplayDialog->open();
@@ -629,14 +647,18 @@ void DatabaseWidget::showTotpKeyQrCode()
void DatabaseWidget::setClipboardTextAndMinimize(const QString& text)
{
clipboard()->setText(text);
- if (config()->get("MinimizeOnCopy").toBool()) {
- window()->showMinimized();
+ if (config()->get("HideWindowOnCopy").toBool()) {
+ if (config()->get("MinimizeOnCopy").toBool()) {
+ window()->showMinimized();
+ } else if (config()->get("DropToBackgroundOnCopy").toBool()) {
+ window()->lower();
+ }
}
}
void DatabaseWidget::performAutoType()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
autoType()->performAutoType(currentEntry, window());
}
@@ -644,12 +666,47 @@ void DatabaseWidget::performAutoType()
void DatabaseWidget::openUrl()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
if (currentEntry) {
openUrlForEntry(currentEntry);
}
}
+void DatabaseWidget::downloadSelectedFavicons()
+{
+#ifdef WITH_XC_NETWORKING
+ QList<Entry*> selectedEntries;
+ for (const auto& index : m_entryView->selectionModel()->selectedRows()) {
+ selectedEntries.append(m_entryView->entryFromIndex(index));
+ }
+
+ // Force download even if icon already exists
+ performIconDownloads(selectedEntries, true);
+#endif
+}
+
+void DatabaseWidget::downloadAllFavicons()
+{
+#ifdef WITH_XC_NETWORKING
+ auto currentGroup = m_groupView->currentGroup();
+ if (currentGroup) {
+ performIconDownloads(currentGroup->entries());
+ }
+#endif
+}
+
+void DatabaseWidget::performIconDownloads(const QList<Entry*>& entries, bool force)
+{
+#ifdef WITH_XC_NETWORKING
+ auto* iconDownloaderDialog = new IconDownloaderDialog(this);
+ connect(this, SIGNAL(databaseLockRequested()), iconDownloaderDialog, SLOT(close()));
+ iconDownloaderDialog->downloadFavicons(m_db, entries, force);
+#else
+ Q_UNUSED(entries);
+ Q_UNUSED(force);
+#endif
+}
+
void DatabaseWidget::openUrlForEntry(Entry* entry)
{
Q_ASSERT(entry);
@@ -660,15 +717,10 @@ void DatabaseWidget::openUrlForEntry(Entry* entry)
QString cmdString = entry->resolveMultiplePlaceholders(entry->url());
if (cmdString.startsWith("cmd://")) {
// check if decision to execute command was stored
- if (entry->attributes()->hasKey(EntryAttributes::RememberCmdExecAttr)) {
- if (entry->attributes()->value(EntryAttributes::RememberCmdExecAttr) == "1") {
- QProcess::startDetached(cmdString.mid(6));
- }
- return;
- }
+ bool launch = (entry->attributes()->value(EntryAttributes::RememberCmdExecAttr) == "1");
// otherwise ask user
- if (cmdString.length() > 6) {
+ if (!launch && cmdString.length() > 6) {
QString cmdTruncated = cmdString.mid(6);
if (cmdTruncated.length() > 400) {
cmdTruncated = cmdTruncated.left(400) + " […]";
@@ -691,22 +743,41 @@ void DatabaseWidget::openUrlForEntry(Entry* entry)
});
int result = msgbox.exec();
- if (result == QMessageBox::Yes) {
- QProcess::startDetached(cmdString.mid(6));
- }
+ launch = (result == QMessageBox::Yes);
if (remember) {
entry->attributes()->set(EntryAttributes::RememberCmdExecAttr, result == QMessageBox::Yes ? "1" : "0");
}
}
+
+ if (launch) {
+ QProcess::startDetached(cmdString.mid(6));
+
+ if (config()->get("MinimizeOnOpenUrl").toBool()) {
+ window()->showMinimized();
+ }
+ }
} else {
- QUrl url = QUrl(entry->url());
+ QUrl url = QUrl::fromUserInput(entry->resolveMultiplePlaceholders(entry->url()));
if (!url.isEmpty()) {
QDesktopServices::openUrl(url);
+
+ if (config()->get("MinimizeOnOpenUrl").toBool()) {
+ window()->showMinimized();
+ }
}
}
}
+Entry* DatabaseWidget::currentSelectedEntry()
+{
+ if (currentWidget() == m_editEntryWidget) {
+ return m_editEntryWidget->currentEntry();
+ }
+
+ return m_entryView->currentEntry();
+}
+
void DatabaseWidget::createGroup()
{
Q_ASSERT(m_groupView->currentGroup());
@@ -803,7 +874,8 @@ void DatabaseWidget::switchToMainView(bool previousDialogAccepted)
void DatabaseWidget::switchToHistoryView(Entry* entry)
{
- m_historyEditEntryWidget->loadEntry(entry, false, true, m_editEntryWidget->entryTitle(), m_db);
+ auto entryTitle = m_editEntryWidget->currentEntry() ? m_editEntryWidget->currentEntry()->title() : "";
+ m_historyEditEntryWidget->loadEntry(entry, false, true, entryTitle, m_db);
setCurrentWidget(m_historyEditEntryWidget);
}
@@ -827,10 +899,13 @@ void DatabaseWidget::switchToEntryEdit(Entry* entry, bool create)
group = currentGroup();
} else {
group = entry->group();
+ // Ensure we have only this entry selected
+ m_entryView->setCurrentEntry(entry);
}
Q_ASSERT(group);
+ // Setup the entry edit widget and display
m_editEntryWidget->loadEntry(entry, create, false, group->name(), m_db);
setCurrentWidget(m_editEntryWidget);
}
@@ -851,6 +926,7 @@ void DatabaseWidget::connectDatabaseSignals()
connect(m_db.data(), SIGNAL(databaseModified()), SIGNAL(databaseModified()));
connect(m_db.data(), SIGNAL(databaseModified()), SLOT(onDatabaseModified()));
connect(m_db.data(), SIGNAL(databaseSaved()), SIGNAL(databaseSaved()));
+ connect(m_db.data(), SIGNAL(databaseFileChanged()), this, SLOT(reloadDatabaseFile()));
}
void DatabaseWidget::loadDatabase(bool accepted)
@@ -864,11 +940,12 @@ void DatabaseWidget::loadDatabase(bool accepted)
if (accepted) {
replaceDatabase(openWidget->database());
switchToMainView();
- m_fileWatcher->restart();
m_saveAttempts = 0;
emit databaseUnlocked();
+ if (config()->get("MinimizeAfterUnlock").toBool()) {
+ window()->showMinimized();
+ }
} else {
- m_fileWatcher->stop();
if (m_databaseOpenWidget->database()) {
m_databaseOpenWidget->database().reset();
}
@@ -898,9 +975,9 @@ void DatabaseWidget::mergeDatabase(bool accepted)
}
Merger merger(srcDb.data(), m_db.data());
- bool databaseChanged = merger.merge();
+ QStringList changeList = merger.merge();
- if (databaseChanged) {
+ if (!changeList.isEmpty()) {
showMessage(tr("Successfully merged the database files."), MessageWidget::Information);
} else {
showMessage(tr("Database was not modified by merge operation."), MessageWidget::Information);
@@ -940,7 +1017,8 @@ void DatabaseWidget::unlockDatabase(bool accepted)
}
replaceDatabase(db);
if (db->isReadOnly()) {
- showMessage(tr("File opened in read only mode."), MessageWidget::Warning, false, -1);
+ showMessage(
+ tr("This database is opened in read-only mode. Autosave is disabled."), MessageWidget::Warning, false, -1);
}
restoreGroupEntryFocus(m_groupBeforeLock, m_entryBeforeLock);
@@ -1015,7 +1093,6 @@ void DatabaseWidget::switchToOpenDatabase()
void DatabaseWidget::switchToOpenDatabase(const QString& filePath)
{
- updateFilePath(filePath);
m_databaseOpenWidget->load(filePath);
setCurrentWidget(m_databaseOpenWidget);
}
@@ -1043,15 +1120,19 @@ void DatabaseWidget::csvImportFinished(bool accepted)
void DatabaseWidget::switchToImportKeepass1(const QString& filePath)
{
- updateFilePath(filePath);
m_keepass1OpenWidget->load(filePath);
setCurrentWidget(m_keepass1OpenWidget);
}
-void DatabaseWidget::switchToEntryEdit()
+void DatabaseWidget::switchToImportOpVault(const QString& fileName)
{
- Entry* entry = m_entryView->currentEntry();
+ m_opVaultOpenWidget->load(fileName);
+ setCurrentWidget(m_opVaultOpenWidget);
+}
+void DatabaseWidget::switchToEntryEdit()
+{
+ auto entry = m_entryView->currentEntry();
if (!entry) {
return;
}
@@ -1061,8 +1142,7 @@ void DatabaseWidget::switchToEntryEdit()
void DatabaseWidget::switchToGroupEdit()
{
- Group* group = m_groupView->currentGroup();
-
+ auto group = m_groupView->currentGroup();
if (!group) {
return;
}
@@ -1070,6 +1150,16 @@ void DatabaseWidget::switchToGroupEdit()
switchToGroupEdit(group, false);
}
+void DatabaseWidget::sortGroupsAsc()
+{
+ m_groupView->sortGroups();
+}
+
+void DatabaseWidget::sortGroupsDesc()
+{
+ m_groupView->sortGroups(true);
+}
+
void DatabaseWidget::switchToMasterKeyChange()
{
switchToDatabaseSettings();
@@ -1164,7 +1254,7 @@ void DatabaseWidget::onGroupChanged(Group* group)
void DatabaseWidget::onDatabaseModified()
{
- if (!m_blockAutoSave && config()->get("AutoSaveAfterEveryChange").toBool()) {
+ if (!m_blockAutoSave && config()->get("AutoSaveAfterEveryChange").toBool() && !m_db->isReadOnly()) {
save();
} else {
// Only block once, then reset
@@ -1253,6 +1343,8 @@ bool DatabaseWidget::lock()
return true;
}
+ emit databaseLockRequested();
+
clipboard()->clearCopiedText();
if (isEditWidgetModified()) {
@@ -1301,8 +1393,9 @@ bool DatabaseWidget::lock()
m_groupBeforeLock = m_db->rootGroup()->uuid();
}
- if (m_entryView->currentEntry()) {
- m_entryBeforeLock = m_entryView->currentEntry()->uuid();
+ auto currentEntry = currentSelectedEntry();
+ if (currentEntry) {
+ m_entryBeforeLock = currentEntry->uuid();
}
endSearch();
@@ -1317,21 +1410,6 @@ bool DatabaseWidget::lock()
return true;
}
-void DatabaseWidget::updateFilePath(const QString& filePath)
-{
- m_fileWatcher->start(filePath);
- m_db->setFilePath(filePath);
-}
-
-void DatabaseWidget::blockAutoReload(bool block)
-{
- if (block) {
- m_fileWatcher->ignoreFileChanges();
- } else {
- m_fileWatcher->observeFileChanges(true);
- }
-}
-
void DatabaseWidget::reloadDatabaseFile()
{
if (!m_db || isLocked()) {
@@ -1350,22 +1428,20 @@ void DatabaseWidget::reloadDatabaseFile()
if (result == MessageBox::No) {
// Notify everyone the database does not match the file
m_db->markAsModified();
- // Rewatch the database file
- m_fileWatcher->restart();
return;
}
}
QString error;
auto db = QSharedPointer<Database>::create(m_db->filePath());
- if (db->open(database()->key(), &error, true)) {
+ if (db->open(database()->key(), &error)) {
if (m_db->isModified()) {
// Ask if we want to merge changes into new database
auto result = MessageBox::question(
this,
tr("Merge Request"),
tr("The database file has changed and you have unsaved changes.\nDo you want to merge your changes?"),
- MessageBox::Merge | MessageBox::Cancel,
+ MessageBox::Merge | MessageBox::Discard,
MessageBox::Merge);
if (result == MessageBox::Merge) {
@@ -1375,11 +1451,9 @@ void DatabaseWidget::reloadDatabaseFile()
}
}
- QUuid groupBeforeReload;
+ QUuid groupBeforeReload = m_db->rootGroup()->uuid();
if (m_groupView && m_groupView->currentGroup()) {
groupBeforeReload = m_groupView->currentGroup()->uuid();
- } else {
- groupBeforeReload = m_db->rootGroup()->uuid();
}
QUuid entryBeforeReload;
@@ -1387,19 +1461,15 @@ void DatabaseWidget::reloadDatabaseFile()
entryBeforeReload = m_entryView->currentEntry()->uuid();
}
- bool isReadOnly = m_db->isReadOnly();
replaceDatabase(db);
- m_db->setReadOnly(isReadOnly);
restoreGroupEntryFocus(groupBeforeReload, entryBeforeReload);
+ m_blockAutoSave = false;
} else {
showMessage(tr("Could not open the new database file while attempting to autoreload.\nError: %1").arg(error),
MessageWidget::Error);
// Mark db as modified since existing data may differ from file or file was deleted
m_db->markAsModified();
}
-
- // Rewatch the database file
- m_fileWatcher->restart();
}
int DatabaseWidget::numberOfSelectedEntries() const
@@ -1425,7 +1495,7 @@ void DatabaseWidget::restoreGroupEntryFocus(const QUuid& groupUuid, const QUuid&
auto group = m_db->rootGroup()->findGroupByUuid(groupUuid);
if (group) {
m_groupView->setCurrentGroup(group);
- auto entry = group->findEntryByUuid(entryUuid);
+ auto entry = group->findEntryByUuid(entryUuid, false);
if (entry) {
m_entryView->setCurrentEntry(entry);
}
@@ -1444,7 +1514,7 @@ bool DatabaseWidget::currentEntryHasFocus()
bool DatabaseWidget::currentEntryHasTitle()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return false;
@@ -1454,7 +1524,7 @@ bool DatabaseWidget::currentEntryHasTitle()
bool DatabaseWidget::currentEntryHasUsername()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return false;
@@ -1464,7 +1534,7 @@ bool DatabaseWidget::currentEntryHasUsername()
bool DatabaseWidget::currentEntryHasPassword()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return false;
@@ -1474,7 +1544,7 @@ bool DatabaseWidget::currentEntryHasPassword()
bool DatabaseWidget::currentEntryHasUrl()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return false;
@@ -1484,7 +1554,7 @@ bool DatabaseWidget::currentEntryHasUrl()
bool DatabaseWidget::currentEntryHasTotp()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return false;
@@ -1494,7 +1564,7 @@ bool DatabaseWidget::currentEntryHasTotp()
bool DatabaseWidget::currentEntryHasNotes()
{
- Entry* currentEntry = m_entryView->currentEntry();
+ auto currentEntry = currentSelectedEntry();
Q_ASSERT(currentEntry);
if (!currentEntry) {
return false;
@@ -1519,7 +1589,6 @@ EntryView* DatabaseWidget::entryView()
* ask to disable safe saves if it is unable to save after the third attempt.
* Set `attempt` to -1 to disable this behavior.
*
- * @param attempt current save attempt or -1 to disable attempts
* @return true on success
*/
bool DatabaseWidget::save()
@@ -1538,7 +1607,6 @@ bool DatabaseWidget::save()
}
// Prevent recursions and infinite save loops
- blockAutoReload(true);
m_blockAutoSave = true;
++m_saveAttempts;
@@ -1546,7 +1614,6 @@ bool DatabaseWidget::save()
bool useAtomicSaves = config()->get("UseAtomicSaves", true).toBool();
QString errorMessage;
bool ok = m_db->save(&errorMessage, useAtomicSaves, config()->get("BackupBeforeSave").toBool());
- blockAutoReload(false);
if (ok) {
m_saveAttempts = 0;
@@ -1590,13 +1657,8 @@ bool DatabaseWidget::saveAs()
oldFilePath = QDir::toNativeSeparators(config()->get("LastDir", QDir::homePath()).toString() + "/"
+ tr("Passwords").append(".kdbx"));
}
- QString newFilePath = fileDialog()->getSaveFileName(this,
- tr("Save database as"),
- oldFilePath,
- tr("KeePass 2 Database").append(" (*.kdbx)"),
- nullptr,
- nullptr,
- "kdbx");
+ const QString newFilePath = fileDialog()->getSaveFileName(
+ this, tr("Save database as"), oldFilePath, tr("KeePass 2 Database").append(" (*.kdbx)"), nullptr, nullptr);
if (!newFilePath.isEmpty()) {
// Ensure we don't recurse back into this function
@@ -1676,6 +1738,8 @@ void DatabaseWidget::processAutoOpen()
continue;
}
QFileInfo filepath;
+ QFileInfo keyfile;
+
if (entry->url().startsWith("file://")) {
QUrl url(entry->url());
filepath.setFile(url.toLocalFile());
@@ -1691,7 +1755,20 @@ void DatabaseWidget::processAutoOpen()
continue;
}
- // Request to open the database file in the background
- emit requestOpenDatabase(filepath.canonicalFilePath(), true, entry->password());
+ if (!entry->username().isEmpty()) {
+ if (entry->username().startsWith("file://")) {
+ QUrl keyfileUrl(entry->username());
+ keyfile.setFile(keyfileUrl.toLocalFile());
+ } else {
+ keyfile.setFile(entry->username());
+ if (keyfile.isRelative()) {
+ QFileInfo currentpath(m_db->filePath());
+ keyfile.setFile(currentpath.absoluteDir(), entry->username());
+ }
+ }
+ }
+
+ // Request to open the database file in the background with a password and keyfile
+ emit requestOpenDatabase(filepath.canonicalFilePath(), true, entry->password(), keyfile.canonicalFilePath());
}
}
diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h
index fb9cf817e..6f40c65c5 100644
--- a/src/gui/DatabaseWidget.h
+++ b/src/gui/DatabaseWidget.h
@@ -25,17 +25,17 @@
#include <QTimer>
#include "DatabaseOpenDialog.h"
+#include "config-keepassx.h"
#include "gui/MessageWidget.h"
#include "gui/csvImport/CsvImportWizard.h"
#include "gui/entry/EntryModel.h"
-#include "config-keepassx.h"
-
class DatabaseOpenWidget;
class KeePass1OpenWidget;
+class OpVaultOpenWidget;
class DatabaseSettingsDialog;
class Database;
-class DelayingFileWatcher;
+class FileWatcher;
class EditEntryWidget;
class EditGroupWidget;
class Entry;
@@ -80,6 +80,7 @@ public:
DatabaseWidget::Mode currentMode() const;
bool isLocked() const;
bool isSearchActive() const;
+ bool isEntryEditActive() const;
QString getCurrentSearch();
void refreshSearch();
@@ -108,8 +109,6 @@ public:
bool currentEntryHasNotes();
bool currentEntryHasTotp();
- void blockAutoReload(bool block = true);
-
QByteArray entryViewState() const;
bool setEntryViewState(const QByteArray& state) const;
QList<int> mainSplitterSizes() const;
@@ -123,13 +122,18 @@ signals:
void databaseModified();
void databaseSaved();
void databaseUnlocked();
+ void databaseLockRequested();
void databaseLocked();
+ // Emitted in replaceDatabase, may be caused by lock, reload, unlock, load.
+ void databaseReplaced(const QSharedPointer<Database>& oldDb, const QSharedPointer<Database>& newDb);
+
void closeRequest();
void currentModeChanged(DatabaseWidget::Mode mode);
void groupChanged();
void entrySelectionChanged();
- void requestOpenDatabase(const QString& filePath, bool inBackground, const QString& password);
+ void
+ requestOpenDatabase(const QString& filePath, bool inBackground, const QString& password, const QString& keyFile);
void databaseMerged(QSharedPointer<Database> mergedDb);
void groupContextMenuRequested(const QPoint& globalPos);
void entryContextMenuRequested(const QPoint& globalPos);
@@ -151,6 +155,7 @@ public slots:
void createEntry();
void cloneEntry();
void deleteSelectedEntries();
+ void deleteEntries(QList<Entry*> entries);
void setFocus();
void copyTitle();
void copyUsername();
@@ -164,12 +169,16 @@ public slots:
void setupTotp();
void performAutoType();
void openUrl();
+ void downloadSelectedFavicons();
+ void downloadAllFavicons();
void openUrlForEntry(Entry* entry);
void createGroup();
void deleteGroup();
void switchToMainView(bool previousDialogAccepted = false);
void switchToEntryEdit();
void switchToGroupEdit();
+ void sortGroupsAsc();
+ void sortGroupsDesc();
void switchToMasterKeyChange();
void switchToDatabaseSettings();
void switchToOpenDatabase();
@@ -179,6 +188,7 @@ public slots:
void performUnlockDatabase(const QString& password, const QString& keyfile = {});
void csvImportFinished(bool accepted);
void switchToImportKeepass1(const QString& filePath);
+ void switchToImportOpVault(const QString& fileName);
void emptyRecycleBin();
// Search related slots
@@ -199,7 +209,6 @@ protected:
void showEvent(QShowEvent* event) override;
private slots:
- void updateFilePath(const QString& filePath);
void entryActivationSignalReceived(Entry* entry, EntryModel::ModelColumn column);
void switchBackToEntryEdit();
void switchToHistoryView(Entry* entry);
@@ -223,9 +232,10 @@ private slots:
private:
int addChildWidget(QWidget* w);
void setClipboardTextAndMinimize(const QString& text);
- void setIconFromParent();
void processAutoOpen();
bool confirmDeleteEntries(QList<Entry*> entries, bool permanent);
+ void performIconDownloads(const QList<Entry*>& entries, bool force = false);
+ Entry* currentSelectedEntry();
QSharedPointer<Database> m_db;
@@ -243,6 +253,7 @@ private:
QPointer<DatabaseSettingsDialog> m_databaseSettingDialog;
QPointer<DatabaseOpenWidget> m_databaseOpenWidget;
QPointer<KeePass1OpenWidget> m_keepass1OpenWidget;
+ QPointer<OpVaultOpenWidget> m_opVaultOpenWidget;
QPointer<GroupView> m_groupView;
QPointer<EntryView> m_entryView;
@@ -261,7 +272,6 @@ private:
bool m_searchLimitGroup;
// Autoreload
- QPointer<DelayingFileWatcher> m_fileWatcher;
bool m_blockAutoSave;
};
diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp
index dcc5160a3..83bc0fc35 100644
--- a/src/gui/EditWidgetIcons.cpp
+++ b/src/gui/EditWidgetIcons.cpp
@@ -28,11 +28,8 @@
#include "core/Tools.h"
#include "gui/IconModels.h"
#include "gui/MessageBox.h"
-
#ifdef WITH_XC_NETWORKING
-#include <QHostInfo>
-#include <QNetworkAccessManager>
-#include <QtNetwork>
+#include "core/IconDownloader.h"
#endif
IconStruct::IconStruct()
@@ -45,18 +42,20 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent)
: QWidget(parent)
, m_ui(new Ui::EditWidgetIcons())
, m_db(nullptr)
-#ifdef WITH_XC_NETWORKING
- , m_netMgr(new QNetworkAccessManager(this))
- , m_reply(nullptr)
-#endif
+ , m_applyIconTo(ApplyIconToOptions::THIS_ONLY)
, m_defaultIconModel(new DefaultIconModel(this))
, m_customIconModel(new CustomIconModel(this))
+#ifdef WITH_XC_NETWORKING
+ , m_downloader(new IconDownloader())
+#endif
{
m_ui->setupUi(this);
m_ui->defaultIconsView->setModel(m_defaultIconModel);
m_ui->customIconsView->setModel(m_customIconModel);
+ m_ui->applyIconToPushButton->setMenu(createApplyIconToMenu());
+
// clang-format off
connect(m_ui->defaultIconsView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateRadioButtonDefaultIcons()));
connect(m_ui->customIconsView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateRadioButtonCustomIcons()));
@@ -65,12 +64,18 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent)
connect(m_ui->addButton, SIGNAL(clicked()), SLOT(addCustomIconFromFile()));
connect(m_ui->deleteButton, SIGNAL(clicked()), SLOT(removeCustomIcon()));
connect(m_ui->faviconButton, SIGNAL(clicked()), SLOT(downloadFavicon()));
+ connect(m_ui->applyIconToPushButton->menu(), SIGNAL(triggered(QAction*)), SLOT(confirmApplyIconTo(QAction*)));
connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SIGNAL(widgetUpdated()));
connect(m_ui->defaultIconsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SIGNAL(widgetUpdated()));
connect(m_ui->customIconsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SIGNAL(widgetUpdated()));
+#ifdef WITH_XC_NETWORKING
+ connect(m_downloader.data(),
+ SIGNAL(finished(const QString&, const QImage&)),
+ SLOT(iconReceived(const QString&, const QImage&)));
+#endif
// clang-format on
m_ui->faviconButton->setVisible(false);
@@ -103,6 +108,8 @@ IconStruct EditWidgetIcons::state()
}
}
+ iconStruct.applyTo = m_applyIconTo;
+
return iconStruct;
}
@@ -142,12 +149,36 @@ void EditWidgetIcons::load(const QUuid& currentUuid,
m_ui->defaultIconsRadio->setChecked(true);
}
}
+
+ m_applyIconTo = ApplyIconToOptions::THIS_ONLY;
+ m_ui->applyIconToPushButton->menu()->defaultAction()->activate(QAction::Trigger);
+}
+
+void EditWidgetIcons::setShowApplyIconToButton(bool state)
+{
+ m_ui->applyIconToPushButton->setVisible(state);
+}
+
+QMenu* EditWidgetIcons::createApplyIconToMenu()
+{
+ auto* applyIconToMenu = new QMenu(this);
+ QAction* defaultAction = applyIconToMenu->addAction(tr("Apply to this only"));
+ defaultAction->setData(QVariant::fromValue(ApplyIconToOptions::THIS_ONLY));
+ applyIconToMenu->setDefaultAction(defaultAction);
+ applyIconToMenu->addSeparator();
+ applyIconToMenu->addAction(tr("Also apply to child groups"))
+ ->setData(QVariant::fromValue(ApplyIconToOptions::CHILD_GROUPS));
+ applyIconToMenu->addAction(tr("Also apply to child entries"))
+ ->setData(QVariant::fromValue(ApplyIconToOptions::CHILD_ENTRIES));
+ applyIconToMenu->addAction(tr("Also apply to all children"))
+ ->setData(QVariant::fromValue(ApplyIconToOptions::ALL_CHILDREN));
+ return applyIconToMenu;
}
void EditWidgetIcons::setUrl(const QString& url)
{
#ifdef WITH_XC_NETWORKING
- m_url = QUrl(url);
+ m_url = url;
m_ui->faviconButton->setVisible(!url.isEmpty());
#else
Q_UNUSED(url);
@@ -155,223 +186,95 @@ void EditWidgetIcons::setUrl(const QString& url)
#endif
}
-#ifdef WITH_XC_NETWORKING
-namespace
-{
- // Try to get the 2nd level domain of the host part of a QUrl. For example,
- // "foo.bar.example.com" would become "example.com", and "foo.bar.example.co.uk"
- // would become "example.co.uk".
- QString getSecondLevelDomain(const QUrl& url)
- {
- QString fqdn = url.host();
- fqdn.truncate(fqdn.length() - url.topLevelDomain().length());
- QStringList parts = fqdn.split('.');
- QString newdom = parts.takeLast() + url.topLevelDomain();
- return newdom;
- }
-
- QUrl convertVariantToUrl(const QVariant& var)
- {
- QUrl url;
- if (var.canConvert<QUrl>())
- url = var.toUrl();
- return url;
- }
-
- QUrl getRedirectTarget(QNetworkReply* reply)
- {
- QVariant var = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
- QUrl url = convertVariantToUrl(var);
- return url;
- }
-} // namespace
-#endif
-
void EditWidgetIcons::downloadFavicon()
{
#ifdef WITH_XC_NETWORKING
- m_ui->faviconButton->setDisabled(true);
-
- m_redirects = 0;
- m_urlsToTry.clear();
-
- QString fullyQualifiedDomain = m_url.host();
-
- // Determine if host portion of URL is an IP address by resolving it and
- // searching for a match with the returned address(es).
- bool hostIsIp = false;
- QList<QHostAddress> hostAddressess = QHostInfo::fromName(fullyQualifiedDomain).addresses();
- for (auto addr : hostAddressess) {
- if (addr.toString() == fullyQualifiedDomain) {
- hostIsIp = true;
- }
+ if (!m_url.isEmpty()) {
+ m_downloader->setUrl(m_url);
+ m_downloader->download();
}
-
- // Determine the second-level domain, if available
- QString secondLevelDomain;
- if (!hostIsIp) {
- secondLevelDomain = getSecondLevelDomain(m_url);
- }
-
- // Start with the "fallback" url (if enabled) to try to get the best favicon
- if (config()->get("security/IconDownloadFallback", false).toBool()) {
- QUrl fallbackUrl = QUrl("https://icons.duckduckgo.com");
- fallbackUrl.setPath("/ip3/" + QUrl::toPercentEncoding(fullyQualifiedDomain) + ".ico");
- m_urlsToTry.append(fallbackUrl);
-
- // Also try a direct pull of the second-level domain (if possible)
- if (!hostIsIp && fullyQualifiedDomain != secondLevelDomain) {
- fallbackUrl.setPath("/ip3/" + QUrl::toPercentEncoding(secondLevelDomain) + ".ico");
- m_urlsToTry.append(fallbackUrl);
- }
- }
-
- // Add a direct pull of the website's own favicon.ico file
- m_urlsToTry.append(QUrl(m_url.scheme() + "://" + fullyQualifiedDomain + "/favicon.ico"));
-
- // Also try a direct pull of the second-level domain (if possible)
- if (!hostIsIp && fullyQualifiedDomain != secondLevelDomain) {
- m_urlsToTry.append(QUrl(m_url.scheme() + "://" + secondLevelDomain + "/favicon.ico"));
- }
-
- // Use the first URL to start the download process
- // If a favicon is not found, the next URL will be tried
- startFetchFavicon(m_urlsToTry.takeFirst());
-#endif
-}
-
-void EditWidgetIcons::fetchReadyRead()
-{
-#ifdef WITH_XC_NETWORKING
- m_bytesReceived += m_reply->readAll();
#endif
}
-void EditWidgetIcons::fetchFinished()
+void EditWidgetIcons::iconReceived(const QString& url, const QImage& icon)
{
#ifdef WITH_XC_NETWORKING
- QImage image;
- bool fallbackEnabled = config()->get("security/IconDownloadFallback", false).toBool();
- bool error = (m_reply->error() != QNetworkReply::NoError);
- QUrl redirectTarget = getRedirectTarget(m_reply);
-
- m_reply->deleteLater();
- m_reply = nullptr;
-
- if (!error) {
- if (redirectTarget.isValid()) {
- // Redirected, we need to follow it, or fall through if we have
- // done too many redirects already.
- if (m_redirects < 5) {
- m_redirects++;
- if (redirectTarget.isRelative())
- redirectTarget = m_fetchUrl.resolved(redirectTarget);
- startFetchFavicon(redirectTarget);
- return;
- }
- } else {
- // No redirect, and we theoretically have some icon data now.
- image.loadFromData(m_bytesReceived);
- }
- }
-
- if (!image.isNull()) {
- if (!addCustomIcon(image)) {
- emit messageEditEntry(tr("Custom icon already exists"), MessageWidget::Information);
- } else if (!isVisible()) {
- // Show confirmation message if triggered from Entry tab download button
- emit messageEditEntry(tr("Custom icon successfully downloaded"), MessageWidget::Positive);
+ Q_UNUSED(url);
+ if (icon.isNull()) {
+ QString message(tr("Unable to fetch favicon."));
+ if (!config()->get("security/IconDownloadFallback", false).toBool()) {
+ message.append("\n").append(
+ tr("You can enable the DuckDuckGo website icon service under Tools -> Settings -> Security"));
}
- } else if (!m_urlsToTry.empty()) {
- m_redirects = 0;
- startFetchFavicon(m_urlsToTry.takeFirst());
+ emit messageEditEntry(message, MessageWidget::Error);
return;
- } else {
- if (!fallbackEnabled) {
- emit messageEditEntry(
- tr("Unable to fetch favicon.") + "\n"
- + tr("You can enable the DuckDuckGo website icon service under Tools -> Settings -> Security"),
- MessageWidget::Error);
- } else {
- emit messageEditEntry(tr("Unable to fetch favicon."), MessageWidget::Error);
- }
}
- m_ui->faviconButton->setDisabled(false);
+ if (!addCustomIcon(icon)) {
+ emit messageEditEntry(tr("Existing icon selected."), MessageWidget::Information);
+ }
+#else
+ Q_UNUSED(url);
+ Q_UNUSED(icon);
#endif
}
void EditWidgetIcons::abortRequests()
{
#ifdef WITH_XC_NETWORKING
- if (m_reply) {
- m_reply->abort();
+ if (m_downloader) {
+ m_downloader->abortDownload();
}
#endif
}
-void EditWidgetIcons::startFetchFavicon(const QUrl& url)
-{
-#ifdef WITH_XC_NETWORKING
- m_bytesReceived.clear();
-
- m_fetchUrl = url;
-
- QNetworkRequest request(url);
-
- m_reply = m_netMgr->get(request);
- connect(m_reply, &QNetworkReply::finished, this, &EditWidgetIcons::fetchFinished);
- connect(m_reply, &QIODevice::readyRead, this, &EditWidgetIcons::fetchReadyRead);
-#else
- Q_UNUSED(url);
-#endif
-}
-
void EditWidgetIcons::addCustomIconFromFile()
{
- if (m_db) {
- QString filter = QString("%1 (%2);;%3 (*)").arg(tr("Images"), Tools::imageReaderFilter(), tr("All files"));
-
- auto filenames = QFileDialog::getOpenFileNames(this, tr("Select Image(s)"), "", filter);
- if (!filenames.empty()) {
- QStringList errornames;
- int numexisting = 0;
- for (const auto& filename : filenames) {
- if (!filename.isEmpty()) {
- auto icon = QImage(filename);
- if (icon.isNull()) {
- errornames << filename;
- } else if (!addCustomIcon(icon)) {
- // Icon already exists in database
- ++numexisting;
- }
+ if (!m_db) {
+ return;
+ }
+
+ QString filter = QString("%1 (%2);;%3 (*)").arg(tr("Images"), Tools::imageReaderFilter(), tr("All files"));
+
+ auto filenames = QFileDialog::getOpenFileNames(this, tr("Select Image(s)"), "", filter);
+ if (!filenames.empty()) {
+ QStringList errornames;
+ int numexisting = 0;
+ for (const auto& filename : filenames) {
+ if (!filename.isEmpty()) {
+ auto icon = QImage(filename);
+ if (icon.isNull()) {
+ errornames << filename;
+ } else if (!addCustomIcon(icon)) {
+ // Icon already exists in database
+ ++numexisting;
}
}
+ }
- int numloaded = filenames.size() - errornames.size() - numexisting;
- QString msg;
+ int numloaded = filenames.size() - errornames.size() - numexisting;
+ QString msg;
- if (numloaded > 0) {
- msg = tr("Successfully loaded %1 of %n icon(s)", "", filenames.size()).arg(numloaded);
- } else {
- msg = tr("No icons were loaded");
- }
+ if (numloaded > 0) {
+ msg = tr("Successfully loaded %1 of %n icon(s)", "", filenames.size()).arg(numloaded);
+ } else {
+ msg = tr("No icons were loaded");
+ }
- if (numexisting > 0) {
- msg += "\n" + tr("%n icon(s) already exist in the database", "", numexisting);
- }
+ if (numexisting > 0) {
+ msg += "\n" + tr("%n icon(s) already exist in the database", "", numexisting);
+ }
- if (!errornames.empty()) {
- // Show the first 8 icons that failed to load
- errornames = errornames.mid(0, 8);
- emit messageEditEntry(msg + "\n" + tr("The following icon(s) failed:", "", errornames.size()) + "\n"
- + errornames.join("\n"),
- MessageWidget::Error);
- } else if (numloaded > 0) {
- emit messageEditEntry(msg, MessageWidget::Positive);
- } else {
- emit messageEditEntry(msg, MessageWidget::Information);
- }
+ if (!errornames.empty()) {
+ // Show the first 8 icons that failed to load
+ errornames = errornames.mid(0, 8);
+ emit messageEditEntry(msg + "\n" + tr("The following icon(s) failed:", "", errornames.size()) + "\n"
+ + errornames.join("\n"),
+ MessageWidget::Error);
+ } else if (numloaded > 0) {
+ emit messageEditEntry(msg, MessageWidget::Positive);
+ } else {
+ emit messageEditEntry(msg, MessageWidget::Information);
}
}
}
@@ -528,3 +431,9 @@ void EditWidgetIcons::updateRadioButtonCustomIcons()
{
m_ui->customIconsRadio->setChecked(true);
}
+
+void EditWidgetIcons::confirmApplyIconTo(QAction* action)
+{
+ m_applyIconTo = action->data().value<ApplyIconToOptions>();
+ m_ui->applyIconToPushButton->setText(action->text());
+}
diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h
index dcff02f56..2a95445f9 100644
--- a/src/gui/EditWidgetIcons.h
+++ b/src/gui/EditWidgetIcons.h
@@ -19,11 +19,13 @@
#ifndef KEEPASSX_EDITWIDGETICONS_H
#define KEEPASSX_EDITWIDGETICONS_H
+#include <QMenu>
#include <QUrl>
#include <QUuid>
#include <QWidget>
#include "config-keepassx.h"
+#include "core/Entry.h"
#include "core/Global.h"
#include "gui/MessageWidget.h"
@@ -31,8 +33,7 @@ class Database;
class DefaultIconModel;
class CustomIconModel;
#ifdef WITH_XC_NETWORKING
-class QNetworkAccessManager;
-class QNetworkReply;
+class IconDownloader;
#endif
namespace Ui
@@ -40,12 +41,23 @@ namespace Ui
class EditWidgetIcons;
}
+enum ApplyIconToOptions
+{
+ THIS_ONLY = 0b00,
+ CHILD_GROUPS = 0b10,
+ CHILD_ENTRIES = 0b01,
+ ALL_CHILDREN = 0b11
+};
+
+Q_DECLARE_METATYPE(ApplyIconToOptions)
+
struct IconStruct
{
IconStruct();
QUuid uuid;
int number;
+ ApplyIconToOptions applyTo;
};
class EditWidgetIcons : public QWidget
@@ -62,6 +74,7 @@ public:
const QSharedPointer<Database>& database,
const IconStruct& iconStruct,
const QString& url = "");
+ void setShowApplyIconToButton(bool state);
public slots:
void setUrl(const QString& url);
@@ -74,9 +87,7 @@ signals:
private slots:
void downloadFavicon();
- void startFetchFavicon(const QUrl& url);
- void fetchFinished();
- void fetchReadyRead();
+ void iconReceived(const QString& url, const QImage& icon);
void addCustomIconFromFile();
bool addCustomIcon(const QImage& icon);
void removeCustomIcon();
@@ -84,22 +95,21 @@ private slots:
void updateWidgetsCustomIcons(bool checked);
void updateRadioButtonDefaultIcons();
void updateRadioButtonCustomIcons();
+ void confirmApplyIconTo(QAction* action);
private:
+ QMenu* createApplyIconToMenu();
+
const QScopedPointer<Ui::EditWidgetIcons> m_ui;
QSharedPointer<Database> m_db;
QUuid m_currentUuid;
-#ifdef WITH_XC_NETWORKING
- QUrl m_url;
- QUrl m_fetchUrl;
- QList<QUrl> m_urlsToTry;
- QByteArray m_bytesReceived;
- QNetworkAccessManager* m_netMgr;
- QNetworkReply* m_reply;
- int m_redirects;
-#endif
+ ApplyIconToOptions m_applyIconTo;
DefaultIconModel* const m_defaultIconModel;
CustomIconModel* const m_customIconModel;
+#ifdef WITH_XC_NETWORKING
+ QScopedPointer<IconDownloader> m_downloader;
+ QString m_url;
+#endif
Q_DISABLE_COPY(EditWidgetIcons)
};
diff --git a/src/gui/EditWidgetIcons.ui b/src/gui/EditWidgetIcons.ui
index 84bfc8d15..9648cca08 100644
--- a/src/gui/EditWidgetIcons.ui
+++ b/src/gui/EditWidgetIcons.ui
@@ -88,7 +88,7 @@
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout">
+ <layout class="QHBoxLayout" name="customIconButtonsHorizontalLayout">
<item>
<widget class="QPushButton" name="addButton">
<property name="text">
@@ -105,6 +105,12 @@
</item>
<item>
<widget class="QPushButton" name="faviconButton">
+ <property name="toolTip">
+ <string>Download favicon for URL</string>
+ </property>
+ <property name="accessibleName">
+ <string>Download favicon for URL</string>
+ </property>
<property name="text">
<string>Download favicon</string>
</property>
@@ -112,6 +118,45 @@
</item>
</layout>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="applyToChildrenHorizontalLayout" stretch="0,0">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="applyIconToPushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Apply selected icon to subgroups and entries</string>
+ </property>
+ <property name="accessibleName">
+ <string>Apply selected icon to subgroups and entries</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">padding: 4px 10px</string>
+ </property>
+ <property name="text">
+ <string>Apply icon &amp;to ...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
<tabstops>
@@ -121,6 +166,7 @@
<tabstop>customIconsView</tabstop>
<tabstop>addButton</tabstop>
<tabstop>deleteButton</tabstop>
+ <tabstop>applyIconToPushButton</tabstop>
</tabstops>
<resources/>
<connections/>
diff --git a/src/gui/EditWidgetProperties.cpp b/src/gui/EditWidgetProperties.cpp
index dbaaf4148..84223c840 100644
--- a/src/gui/EditWidgetProperties.cpp
+++ b/src/gui/EditWidgetProperties.cpp
@@ -71,6 +71,11 @@ void EditWidgetProperties::setCustomData(CustomData* customData)
void EditWidgetProperties::removeSelectedPluginData()
{
+ QModelIndexList indexes = m_ui->customDataTable->selectionModel()->selectedRows(0);
+ if (indexes.isEmpty()) {
+ return;
+ }
+
auto result = MessageBox::question(this,
tr("Delete plugin data?"),
tr("Do you really want to delete the selected plugin data?\n"
@@ -82,14 +87,18 @@ void EditWidgetProperties::removeSelectedPluginData()
return;
}
- const QItemSelectionModel* itemSelectionModel = m_ui->customDataTable->selectionModel();
- if (itemSelectionModel) {
- for (const QModelIndex& index : itemSelectionModel->selectedRows(0)) {
- const QString key = index.data().toString();
- m_customData->remove(key);
- }
- update();
+ QStringList selectedData;
+ for (const auto& index : indexes) {
+ const QString key = index.data().toString();
+ selectedData.append(key);
}
+
+ std::sort(selectedData.begin(), selectedData.end());
+ for (const auto& key : selectedData) {
+ m_customData->remove(key);
+ }
+
+ update();
}
void EditWidgetProperties::toggleRemoveButton(const QItemSelection& selected)
diff --git a/src/gui/EditWidgetProperties.ui b/src/gui/EditWidgetProperties.ui
index fb8ed5030..d80bf1584 100644
--- a/src/gui/EditWidgetProperties.ui
+++ b/src/gui/EditWidgetProperties.ui
@@ -46,6 +46,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Datetime created</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
@@ -66,6 +69,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Datetime modified</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
@@ -80,6 +86,9 @@
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="accessedEdit">
+ <property name="accessibleName">
+ <string>Datetime accessed</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
@@ -94,6 +103,9 @@
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="uuidEdit">
+ <property name="accessibleName">
+ <string>Unique ID</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
@@ -109,6 +121,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableView" name="customDataTable">
+ <property name="accessibleName">
+ <string>Plugin data</string>
+ </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@@ -130,6 +145,9 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="removeCustomDataButton">
+ <property name="accessibleName">
+ <string>Remove selected plugin data</string>
+ </property>
<property name="text">
<string>Remove</string>
</property>
diff --git a/src/gui/EntryPreviewWidget.cpp b/src/gui/EntryPreviewWidget.cpp
index c90d0aa67..af8c1cd21 100644
--- a/src/gui/EntryPreviewWidget.cpp
+++ b/src/gui/EntryPreviewWidget.cpp
@@ -17,6 +17,7 @@
*/
#include "EntryPreviewWidget.h"
+#include "Font.h"
#include "ui_EntryPreviewWidget.h"
#include <QDesktopServices>
@@ -49,16 +50,21 @@ EntryPreviewWidget::EntryPreviewWidget(QWidget* parent)
// Entry
m_ui->entryTotpButton->setIcon(filePath()->icon("actions", "chronometer"));
m_ui->entryCloseButton->setIcon(filePath()->icon("actions", "dialog-close"));
+ m_ui->entryPasswordLabel->setFont(Font::fixedFont());
m_ui->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
+ m_ui->toggleEntryNotesButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
+ m_ui->toggleGroupNotesButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
m_ui->entryAttachmentsWidget->setReadOnly(true);
m_ui->entryAttachmentsWidget->setButtonsVisible(false);
connect(m_ui->entryUrlLabel, SIGNAL(linkActivated(QString)), SLOT(openEntryUrl()));
- connect(m_ui->entryTotpButton, SIGNAL(toggled(bool)), m_ui->entryTotpWidget, SLOT(setVisible(bool)));
+ connect(m_ui->entryTotpButton, SIGNAL(toggled(bool)), m_ui->entryTotpLabel, SLOT(setVisible(bool)));
connect(m_ui->entryCloseButton, SIGNAL(clicked()), SLOT(hide()));
connect(m_ui->togglePasswordButton, SIGNAL(clicked(bool)), SLOT(setPasswordVisible(bool)));
+ connect(m_ui->toggleEntryNotesButton, SIGNAL(clicked(bool)), SLOT(setEntryNotesVisible(bool)));
+ connect(m_ui->toggleGroupNotesButton, SIGNAL(clicked(bool)), SLOT(setGroupNotesVisible(bool)));
connect(m_ui->entryTabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndexes()), Qt::QueuedConnection);
connect(&m_totpTimer, SIGNAL(timeout()), SLOT(updateTotpLabel()));
@@ -66,6 +72,10 @@ EntryPreviewWidget::EntryPreviewWidget(QWidget* parent)
m_ui->groupCloseButton->setIcon(filePath()->icon("actions", "dialog-close"));
connect(m_ui->groupCloseButton, SIGNAL(clicked()), SLOT(hide()));
connect(m_ui->groupTabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndexes()), Qt::QueuedConnection);
+
+#if !defined(WITH_XC_KEESHARE)
+ removeTab(m_ui->groupTabWidget, m_ui->groupShareTab);
+#endif
}
EntryPreviewWidget::~EntryPreviewWidget()
@@ -84,9 +94,7 @@ void EntryPreviewWidget::setEntry(Entry* selectedEntry)
updateEntryHeaderLine();
updateEntryTotp();
updateEntryGeneralTab();
- updateEntryNotesTab();
- updateEntryAttributesTab();
- updateEntryAttachmentsTab();
+ updateEntryAdvancedTab();
updateEntryAutotypeTab();
setVisible(!config()->get("GUI/HidePreviewPanel").toBool());
@@ -107,7 +115,6 @@ void EntryPreviewWidget::setGroup(Group* selectedGroup)
m_currentGroup = selectedGroup;
updateGroupHeaderLine();
updateGroupGeneralTab();
- updateGroupNotesTab();
#if defined(WITH_XC_KEESHARE)
updateGroupSharingTab();
@@ -150,7 +157,7 @@ void EntryPreviewWidget::updateEntryTotp()
Q_ASSERT(m_currentEntry);
const bool hasTotp = m_currentEntry->hasTotp();
m_ui->entryTotpButton->setVisible(hasTotp);
- m_ui->entryTotpWidget->hide();
+ m_ui->entryTotpLabel->hide();
m_ui->entryTotpButton->setChecked(false);
if (hasTotp) {
@@ -165,13 +172,12 @@ void EntryPreviewWidget::updateEntryTotp()
void EntryPreviewWidget::setPasswordVisible(bool state)
{
const QString password = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password());
- auto flags = m_ui->entryPasswordLabel->textInteractionFlags();
if (state) {
m_ui->entryPasswordLabel->setRawText(password);
m_ui->entryPasswordLabel->setToolTip(password);
- m_ui->entryPasswordLabel->setTextInteractionFlags(flags | Qt::TextSelectableByMouse);
+ m_ui->entryPasswordLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
} else {
- m_ui->entryPasswordLabel->setTextInteractionFlags(flags & ~Qt::TextSelectableByMouse);
+ m_ui->entryPasswordLabel->setTextInteractionFlags(Qt::NoTextInteraction);
m_ui->entryPasswordLabel->setToolTip({});
if (password.isEmpty() && config()->get("security/passwordemptynodots").toBool()) {
m_ui->entryPasswordLabel->setRawText("");
@@ -181,6 +187,33 @@ void EntryPreviewWidget::setPasswordVisible(bool state)
}
}
+void EntryPreviewWidget::setEntryNotesVisible(bool state)
+{
+ setNotesVisible(m_ui->entryNotesLabel, m_currentEntry->notes(), state);
+}
+
+void EntryPreviewWidget::setGroupNotesVisible(bool state)
+{
+ setNotesVisible(m_ui->groupNotesLabel, m_currentGroup->notes(), state);
+}
+
+void EntryPreviewWidget::setNotesVisible(QLabel* notesLabel, const QString& notes, bool state)
+{
+ if (state) {
+ // Add html hyperlinks to notes that start with XXXX://
+ QString hyperlinkNotes = notes;
+ notesLabel->setText(hyperlinkNotes.replace(QRegExp("(\\w+:\\/\\/\\S+)"), "<a href=\"\\1\">\\1</a>"));
+ notesLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ } else {
+ if (notes.isEmpty()) {
+ notesLabel->setText("");
+ } else {
+ notesLabel->setText(QString("\u25cf").repeated(6));
+ }
+ notesLabel->setTextInteractionFlags(Qt::NoTextInteraction);
+ }
+}
+
void EntryPreviewWidget::updateEntryGeneralTab()
{
Q_ASSERT(m_currentEntry);
@@ -198,11 +231,26 @@ void EntryPreviewWidget::updateEntryGeneralTab()
m_ui->togglePasswordButton->setVisible(false);
}
+ if (config()->get("security/hidenotes").toBool()) {
+ setEntryNotesVisible(false);
+ m_ui->toggleEntryNotesButton->setVisible(!m_ui->entryNotesLabel->text().isEmpty());
+ m_ui->toggleEntryNotesButton->setChecked(false);
+ } else {
+ setEntryNotesVisible(true);
+ m_ui->toggleEntryNotesButton->setVisible(false);
+ }
+
+ if (config()->get("GUI/MonospaceNotes", false).toBool()) {
+ m_ui->entryNotesLabel->setFont(Font::fixedFont());
+ } else {
+ m_ui->entryNotesLabel->setFont(Font::defaultFont());
+ }
+
m_ui->entryUrlLabel->setRawText(m_currentEntry->displayUrl());
const QString url = m_currentEntry->url();
if (!url.isEmpty()) {
// URL is well formed and can be opened in a browser
- m_ui->entryUrlLabel->setUrl(url);
+ m_ui->entryUrlLabel->setUrl(m_currentEntry->resolveMultiplePlaceholders(url));
m_ui->entryUrlLabel->setCursor(Qt::PointingHandCursor);
m_ui->entryUrlLabel->setOpenExternalLinks(false);
} else {
@@ -216,23 +264,17 @@ void EntryPreviewWidget::updateEntryGeneralTab()
m_ui->entryExpirationLabel->setText(expires);
}
-void EntryPreviewWidget::updateEntryNotesTab()
-{
- Q_ASSERT(m_currentEntry);
- const QString notes = m_currentEntry->notes();
- setTabEnabled(m_ui->entryTabWidget, m_ui->entryNotesTab, !notes.isEmpty());
- m_ui->entryNotesEdit->setText(notes);
-}
-
-void EntryPreviewWidget::updateEntryAttributesTab()
+void EntryPreviewWidget::updateEntryAdvancedTab()
{
Q_ASSERT(m_currentEntry);
m_ui->entryAttributesEdit->clear();
const EntryAttributes* attributes = m_currentEntry->attributes();
const QStringList customAttributes = attributes->customKeys();
- const bool haveAttributes = !customAttributes.isEmpty();
- setTabEnabled(m_ui->entryTabWidget, m_ui->entryAttributesTab, haveAttributes);
- if (haveAttributes) {
+ const bool hasAttributes = !customAttributes.isEmpty();
+ const bool hasAttachments = !m_currentEntry->attachments()->isEmpty();
+
+ setTabEnabled(m_ui->entryTabWidget, m_ui->entryAdvancedTab, hasAttributes || hasAttachments);
+ if (hasAttributes) {
QString attributesText;
for (const QString& key : customAttributes) {
QString value = m_currentEntry->attributes()->value(key);
@@ -243,13 +285,7 @@ void EntryPreviewWidget::updateEntryAttributesTab()
}
m_ui->entryAttributesEdit->setText(attributesText);
}
-}
-void EntryPreviewWidget::updateEntryAttachmentsTab()
-{
- Q_ASSERT(m_currentEntry);
- const bool hasAttachments = !m_currentEntry->attachments()->isEmpty();
- setTabEnabled(m_ui->entryTabWidget, m_ui->entryAttachmentsTab, hasAttachments);
m_ui->entryAttachmentsWidget->setEntryAttachments(m_currentEntry->attachments());
}
@@ -290,14 +326,21 @@ void EntryPreviewWidget::updateGroupGeneralTab()
const QString expiresText =
groupTime.expires() ? groupTime.expiryTime().toString(Qt::DefaultLocaleShortDate) : tr("Never");
m_ui->groupExpirationLabel->setText(expiresText);
-}
-void EntryPreviewWidget::updateGroupNotesTab()
-{
- Q_ASSERT(m_currentGroup);
- const QString notes = m_currentGroup->notes();
- setTabEnabled(m_ui->groupTabWidget, m_ui->groupNotesTab, !notes.isEmpty());
- m_ui->groupNotesEdit->setText(notes);
+ if (config()->get("security/hidenotes").toBool()) {
+ setGroupNotesVisible(false);
+ m_ui->toggleGroupNotesButton->setVisible(!m_ui->groupNotesLabel->text().isEmpty());
+ m_ui->toggleGroupNotesButton->setChecked(false);
+ } else {
+ setGroupNotesVisible(true);
+ m_ui->toggleGroupNotesButton->setVisible(false);
+ }
+
+ if (config()->get("GUI/MonospaceNotes", false).toBool()) {
+ m_ui->groupNotesLabel->setFont(Font::fixedFont());
+ } else {
+ m_ui->groupNotesLabel->setFont(Font::defaultFont());
+ }
}
#if defined(WITH_XC_KEESHARE)
@@ -337,6 +380,13 @@ void EntryPreviewWidget::openEntryUrl()
}
}
+void EntryPreviewWidget::removeTab(QTabWidget* tabWidget, QWidget* widget)
+{
+ const int tabIndex = tabWidget->indexOf(widget);
+ Q_ASSERT(tabIndex != -1);
+ tabWidget->removeTab(tabIndex);
+}
+
void EntryPreviewWidget::setTabEnabled(QTabWidget* tabWidget, QWidget* widget, bool enabled)
{
const int tabIndex = tabWidget->indexOf(widget);
@@ -354,9 +404,9 @@ QPixmap EntryPreviewWidget::preparePixmap(const QPixmap& pixmap, int size)
QString EntryPreviewWidget::hierarchy(const Group* group, const QString& title)
{
- const QString separator(" / ");
+ const QString separator("] > [");
QStringList hierarchy = group->hierarchy();
- hierarchy.removeFirst();
- hierarchy.append(title);
- return QString("%1%2").arg(separator, hierarchy.join(separator));
+ QString groupList = QString("[%1]").arg(hierarchy.join(separator));
+
+ return title.isEmpty() ? groupList : QString("%1 > %2").arg(groupList, title);
}
diff --git a/src/gui/EntryPreviewWidget.h b/src/gui/EntryPreviewWidget.h
index 6a50c0feb..0887c49d4 100644
--- a/src/gui/EntryPreviewWidget.h
+++ b/src/gui/EntryPreviewWidget.h
@@ -49,15 +49,15 @@ private slots:
void updateEntryHeaderLine();
void updateEntryTotp();
void updateEntryGeneralTab();
- void updateEntryNotesTab();
- void updateEntryAttributesTab();
- void updateEntryAttachmentsTab();
+ void updateEntryAdvancedTab();
void updateEntryAutotypeTab();
void setPasswordVisible(bool state);
+ void setEntryNotesVisible(bool state);
+ void setGroupNotesVisible(bool state);
+ void setNotesVisible(QLabel* notesLabel, const QString& notes, bool state);
void updateGroupHeaderLine();
void updateGroupGeneralTab();
- void updateGroupNotesTab();
#if defined(WITH_XC_KEESHARE)
void updateGroupSharingTab();
#endif
@@ -67,6 +67,7 @@ private slots:
void openEntryUrl();
private:
+ void removeTab(QTabWidget* tabWidget, QWidget* widget);
void setTabEnabled(QTabWidget* tabWidget, QWidget* widget, bool enabled);
static QPixmap preparePixmap(const QPixmap& pixmap, int size);
diff --git a/src/gui/EntryPreviewWidget.ui b/src/gui/EntryPreviewWidget.ui
index 8322946bb..124923a77 100644
--- a/src/gui/EntryPreviewWidget.ui
+++ b/src/gui/EntryPreviewWidget.ui
@@ -1,934 +1,1162 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
- <class>EntryPreviewWidget</class>
- <widget class="QWidget" name="EntryPreviewWidget">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>573</width>
- <height>330</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_7">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <widget class="QStackedWidget" name="stackedWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="pageEntry">
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <layout class="QHBoxLayout" name="entryHorizontalLayout" stretch="0,0,0,0,0,0">
- <property name="sizeConstraint">
- <enum>QLayout::SetDefaultConstraint</enum>
- </property>
- <property name="leftMargin">
- <number>9</number>
- </property>
- <item>
- <widget class="QLabel" name="entryIcon">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="ElidedLabel" name="entryTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- </font>
- </property>
- <property name="textFormat">
- <enum>Qt::AutoText</enum>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="entryHorizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QWidget" name="entryTotpWidget" native="true">
- <layout class="QGridLayout" name="gridLayout_3">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QLabel" name="entryTotpLabel">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="entryTotpButton">
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="toolTip">
- <string>Generate TOTP Token</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="entryCloseButton">
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="toolTip">
- <string>Close</string>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QTabWidget" name="entryTabWidget">
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="currentIndex">
- <number>0</number>
- </property>
- <property name="documentMode">
- <bool>false</bool>
- </property>
- <property name="tabsClosable">
- <bool>false</bool>
- </property>
- <property name="movable">
- <bool>false</bool>
- </property>
- <widget class="QWidget" name="entryGeneralTab">
- <attribute name="title">
- <string>General</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <widget class="QWidget" name="entryGeneralWidget" native="true">
- <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0" columnstretch="0,0,0,0,0,0">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <spacer name="entryLeftHorizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="entryUsernameTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="text">
- <string>Username</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QLabel" name="entryUsernameLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">username</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="entryPasswordTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Password</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLabel" name="entryExpirationTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Expiration</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="4" column="4">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="4">
- <widget class="ElidedLabel" name="entryUrlLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="cursor">
- <cursorShape>PointingHandCursor</cursorShape>
- </property>
- <property name="text">
- <string notr="true">https://example.com</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse</set>
- </property>
- </widget>
- </item>
- <item row="3" column="4">
- <widget class="QLabel" name="entryExpirationLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string notr="true">expired</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="entryUrlTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>URL</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="3" colspan="2">
- <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="leftMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QToolButton" name="togglePasswordButton">
- <property name="text">
- <string/>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="ElidedLabel" name="entryPasswordLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">password</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0">
- <spacer name="entryLeftHorizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="0">
- <spacer name="entryLeftHorizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="0">
- <spacer name="entryLeftHorizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="entryAttributesTab">
- <attribute name="title">
- <string>Attributes</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTextEdit" name="entryAttributesEdit">
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="entryAttachmentsTab">
- <attribute name="title">
- <string>Attachments</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_6">
- <item>
- <widget class="EntryAttachmentsWidget" name="entryAttachmentsWidget" native="true"/>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="entryNotesTab">
- <attribute name="title">
- <string>Notes</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QTextEdit" name="entryNotesEdit">
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="entryAutotypeTab">
- <attribute name="title">
- <string>Autotype</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QTreeWidget" name="entryAutotypeTree">
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="showDropIndicator" stdset="0">
- <bool>true</bool>
- </property>
- <property name="rootIsDecorated">
- <bool>true</bool>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- <property name="columnCount">
- <number>2</number>
- </property>
- <attribute name="headerCascadingSectionResizes">
- <bool>false</bool>
- </attribute>
- <attribute name="headerDefaultSectionSize">
- <number>250</number>
- </attribute>
- <attribute name="headerMinimumSectionSize">
- <number>50</number>
- </attribute>
- <attribute name="headerStretchLastSection">
- <bool>true</bool>
- </attribute>
- <column>
- <property name="text">
- <string>Window</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Sequence</string>
- </property>
- </column>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="pageGroup">
- <layout class="QVBoxLayout" name="verticalLayout_13">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <layout class="QHBoxLayout" name="groupHorizontalLayout" stretch="0,0,0">
- <property name="sizeConstraint">
- <enum>QLayout::SetDefaultConstraint</enum>
- </property>
- <property name="leftMargin">
- <number>9</number>
- </property>
- <item>
- <widget class="QLabel" name="groupIcon">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="ElidedLabel" name="groupTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- </font>
- </property>
- <property name="textFormat">
- <enum>Qt::AutoText</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="groupCloseButton">
- <property name="toolTip">
- <string>Close</string>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QTabWidget" name="groupTabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <property name="documentMode">
- <bool>false</bool>
- </property>
- <property name="tabsClosable">
- <bool>false</bool>
- </property>
- <property name="movable">
- <bool>false</bool>
- </property>
- <widget class="QWidget" name="groupGeneralTab">
- <attribute name="title">
- <string>General</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_8">
- <item>
- <widget class="QWidget" name="groupGeneralWidget" native="true">
- <layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,0">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item row="2" column="2">
- <widget class="QLabel" name="groupExpirationLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="groupExpirationTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Expiration</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="groupAutotypeTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Autotype</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="groupAutotypeLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="groupSearchingLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <spacer name="groupLeftHorizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="groupSearchingTitleLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Searching</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="groupNotesTab">
- <attribute name="title">
- <string>Notes</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_11">
- <item>
- <widget class="QTextEdit" name="groupNotesEdit">
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="groupShareTab">
- <attribute name="title">
- <string>Share</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_12">
- <item>
- <widget class="QWidget" name="groupShareWidget" native="true">
- <layout class="QGridLayout" name="gridLayout_4">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item row="1" column="2">
- <widget class="QLabel" name="groupSharePathLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string notr="true">&lt;path&gt;</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="groupShareTypeLabel">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string notr="true">&lt;type&gt;</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>147</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
+ <class>EntryPreviewWidget</class>
+ <widget class="QWidget" name="EntryPreviewWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>566</width>
+ <height>169</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="pageEntry">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="entryHorizontalLayout" stretch="0,1,0,0,0">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <property name="leftMargin">
+ <number>9</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="entryIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="ElidedLabel" name="entryTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>12</pointsize>
+ </font>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="entryTotpLabel">
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string notr="true">1234567</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="entryTotpButton">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="toolTip">
+ <string>Display current TOTP value</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="entryCloseButton">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="toolTip">
+ <string>Close</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
</layout>
- <action name="searchIcon">
- <property name="text">
- <string>Search</string>
- </property>
- </action>
- <action name="clearIcon">
- <property name="text">
- <string>Clear</string>
- </property>
- </action>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="entryTabWidget">
+ <property name="focusPolicy">
+ <enum>Qt::ClickFocus</enum>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <property name="documentMode">
+ <bool>false</bool>
+ </property>
+ <property name="tabsClosable">
+ <bool>false</bool>
+ </property>
+ <property name="movable">
+ <bool>false</bool>
+ </property>
+ <widget class="QWidget" name="entryGeneralTab">
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QWidget" name="entryGeneralWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0" columnstretch="0,0,0,2,0,0,3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <spacer name="entryLeftHorizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="entryUsernameTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="text">
+ <string>Username</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="entryUsernameLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">username</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <spacer name="entryMiddleHorizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="5">
+ <widget class="QLabel" name="entryUrlTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>URL</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6">
+ <widget class="ElidedLabel" name="entryUrlLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::ClickFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true">https://example.com</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="entryLeftHorizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="entryPasswordTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Password</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="leftMargin">
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="togglePasswordButton">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="ElidedLabel" name="entryPasswordLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">password</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="4">
+ <spacer name="entryMiddleHorizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="5">
+ <widget class="QLabel" name="entryExpirationTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Expiration</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="6">
+ <widget class="QLabel" name="entryExpirationLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true">expired</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <spacer name="entryLeftHorizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="entryNotesTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="5">
+ <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,0">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="leftMargin">
+ <number>4</number>
+ </property>
+ <item alignment="Qt::AlignTop">
+ <widget class="QToolButton" name="toggleEntryNotesButton">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="entryNotesLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">notes</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::NoTextInteraction</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="entryAdvancedTab">
+ <attribute name="title">
+ <string>Advanced</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_1" rowstretch="0,0" columnstretch="0,1,0,2,0">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>5</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>5</number>
+ </property>
+ <item row="0" column="0">
+ <spacer name="entryAdvancedLeftHorizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>5</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="attributesTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Attributes</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <spacer name="entryAdvancedMiddleHorizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>5</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="attachmentsTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Attachments</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <spacer name="entryAdvancedRightHorizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>5</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0">
+ <spacer name="entryAdvancedLeftHorizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>5</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1">
+ <widget class="QTextEdit" name="entryAttributesEdit">
+ <property name="focusPolicy">
+ <enum>Qt::ClickFocus</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <spacer name="entryAdvancedMiddleHorizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>5</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="3">
+ <widget class="EntryAttachmentsWidget" name="entryAttachmentsWidget" native="true">
+ <property name="focusPolicy">
+ <enum>Qt::ClickFocus</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <spacer name="entryAdvancedRightHorizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>5</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="entryAutotypeTab">
+ <attribute name="title">
+ <string>Autotype</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QTreeWidget" name="entryAutotypeTree">
+ <property name="focusPolicy">
+ <enum>Qt::ClickFocus</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="showDropIndicator" stdset="0">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
+ </property>
+ <property name="columnCount">
+ <number>2</number>
+ </property>
+ <attribute name="headerCascadingSectionResizes">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="headerMinimumSectionSize">
+ <number>50</number>
+ </attribute>
+ <attribute name="headerDefaultSectionSize">
+ <number>250</number>
+ </attribute>
+ <attribute name="headerStretchLastSection">
+ <bool>true</bool>
+ </attribute>
+ <column>
+ <property name="text">
+ <string>Window</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Sequence</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="pageGroup">
+ <layout class="QVBoxLayout" name="verticalLayout_13">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="groupHorizontalLayout" stretch="0,0,0">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <property name="leftMargin">
+ <number>9</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="groupIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="ElidedLabel" name="groupTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>12</pointsize>
+ </font>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="groupCloseButton">
+ <property name="toolTip">
+ <string>Close</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="groupTabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <property name="documentMode">
+ <bool>false</bool>
+ </property>
+ <property name="tabsClosable">
+ <bool>false</bool>
+ </property>
+ <property name="movable">
+ <bool>false</bool>
+ </property>
+ <widget class="QWidget" name="groupGeneralTab">
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_8">
+ <item>
+ <widget class="QWidget" name="groupGeneralWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,0,0">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <spacer name="groupLeftHorizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="groupAutotypeTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Autotype</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="groupAutotypeLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="groupSearchingTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Searching</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="groupSearchingLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="groupExpirationTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Expiration</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QLabel" name="groupExpirationLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="groupNotesTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,0">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="leftMargin">
+ <number>4</number>
+ </property>
+ <item alignment="Qt::AlignTop">
+ <widget class="QToolButton" name="toggleGroupNotesButton">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="groupNotesLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">notes</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="groupShareTab">
+ <attribute name="title">
+ <string>Share</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_12">
+ <item>
+ <widget class="QWidget" name="groupShareWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="1" column="2">
+ <widget class="QLabel" name="groupSharePathLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true">&lt;path&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="groupShareTypeLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string notr="true">&lt;type&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>147</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
</widget>
- <customwidgets>
- <customwidget>
- <class>EntryAttachmentsWidget</class>
- <extends>QWidget</extends>
- <header>gui/entry/EntryAttachmentsWidget.h</header>
- <container>1</container>
- </customwidget>
- <customwidget>
- <class>ElidedLabel</class>
- <extends>QLabel</extends>
- <header>gui/widgets/ElidedLabel.h</header>
- </customwidget>
- </customwidgets>
- <tabstops>
- <tabstop>entryTotpButton</tabstop>
- <tabstop>entryAutotypeTree</tabstop>
- <tabstop>entryTabWidget</tabstop>
- <tabstop>groupCloseButton</tabstop>
- <tabstop>groupTabWidget</tabstop>
- </tabstops>
- <resources/>
- <connections/>
+ </item>
+ </layout>
+ <action name="searchIcon">
+ <property name="text">
+ <string>Search</string>
+ </property>
+ </action>
+ <action name="clearIcon">
+ <property name="text">
+ <string>Clear</string>
+ </property>
+ </action>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>EntryAttachmentsWidget</class>
+ <extends>QWidget</extends>
+ <header>gui/entry/EntryAttachmentsWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>ElidedLabel</class>
+ <extends>QLabel</extends>
+ <header>gui/widgets/ElidedLabel.h</header>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>entryCloseButton</tabstop>
+ <tabstop>entryTotpButton</tabstop>
+ <tabstop>togglePasswordButton</tabstop>
+ <tabstop>toggleEntryNotesButton</tabstop>
+ <tabstop>entryAutotypeTree</tabstop>
+ <tabstop>groupCloseButton</tabstop>
+ <tabstop>groupTabWidget</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
</ui>
diff --git a/src/gui/FileDialog.cpp b/src/gui/FileDialog.cpp
index a003bd5b7..12f582775 100644
--- a/src/gui/FileDialog.cpp
+++ b/src/gui/FileDialog.cpp
@@ -19,31 +19,32 @@
#include "core/Config.h"
+#include <QDir>
+
FileDialog* FileDialog::m_instance(nullptr);
QString FileDialog::getOpenFileName(QWidget* parent,
const QString& caption,
- QString dir,
+ const QString& dir,
const QString& filter,
QString* selectedFilter,
- QFileDialog::Options options)
+ const QFileDialog::Options options)
{
if (!m_nextFileName.isEmpty()) {
- QString result = m_nextFileName;
+ const QString result = m_nextFileName;
m_nextFileName.clear();
return result;
} else {
- if (dir.isEmpty()) {
- dir = config()->get("LastDir").toString();
- }
-
- QString result = QFileDialog::getOpenFileName(parent, caption, dir, filter, selectedFilter, options);
+ const auto& workingDir = dir.isEmpty() ? config()->get("LastDir").toString() : dir;
+ const auto result = QDir::toNativeSeparators(
+ QFileDialog::getOpenFileName(parent, caption, workingDir, filter, selectedFilter, options));
+#ifdef Q_OS_MACOS
// on Mac OS X the focus is lost after closing the native dialog
if (parent) {
parent->activateWindow();
}
-
+#endif
saveLastDir(result);
return result;
}
@@ -51,27 +52,28 @@ QString FileDialog::getOpenFileName(QWidget* parent,
QStringList FileDialog::getOpenFileNames(QWidget* parent,
const QString& caption,
- QString dir,
+ const QString& dir,
const QString& filter,
QString* selectedFilter,
- QFileDialog::Options options)
+ const QFileDialog::Options options)
{
if (!m_nextFileNames.isEmpty()) {
- QStringList results = m_nextFileNames;
+ const QStringList results = m_nextFileNames;
m_nextFileNames.clear();
return results;
} else {
- if (dir.isEmpty()) {
- dir = config()->get("LastDir").toString();
- }
+ const auto& workingDir = dir.isEmpty() ? config()->get("LastDir").toString() : dir;
+ auto results = QFileDialog::getOpenFileNames(parent, caption, workingDir, filter, selectedFilter, options);
- QStringList results = QFileDialog::getOpenFileNames(parent, caption, dir, filter, selectedFilter, options);
+ for (auto& path : results)
+ path = QDir::toNativeSeparators(path);
+#ifdef Q_OS_MACOS
// on Mac OS X the focus is lost after closing the native dialog
if (parent) {
parent->activateWindow();
}
-
+#endif
if (!results.isEmpty()) {
saveLastDir(results[0]);
}
@@ -81,57 +83,26 @@ QStringList FileDialog::getOpenFileNames(QWidget* parent,
QString FileDialog::getFileName(QWidget* parent,
const QString& caption,
- QString dir,
+ const QString& dir,
const QString& filter,
QString* selectedFilter,
- QFileDialog::Options options,
- const QString& defaultExtension,
- const QString& defaultName)
+ const QFileDialog::Options options)
{
if (!m_nextFileName.isEmpty()) {
- QString result = m_nextFileName;
+ const QString result = m_nextFileName;
m_nextFileName.clear();
return result;
} else {
- if (dir.isEmpty()) {
- dir = config()->get("LastDir").toString();
- }
-
- QString result;
-#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
- Q_UNUSED(defaultName);
- Q_UNUSED(defaultExtension);
- // the native dialogs on these platforms already append the file extension
- result = QFileDialog::getSaveFileName(parent, caption, dir, filter, selectedFilter, options);
-#else
- QFileDialog dialog(parent, caption, dir, filter);
- dialog.setFileMode(QFileDialog::AnyFile);
- dialog.setAcceptMode(QFileDialog::AcceptSave);
- if (selectedFilter) {
- dialog.selectNameFilter(*selectedFilter);
- }
- if (!defaultName.isEmpty()) {
- dialog.selectFile(defaultName);
- }
- dialog.setOptions(options);
- if (!defaultExtension.isEmpty()) {
- dialog.setDefaultSuffix(defaultExtension);
- }
- dialog.setLabelText(QFileDialog::Accept, QFileDialog::tr("Select"));
- QStringList results;
- if (dialog.exec()) {
- results = dialog.selectedFiles();
- if (!results.isEmpty()) {
- result = results[0];
- }
- }
-#endif
+ const auto& workingDir = dir.isEmpty() ? config()->get("LastDir").toString() : dir;
+ const auto result = QDir::toNativeSeparators(
+ QFileDialog::getSaveFileName(parent, caption, workingDir, filter, selectedFilter, options));
+#ifdef Q_OS_MACOS
// on Mac OS X the focus is lost after closing the native dialog
if (parent) {
parent->activateWindow();
}
-
+#endif
saveLastDir(result);
return result;
}
@@ -139,81 +110,53 @@ QString FileDialog::getFileName(QWidget* parent,
QString FileDialog::getSaveFileName(QWidget* parent,
const QString& caption,
- QString dir,
+ const QString& dir,
const QString& filter,
QString* selectedFilter,
- QFileDialog::Options options,
- const QString& defaultExtension,
- const QString& defaultName)
+ const QFileDialog::Options options)
{
if (!m_nextFileName.isEmpty()) {
- QString result = m_nextFileName;
+ const QString result = m_nextFileName;
m_nextFileName.clear();
return result;
} else {
- if (dir.isEmpty()) {
- dir = config()->get("LastDir").toString();
- }
-
- QString result;
-#if defined(Q_OS_MACOS) || defined(Q_OS_WIN)
- Q_UNUSED(defaultName);
- Q_UNUSED(defaultExtension);
- // the native dialogs on these platforms already append the file extension
- result = QFileDialog::getSaveFileName(parent, caption, dir, filter, selectedFilter, options);
-#else
- QFileDialog dialog(parent, caption, dir, filter);
- dialog.setAcceptMode(QFileDialog::AcceptSave);
- dialog.setFileMode(QFileDialog::AnyFile);
- if (selectedFilter) {
- dialog.selectNameFilter(*selectedFilter);
- }
- if (!defaultName.isEmpty()) {
- dialog.selectFile(defaultName);
- }
- dialog.setOptions(options);
- dialog.setDefaultSuffix(defaultExtension);
-
- QStringList results;
- if (dialog.exec()) {
- results = dialog.selectedFiles();
- if (!results.isEmpty()) {
- result = results[0];
- }
- }
-#endif
+ const auto& workingDir = dir.isEmpty() ? config()->get("LastDir").toString() : dir;
+ const auto result = QDir::toNativeSeparators(
+ QFileDialog::getSaveFileName(parent, caption, workingDir, filter, selectedFilter, options));
+#ifdef Q_OS_MACOS
// on Mac OS X the focus is lost after closing the native dialog
if (parent) {
parent->activateWindow();
}
-
+#endif
saveLastDir(result);
return result;
}
}
-QString
-FileDialog::getExistingDirectory(QWidget* parent, const QString& caption, QString dir, QFileDialog::Options options)
+QString FileDialog::getExistingDirectory(QWidget* parent,
+ const QString& caption,
+ const QString& dir,
+ const QFileDialog::Options options)
{
if (!m_nextDirName.isEmpty()) {
- QString result = m_nextDirName;
+ const QString result = m_nextDirName;
m_nextDirName.clear();
return result;
} else {
- if (dir.isEmpty()) {
- dir = config()->get("LastDir").toString();
- }
-
- dir = QFileDialog::getExistingDirectory(parent, caption, dir, options);
+ const auto& workingDir = dir.isEmpty() ? config()->get("LastDir").toString() : dir;
+ const auto result =
+ QDir::toNativeSeparators(QFileDialog::getExistingDirectory(parent, caption, workingDir, options));
+#ifdef Q_OS_MACOS
// on Mac OS X the focus is lost after closing the native dialog
if (parent) {
parent->activateWindow();
}
-
- saveLastDir(dir);
- return dir;
+#endif
+ saveLastDir(result);
+ return result;
}
}
diff --git a/src/gui/FileDialog.h b/src/gui/FileDialog.h
index eedb691da..7d03d8046 100644
--- a/src/gui/FileDialog.h
+++ b/src/gui/FileDialog.h
@@ -25,40 +25,36 @@ class FileDialog
public:
QString getOpenFileName(QWidget* parent = nullptr,
const QString& caption = QString(),
- QString dir = QString(),
+ const QString& dir = QString(),
const QString& filter = QString(),
QString* selectedFilter = nullptr,
- QFileDialog::Options options = 0);
+ const QFileDialog::Options options = {});
QStringList getOpenFileNames(QWidget* parent = nullptr,
const QString& caption = QString(),
- QString dir = QString(),
+ const QString& dir = QString(),
const QString& filter = QString(),
QString* selectedFilter = nullptr,
- QFileDialog::Options options = 0);
+ const QFileDialog::Options options = {});
QString getFileName(QWidget* parent = nullptr,
const QString& caption = QString(),
- QString dir = QString(),
+ const QString& dir = QString(),
const QString& filter = QString(),
QString* selectedFilter = nullptr,
- QFileDialog::Options options = 0,
- const QString& defaultExtension = QString(),
- const QString& defaultName = QString());
+ const QFileDialog::Options options = {});
QString getSaveFileName(QWidget* parent = nullptr,
const QString& caption = QString(),
- QString dir = QString(),
+ const QString& dir = QString(),
const QString& filter = QString(),
QString* selectedFilter = nullptr,
- QFileDialog::Options options = 0,
- const QString& defaultExtension = QString(),
- const QString& defaultName = QString());
+ const QFileDialog::Options options = {});
QString getExistingDirectory(QWidget* parent = nullptr,
const QString& caption = QString(),
- QString dir = QString(),
- QFileDialog::Options options = QFileDialog::ShowDirsOnly);
+ const QString& dir = QString(),
+ const QFileDialog::Options options = QFileDialog::ShowDirsOnly);
void setNextForgetDialog();
/**
diff --git a/src/gui/Font.cpp b/src/gui/Font.cpp
index 3583622dd..f53daed93 100644
--- a/src/gui/Font.cpp
+++ b/src/gui/Font.cpp
@@ -19,6 +19,11 @@
#include <QFontDatabase>
+QFont Font::defaultFont()
+{
+ return QFontDatabase::systemFont(QFontDatabase::GeneralFont);
+}
+
QFont Font::fixedFont()
{
QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
diff --git a/src/gui/Font.h b/src/gui/Font.h
index 076c42770..930d53a2e 100644
--- a/src/gui/Font.h
+++ b/src/gui/Font.h
@@ -23,6 +23,7 @@
class Font
{
public:
+ static QFont defaultFont();
static QFont fixedFont();
private:
diff --git a/src/gui/IconDownloaderDialog.cpp b/src/gui/IconDownloaderDialog.cpp
new file mode 100644
index 000000000..ebe6980a2
--- /dev/null
+++ b/src/gui/IconDownloaderDialog.cpp
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "IconDownloaderDialog.h"
+#include "ui_IconDownloaderDialog.h"
+
+#include "core/AsyncTask.h"
+#include "core/Config.h"
+#include "core/Entry.h"
+#include "core/Global.h"
+#include "core/Group.h"
+#include "core/IconDownloader.h"
+#include "core/Metadata.h"
+#include "core/Tools.h"
+#include "gui/IconModels.h"
+#ifdef Q_OS_MACOS
+#include "gui/macutils/MacUtils.h"
+#endif
+
+#include <QMutexLocker>
+
+IconDownloaderDialog::IconDownloaderDialog(QWidget* parent)
+ : QDialog(parent)
+ , m_ui(new Ui::IconDownloaderDialog())
+ , m_dataModel(new QStandardItemModel(this))
+{
+ setWindowFlags(Qt::Window);
+ setAttribute(Qt::WA_DeleteOnClose);
+
+ m_ui->setupUi(this);
+ showFallbackMessage(false);
+
+ m_dataModel->clear();
+ m_dataModel->setHorizontalHeaderLabels({tr("URL"), tr("Status")});
+
+ m_ui->tableView->setModel(m_dataModel);
+ m_ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+
+ connect(m_ui->cancelButton, SIGNAL(clicked()), SLOT(abortDownloads()));
+ connect(m_ui->closeButton, SIGNAL(clicked()), SLOT(close()));
+}
+
+IconDownloaderDialog::~IconDownloaderDialog()
+{
+ abortDownloads();
+}
+
+void IconDownloaderDialog::downloadFavicons(const QSharedPointer<Database>& database,
+ const QList<Entry*>& entries,
+ bool force)
+{
+ m_db = database;
+ m_urlToEntries.clear();
+ abortDownloads();
+ for (const auto& e : entries) {
+ // Only consider entries with a valid URL and without a custom icon
+ auto webUrl = e->webUrl();
+ if (!webUrl.isEmpty() && (force || e->iconUuid().isNull())) {
+ m_urlToEntries.insert(webUrl, e);
+ }
+ }
+
+ if (m_urlToEntries.count() > 0) {
+#ifdef Q_OS_MACOS
+ macUtils()->raiseOwnWindow();
+ Tools::wait(100);
+#endif
+ showFallbackMessage(false);
+ m_ui->progressLabel->setText(tr("Please wait, processing entry list..."));
+ open();
+ QApplication::processEvents();
+
+ for (const auto& url : m_urlToEntries.uniqueKeys()) {
+ m_dataModel->appendRow(QList<QStandardItem*>()
+ << new QStandardItem(url) << new QStandardItem(tr("Downloading...")));
+ m_activeDownloaders.append(createDownloader(url));
+ }
+
+ // Setup the dialog
+ updateProgressBar();
+ updateCancelButton();
+ QApplication::processEvents();
+
+ // Start the downloads
+ for (auto downloader : m_activeDownloaders) {
+ downloader->download();
+ }
+ }
+}
+
+IconDownloader* IconDownloaderDialog::createDownloader(const QString& url)
+{
+ auto downloader = new IconDownloader();
+ connect(downloader,
+ SIGNAL(finished(const QString&, const QImage&)),
+ this,
+ SLOT(downloadFinished(const QString&, const QImage&)));
+
+ downloader->setUrl(url);
+ return downloader;
+}
+
+void IconDownloaderDialog::downloadFinished(const QString& url, const QImage& icon)
+{
+ // Prevent re-entrance from multiple calls finishing at the same time
+ QMutexLocker locker(&m_mutex);
+
+ // Cleanup the icon downloader that sent this signal
+ auto downloader = qobject_cast<IconDownloader*>(sender());
+ if (downloader) {
+ downloader->deleteLater();
+ m_activeDownloaders.removeAll(downloader);
+ }
+
+ updateProgressBar();
+ updateCancelButton();
+
+ if (m_db && !icon.isNull()) {
+ // Don't add an icon larger than 128x128, but retain original size if smaller
+ auto scaledicon = icon;
+ if (icon.width() > 128 || icon.height() > 128) {
+ scaledicon = icon.scaled(128, 128);
+ }
+
+ QUuid uuid = m_db->metadata()->findCustomIcon(scaledicon);
+ if (uuid.isNull()) {
+ uuid = QUuid::createUuid();
+ m_db->metadata()->addCustomIcon(uuid, scaledicon);
+ updateTable(url, tr("Ok"));
+ } else {
+ updateTable(url, tr("Already Exists"));
+ }
+
+ // Set the icon on all the entries associated with this url
+ for (const auto entry : m_urlToEntries.values(url)) {
+ entry->setIcon(uuid);
+ }
+ } else {
+ showFallbackMessage(true);
+ updateTable(url, tr("Download Failed"));
+ return;
+ }
+}
+
+void IconDownloaderDialog::showFallbackMessage(bool state)
+{
+ // Show fallback message if the option is not active
+ bool show = state && !config()->get("security/IconDownloadFallback").toBool();
+ m_ui->fallbackLabel->setVisible(show);
+}
+
+void IconDownloaderDialog::updateProgressBar()
+{
+ int total = m_urlToEntries.uniqueKeys().count();
+ int value = total - m_activeDownloaders.count();
+ m_ui->progressBar->setValue(value);
+ m_ui->progressBar->setMaximum(total);
+ m_ui->progressLabel->setText(
+ tr("Downloading favicons (%1/%2)...").arg(QString::number(value), QString::number(total)));
+}
+
+void IconDownloaderDialog::updateCancelButton()
+{
+ m_ui->cancelButton->setEnabled(!m_activeDownloaders.isEmpty());
+}
+
+void IconDownloaderDialog::updateTable(const QString& url, const QString& message)
+{
+ for (int i = 0; i < m_dataModel->rowCount(); ++i) {
+ if (m_dataModel->item(i, 0)->text() == url) {
+ m_dataModel->item(i, 1)->setText(message);
+ }
+ }
+}
+
+void IconDownloaderDialog::abortDownloads()
+{
+ for (auto* downloader : m_activeDownloaders) {
+ delete downloader;
+ }
+ m_activeDownloaders.clear();
+ updateProgressBar();
+ updateCancelButton();
+}
diff --git a/src/gui/IconDownloaderDialog.h b/src/gui/IconDownloaderDialog.h
new file mode 100644
index 000000000..955e85a98
--- /dev/null
+++ b/src/gui/IconDownloaderDialog.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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_ICONDOWNLOADERDIALOG_H
+#define KEEPASSX_ICONDOWNLOADERDIALOG_H
+
+#include <QDialog>
+#include <QMutex>
+#include <QStandardItemModel>
+
+#include "gui/MessageWidget.h"
+
+class Database;
+class Entry;
+class CustomIconModel;
+class IconDownloader;
+
+namespace Ui
+{
+ class IconDownloaderDialog;
+}
+
+class IconDownloaderDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit IconDownloaderDialog(QWidget* parent = nullptr);
+ ~IconDownloaderDialog() override;
+
+ void downloadFavicons(const QSharedPointer<Database>& database, const QList<Entry*>& entries, bool force = false);
+
+private slots:
+ void downloadFinished(const QString& url, const QImage& icon);
+ void abortDownloads();
+
+private:
+ IconDownloader* createDownloader(const QString& url);
+
+ void showFallbackMessage(bool state);
+ void updateTable(const QString& url, const QString& message);
+ void updateProgressBar();
+ void updateCancelButton();
+
+ QScopedPointer<Ui::IconDownloaderDialog> m_ui;
+ QStandardItemModel* m_dataModel;
+ QSharedPointer<Database> m_db;
+ QMultiMap<QString, Entry*> m_urlToEntries;
+ QList<IconDownloader*> m_activeDownloaders;
+ QMutex m_mutex;
+
+ Q_DISABLE_COPY(IconDownloaderDialog)
+};
+
+#endif // KEEPASSX_ICONDOWNLOADERDIALOG_H
diff --git a/src/gui/IconDownloaderDialog.ui b/src/gui/IconDownloaderDialog.ui
new file mode 100644
index 000000000..ed9fddd1e
--- /dev/null
+++ b/src/gui/IconDownloaderDialog.ui
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IconDownloaderDialog</class>
+ <widget class="QDialog" name="IconDownloaderDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>453</width>
+ <height>339</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Download Favicons</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="progressLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string notr="true">Downloading favicon 0/0...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="fallbackLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Having trouble downloading icons?
+You can enable the DuckDuckGo website icon service in the security section of the application settings.</string>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTableView" name="tableView">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
+ </property>
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="textElideMode">
+ <enum>Qt::ElideNone</enum>
+ </property>
+ <property name="sortingEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
+ </property>
+ <attribute name="horizontalHeaderMinimumSectionSize">
+ <number>20</number>
+ </attribute>
+ <attribute name="horizontalHeaderDefaultSectionSize">
+ <number>20</number>
+ </attribute>
+ <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="horizontalHeaderStretchLastSection">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="closeButton">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/gui/KMessageWidget.cpp b/src/gui/KMessageWidget.cpp
index fabc52952..80f302858 100644
--- a/src/gui/KMessageWidget.cpp
+++ b/src/gui/KMessageWidget.cpp
@@ -1,5 +1,5 @@
/* This file is part of the KDE libraries
- *
+ *
* Copyright (c) 2011 Aurélien Gâteau <agateau@kde.org>
* Copyright (c) 2014 Dominik Haumann <dhaumann@kde.org>
*
@@ -42,7 +42,7 @@ class KMessageWidgetPrivate
{
public:
void init(KMessageWidget *);
-
+
KMessageWidget *q;
QFrame *content;
QLabel *iconLabel;
@@ -51,51 +51,51 @@ public:
QTimeLine *timeLine;
QIcon icon;
QPixmap closeButtonPixmap;
-
+
KMessageWidget::MessageType messageType;
bool wordWrap;
QList<QToolButton *> buttons;
QPixmap contentSnapShot;
-
+
void createLayout();
void updateSnapShot();
void updateLayout();
void slotTimeLineChanged(qreal);
void slotTimeLineFinished();
-
+
int bestContentHeight() const;
};
void KMessageWidgetPrivate::init(KMessageWidget *q_ptr)
{
q = q_ptr;
-
+
q->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
-
+
timeLine = new QTimeLine(500, q);
QObject::connect(timeLine, SIGNAL(valueChanged(qreal)), q, SLOT(slotTimeLineChanged(qreal)));
QObject::connect(timeLine, SIGNAL(finished()), q, SLOT(slotTimeLineFinished()));
-
+
content = new QFrame(q);
content->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-
+
wordWrap = false;
-
+
iconLabel = new QLabel(content);
iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
iconLabel->hide();
-
+
textLabel = new QLabel(content);
textLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
textLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
QObject::connect(textLabel, SIGNAL(linkActivated(QString)), q, SIGNAL(linkActivated(QString)));
QObject::connect(textLabel, SIGNAL(linkHovered(QString)), q, SIGNAL(linkHovered(QString)));
-
+
QAction *closeAction = new QAction(q);
closeAction->setText(KMessageWidget::tr("&Close"));
closeAction->setToolTip(KMessageWidget::tr("Close message"));
closeAction->setIcon(FilePath::instance()->icon("actions", "message-close", false));
-
+
QObject::connect(closeAction, SIGNAL(triggered(bool)), q, SLOT(animatedHide()));
closeButton = new QToolButton(content);
@@ -108,19 +108,19 @@ void KMessageWidgetPrivate::init(KMessageWidget *q_ptr)
"QToolButton::hover, QToolButton::focus {"
"border: 1px solid rgb(90, 200, 250); }");
#endif
-
+
q->setMessageType(KMessageWidget::Information);
}
void KMessageWidgetPrivate::createLayout()
{
delete content->layout();
-
+
content->resize(q->size());
-
+
qDeleteAll(buttons);
buttons.clear();
-
+
const auto actions = q->actions();
for (QAction *action: actions) {
QToolButton *button = new QToolButton(content);
@@ -128,18 +128,18 @@ void KMessageWidgetPrivate::createLayout()
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
buttons.append(button);
}
-
+
// AutoRaise reduces visual clutter, but we don't want to turn it on if
// there are other buttons, otherwise the close button will look different
// from the others.
closeButton->setAutoRaise(buttons.isEmpty());
-
+
if (wordWrap) {
QGridLayout *layout = new QGridLayout(content);
// Set alignment to make sure icon does not move down if text wraps
layout->addWidget(iconLabel, 0, 0, 1, 1, Qt::AlignHCenter | Qt::AlignTop);
layout->addWidget(textLabel, 0, 1);
-
+
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch();
for (QToolButton* button: asConst(buttons)) {
@@ -155,14 +155,14 @@ void KMessageWidgetPrivate::createLayout()
QHBoxLayout *layout = new QHBoxLayout(content);
layout->addWidget(iconLabel);
layout->addWidget(textLabel);
-
+
for (QToolButton* button: asConst(buttons)) {
layout->addWidget(button);
}
-
+
layout->addWidget(closeButton);
};
-
+
if (q->isVisible()) {
q->setFixedHeight(content->sizeHint().height());
}
@@ -201,7 +201,7 @@ void KMessageWidgetPrivate::slotTimeLineFinished()
// We set the whole geometry here, because it may be wrong if a
// KMessageWidget is shown right when the toplevel window is created.
content->setGeometry(0, 0, q->width(), bestContentHeight());
-
+
// notify about finished animation
emit q->showAnimationFinished();
} else {
@@ -273,7 +273,7 @@ void KMessageWidget::setMessageType(KMessageWidget::MessageType type)
break;
case Warning:
bg1.setRgb(252, 193, 57);
- fg = palette().foreground().color();
+ fg = palette().windowText().color();
break;
case Error:
bg1.setRgb(198, 69, 21);
@@ -294,7 +294,7 @@ void KMessageWidget::setMessageType(KMessageWidget::MessageType type)
painter.fillRect(QRect(0, 0, 16, 16), fg);
painter.end();
d->closeButton->setIcon(closeButtonPixmap);
-
+
d->content->setStyleSheet(
QString(QLatin1String(".QFrame {"
"background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
@@ -342,7 +342,7 @@ bool KMessageWidget::event(QEvent *event)
void KMessageWidget::resizeEvent(QResizeEvent *event)
{
QFrame::resizeEvent(event);
-
+
if (d->timeLine->state() == QTimeLine::NotRunning) {
d->content->resize(width(), d->bestContentHeight());
}
@@ -415,18 +415,18 @@ void KMessageWidget::animatedShow()
emit showAnimationFinished();
return;
}
-
+
if (isVisible()) {
return;
}
-
+
QFrame::show();
setFixedHeight(0);
int wantedHeight = d->bestContentHeight();
d->content->setGeometry(0, -wantedHeight, width(), wantedHeight);
-
+
d->updateSnapShot();
-
+
d->timeLine->setDirection(QTimeLine::Forward);
if (d->timeLine->state() == QTimeLine::NotRunning) {
d->timeLine->start();
@@ -440,15 +440,15 @@ void KMessageWidget::animatedHide()
emit hideAnimationFinished();
return;
}
-
+
if (!isVisible()) {
hide();
return;
}
-
+
d->content->move(0, -d->content->height());
d->updateSnapShot();
-
+
d->timeLine->setDirection(QTimeLine::Backward);
if (d->timeLine->state() == QTimeLine::NotRunning) {
d->timeLine->start();
diff --git a/src/gui/KeePass1OpenWidget.cpp b/src/gui/KeePass1OpenWidget.cpp
index 834425ec1..6b369b9e5 100644
--- a/src/gui/KeePass1OpenWidget.cpp
+++ b/src/gui/KeePass1OpenWidget.cpp
@@ -29,7 +29,7 @@
KeePass1OpenWidget::KeePass1OpenWidget(QWidget* parent)
: DatabaseOpenWidget(parent)
{
- m_ui->labelHeadline->setText(tr("Import KeePass1 database"));
+ m_ui->labelHeadline->setText(tr("Import KeePass1 Database"));
}
void KeePass1OpenWidget::openDatabase()
@@ -39,11 +39,11 @@ void KeePass1OpenWidget::openDatabase()
QString password;
QString keyFileName;
- if (m_ui->checkPassword->isChecked()) {
+ if (!m_ui->editPassword->text().isEmpty() || m_retryUnlockWithEmptyPassword) {
password = m_ui->editPassword->text();
}
- if (m_ui->checkKeyFile->isChecked()) {
+ if (!m_ui->comboKeyFile->currentText().isEmpty() && m_ui->comboKeyFile->currentData() != -1) {
keyFileName = m_ui->comboKeyFile->currentText();
}
diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
index 7ee6aadea..0d53d88a8 100644
--- a/src/gui/MainWindow.cpp
+++ b/src/gui/MainWindow.cpp
@@ -60,6 +60,11 @@
#include "keeshare/KeeShare.h"
#include "keeshare/SettingsPageKeeShare.h"
#endif
+
+#ifdef WITH_XC_FDOSECRETS
+#include "fdosecrets/FdoSecretsPlugin.h"
+#endif
+
#ifdef WITH_XC_BROWSER
#include "browser/BrowserOptionDialog.h"
#include "browser/BrowserSettings.h"
@@ -137,10 +142,6 @@ MainWindow* getMainWindow()
MainWindow::MainWindow()
: m_ui(new Ui::MainWindow())
- , m_trayIcon(nullptr)
- , m_appExitCalled(false)
- , m_appExiting(false)
- , m_lastFocusOutTime(0)
{
g_MainWindow = this;
@@ -163,6 +164,24 @@ MainWindow::MainWindow()
m_countDefaultAttributes = m_ui->menuEntryCopyAttribute->actions().size();
+ m_entryContextMenu = new QMenu(this);
+ m_entryContextMenu->addAction(m_ui->actionEntryCopyUsername);
+ m_entryContextMenu->addAction(m_ui->actionEntryCopyPassword);
+ m_entryContextMenu->addAction(m_ui->menuEntryCopyAttribute->menuAction());
+ m_entryContextMenu->addAction(m_ui->menuEntryTotp->menuAction());
+ m_entryContextMenu->addSeparator();
+ m_entryContextMenu->addAction(m_ui->actionEntryAutoType);
+ m_entryContextMenu->addSeparator();
+ m_entryContextMenu->addAction(m_ui->actionEntryEdit);
+ m_entryContextMenu->addAction(m_ui->actionEntryClone);
+ m_entryContextMenu->addAction(m_ui->actionEntryDelete);
+ m_entryContextMenu->addSeparator();
+ m_entryContextMenu->addAction(m_ui->actionEntryOpenUrl);
+ m_entryContextMenu->addAction(m_ui->actionEntryDownloadIcon);
+
+ m_entryNewContextMenu = new QMenu(this);
+ m_entryNewContextMenu->addAction(m_ui->actionEntryNew);
+
restoreGeometry(config()->get("GUI/MainWindowGeometry").toByteArray());
restoreState(config()->get("GUI/MainWindowState").toByteArray());
#ifdef WITH_XC_BROWSER
@@ -182,6 +201,16 @@ MainWindow::MainWindow()
SIGNAL(sharingMessage(QString, MessageWidget::MessageType)),
SLOT(displayGlobalMessage(QString, MessageWidget::MessageType)));
#endif
+
+#ifdef WITH_XC_FDOSECRETS
+ auto fdoSS = new FdoSecretsPlugin(m_ui->tabWidget);
+ connect(fdoSS, &FdoSecretsPlugin::error, this, &MainWindow::showErrorMessage);
+ connect(fdoSS, &FdoSecretsPlugin::requestSwitchToDatabases, this, &MainWindow::switchToDatabases);
+ connect(fdoSS, &FdoSecretsPlugin::requestShowNotification, this, &MainWindow::displayDesktopNotification);
+ fdoSS->updateServiceState();
+ m_ui->settingsWidget->addSettingsPage(fdoSS);
+#endif
+
setWindowIcon(filePath()->applicationIcon());
m_ui->globalMessageWidget->setHidden(true);
// clang-format off
@@ -231,6 +260,7 @@ MainWindow::MainWindow()
m_ui->actionEntryDelete->setShortcut(Qt::Key_Delete);
m_ui->actionEntryClone->setShortcut(Qt::CTRL + Qt::Key_K);
m_ui->actionEntryTotp->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T);
+ m_ui->actionEntryDownloadIcon->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_D);
m_ui->actionEntryCopyTotp->setShortcut(Qt::CTRL + Qt::Key_T);
m_ui->actionEntryCopyUsername->setShortcut(Qt::CTRL + Qt::Key_B);
m_ui->actionEntryCopyPassword->setShortcut(Qt::CTRL + Qt::Key_C);
@@ -246,6 +276,7 @@ MainWindow::MainWindow()
m_ui->actionEntryDelete->setShortcutVisibleInContextMenu(true);
m_ui->actionEntryClone->setShortcutVisibleInContextMenu(true);
m_ui->actionEntryTotp->setShortcutVisibleInContextMenu(true);
+ m_ui->actionEntryDownloadIcon->setShortcutVisibleInContextMenu(true);
m_ui->actionEntryCopyTotp->setShortcutVisibleInContextMenu(true);
m_ui->actionEntryCopyUsername->setShortcutVisibleInContextMenu(true);
m_ui->actionEntryCopyPassword->setShortcutVisibleInContextMenu(true);
@@ -256,6 +287,10 @@ MainWindow::MainWindow()
connect(m_ui->menuEntries, SIGNAL(aboutToShow()), SLOT(obtainContextFocusLock()));
connect(m_ui->menuEntries, SIGNAL(aboutToHide()), SLOT(releaseContextFocusLock()));
+ connect(m_entryContextMenu, SIGNAL(aboutToShow()), SLOT(obtainContextFocusLock()));
+ connect(m_entryContextMenu, SIGNAL(aboutToHide()), SLOT(releaseContextFocusLock()));
+ connect(m_entryNewContextMenu, SIGNAL(aboutToShow()), SLOT(obtainContextFocusLock()));
+ connect(m_entryNewContextMenu, SIGNAL(aboutToHide()), SLOT(releaseContextFocusLock()));
connect(m_ui->menuGroups, SIGNAL(aboutToShow()), SLOT(obtainContextFocusLock()));
connect(m_ui->menuGroups, SIGNAL(aboutToHide()), SLOT(releaseContextFocusLock()));
@@ -278,7 +313,7 @@ MainWindow::MainWindow()
m_ui->actionDatabaseClose->setIcon(filePath()->icon("actions", "document-close"));
m_ui->actionChangeDatabaseSettings->setIcon(filePath()->icon("actions", "document-edit"));
m_ui->actionChangeMasterKey->setIcon(filePath()->icon("actions", "database-change-key"));
- m_ui->actionLockDatabases->setIcon(filePath()->icon("actions", "document-encrypt"));
+ m_ui->actionLockDatabases->setIcon(filePath()->icon("actions", "database-lock"));
m_ui->actionQuit->setIcon(filePath()->icon("actions", "application-exit"));
m_ui->actionEntryNew->setIcon(filePath()->icon("actions", "entry-new"));
@@ -289,11 +324,13 @@ MainWindow::MainWindow()
m_ui->actionEntryCopyUsername->setIcon(filePath()->icon("actions", "username-copy"));
m_ui->actionEntryCopyPassword->setIcon(filePath()->icon("actions", "password-copy"));
m_ui->actionEntryCopyURL->setIcon(filePath()->icon("actions", "url-copy"));
+ m_ui->actionEntryDownloadIcon->setIcon(filePath()->icon("actions", "favicon-download"));
m_ui->actionGroupNew->setIcon(filePath()->icon("actions", "group-new"));
m_ui->actionGroupEdit->setIcon(filePath()->icon("actions", "group-edit"));
m_ui->actionGroupDelete->setIcon(filePath()->icon("actions", "group-delete"));
m_ui->actionGroupEmptyRecycleBin->setIcon(filePath()->icon("actions", "group-empty-trash"));
+ m_ui->actionGroupDownloadFavicons->setIcon(filePath()->icon("actions", "favicon-download"));
m_ui->actionSettings->setIcon(filePath()->icon("actions", "configure"));
m_ui->actionPasswordGenerator->setIcon(filePath()->icon("actions", "password-generator"));
@@ -324,7 +361,7 @@ MainWindow::MainWindow()
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState()));
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle()));
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(applySettingsChanges()));
- connect(m_ui->settingsWidget, SIGNAL(apply()), SLOT(applySettingsChanges()));
+ connect(m_ui->settingsWidget, SIGNAL(settingsReset()), SLOT(applySettingsChanges()));
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(switchToDatabases()));
connect(m_ui->settingsWidget, SIGNAL(rejected()), SLOT(switchToDatabases()));
@@ -338,7 +375,9 @@ MainWindow::MainWindow()
connect(m_ui->actionChangeDatabaseSettings, SIGNAL(triggered()), m_ui->tabWidget, SLOT(changeDatabaseSettings()));
connect(m_ui->actionImportCsv, SIGNAL(triggered()), m_ui->tabWidget, SLOT(importCsv()));
connect(m_ui->actionImportKeePass1, SIGNAL(triggered()), m_ui->tabWidget, SLOT(importKeePass1Database()));
+ connect(m_ui->actionImportOpVault, SIGNAL(triggered()), m_ui->tabWidget, SLOT(importOpVaultDatabase()));
connect(m_ui->actionExportCsv, SIGNAL(triggered()), m_ui->tabWidget, SLOT(exportToCsv()));
+ connect(m_ui->actionExportHtml, SIGNAL(triggered()), m_ui->tabWidget, SLOT(exportToHtml()));
connect(m_ui->actionLockDatabases, SIGNAL(triggered()), m_ui->tabWidget, SLOT(lockDatabases()));
connect(m_ui->actionQuit, SIGNAL(triggered()), SLOT(appExit()));
@@ -359,11 +398,15 @@ MainWindow::MainWindow()
m_actionMultiplexer.connect(m_ui->actionEntryCopyNotes, SIGNAL(triggered()), SLOT(copyNotes()));
m_actionMultiplexer.connect(m_ui->actionEntryAutoType, SIGNAL(triggered()), SLOT(performAutoType()));
m_actionMultiplexer.connect(m_ui->actionEntryOpenUrl, SIGNAL(triggered()), SLOT(openUrl()));
+ m_actionMultiplexer.connect(m_ui->actionEntryDownloadIcon, SIGNAL(triggered()), SLOT(downloadSelectedFavicons()));
m_actionMultiplexer.connect(m_ui->actionGroupNew, SIGNAL(triggered()), SLOT(createGroup()));
m_actionMultiplexer.connect(m_ui->actionGroupEdit, SIGNAL(triggered()), SLOT(switchToGroupEdit()));
m_actionMultiplexer.connect(m_ui->actionGroupDelete, SIGNAL(triggered()), SLOT(deleteGroup()));
m_actionMultiplexer.connect(m_ui->actionGroupEmptyRecycleBin, SIGNAL(triggered()), SLOT(emptyRecycleBin()));
+ m_actionMultiplexer.connect(m_ui->actionGroupSortAsc, SIGNAL(triggered()), SLOT(sortGroupsAsc()));
+ m_actionMultiplexer.connect(m_ui->actionGroupSortDesc, SIGNAL(triggered()), SLOT(sortGroupsDesc()));
+ m_actionMultiplexer.connect(m_ui->actionGroupDownloadFavicons, SIGNAL(triggered()), SLOT(downloadAllFavicons()));
connect(m_ui->actionSettings, SIGNAL(toggled(bool)), SLOT(switchToSettings(bool)));
connect(m_ui->actionPasswordGenerator, SIGNAL(toggled(bool)), SLOT(switchToPasswordGen(bool)));
@@ -373,11 +416,16 @@ MainWindow::MainWindow()
connect(m_ui->welcomeWidget, SIGNAL(openDatabase()), SLOT(switchToOpenDatabase()));
connect(m_ui->welcomeWidget, SIGNAL(openDatabaseFile(QString)), SLOT(switchToDatabaseFile(QString)));
connect(m_ui->welcomeWidget, SIGNAL(importKeePass1Database()), SLOT(switchToKeePass1Database()));
+ connect(m_ui->welcomeWidget, SIGNAL(importOpVaultDatabase()), SLOT(switchToOpVaultDatabase()));
connect(m_ui->welcomeWidget, SIGNAL(importCsv()), SLOT(switchToCsvImport()));
connect(m_ui->actionAbout, SIGNAL(triggered()), SLOT(showAboutDialog()));
connect(m_ui->actionDonate, SIGNAL(triggered()), SLOT(openDonateUrl()));
connect(m_ui->actionBugReport, SIGNAL(triggered()), SLOT(openBugReportUrl()));
+ connect(m_ui->actionGettingStarted, SIGNAL(triggered()), SLOT(openGettingStartedGuide()));
+ connect(m_ui->actionUserGuide, SIGNAL(triggered()), SLOT(openUserGuide()));
+ connect(m_ui->actionOnlineHelp, SIGNAL(triggered()), SLOT(openOnlineHelp()));
+ connect(m_ui->actionKeyboardShortcuts, SIGNAL(triggered()), SLOT(openKeyboardShortcuts()));
#ifdef Q_OS_MACOS
setUnifiedTitleAndToolBarOnMac(true);
@@ -396,6 +444,11 @@ MainWindow::MainWindow()
m_ui->actionCheckForUpdates->setVisible(false);
#endif
+#ifndef WITH_XC_NETWORKING
+ m_ui->actionGroupDownloadFavicons->setVisible(false);
+ m_ui->actionEntryDownloadIcon->setVisible(false);
+#endif
+
// clang-format off
connect(m_ui->tabWidget,
SIGNAL(messageGlobal(QString,MessageWidget::MessageType)),
@@ -553,6 +606,8 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
bool singleEntrySelected = dbWidget->numberOfSelectedEntries() == 1 && hasFocus;
bool entriesSelected = dbWidget->numberOfSelectedEntries() > 0 && hasFocus;
bool groupSelected = dbWidget->isGroupSelected();
+ bool currentGroupHasChildren = dbWidget->currentGroup()->hasChildren();
+ bool currentGroupHasEntries = !dbWidget->currentGroup()->entries().isEmpty();
bool recycleBinSelected = dbWidget->isRecycleBinSelected();
m_ui->actionEntryNew->setEnabled(true);
@@ -561,7 +616,9 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
m_ui->actionEntryDelete->setEnabled(entriesSelected);
m_ui->actionEntryCopyTitle->setEnabled(singleEntrySelected && dbWidget->currentEntryHasTitle());
m_ui->actionEntryCopyUsername->setEnabled(singleEntrySelected && dbWidget->currentEntryHasUsername());
- m_ui->actionEntryCopyPassword->setEnabled(singleEntrySelected && dbWidget->currentEntryHasPassword());
+ // NOTE: Copy password is enabled even if the selected entry's password is blank to prevent Ctrl+C
+ // from copying information from the currently selected cell in the entry view table.
+ m_ui->actionEntryCopyPassword->setEnabled(singleEntrySelected);
m_ui->actionEntryCopyURL->setEnabled(singleEntrySelected && dbWidget->currentEntryHasUrl());
m_ui->actionEntryCopyNotes->setEnabled(singleEntrySelected && dbWidget->currentEntryHasNotes());
m_ui->menuEntryCopyAttribute->setEnabled(singleEntrySelected);
@@ -572,16 +629,25 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
m_ui->actionEntryCopyTotp->setEnabled(singleEntrySelected && dbWidget->currentEntryHasTotp());
m_ui->actionEntrySetupTotp->setEnabled(singleEntrySelected);
m_ui->actionEntryTotpQRCode->setEnabled(singleEntrySelected && dbWidget->currentEntryHasTotp());
+ m_ui->actionEntryDownloadIcon->setEnabled((entriesSelected && !singleEntrySelected)
+ || (singleEntrySelected && dbWidget->currentEntryHasUrl()));
m_ui->actionGroupNew->setEnabled(groupSelected);
m_ui->actionGroupEdit->setEnabled(groupSelected);
m_ui->actionGroupDelete->setEnabled(groupSelected && dbWidget->canDeleteCurrentGroup());
+ m_ui->actionGroupSortAsc->setEnabled(groupSelected && currentGroupHasChildren);
+ m_ui->actionGroupSortDesc->setEnabled(groupSelected && currentGroupHasChildren);
m_ui->actionGroupEmptyRecycleBin->setVisible(recycleBinSelected);
m_ui->actionGroupEmptyRecycleBin->setEnabled(recycleBinSelected);
+ m_ui->actionGroupDownloadFavicons->setVisible(!recycleBinSelected);
+ m_ui->actionGroupDownloadFavicons->setEnabled(groupSelected && currentGroupHasEntries
+ && !recycleBinSelected);
m_ui->actionChangeMasterKey->setEnabled(true);
m_ui->actionChangeDatabaseSettings->setEnabled(true);
m_ui->actionDatabaseSave->setEnabled(m_ui->tabWidget->canSave());
m_ui->actionDatabaseSaveAs->setEnabled(true);
+ m_ui->menuExport->setEnabled(true);
m_ui->actionExportCsv->setEnabled(true);
+ m_ui->actionExportHtml->setEnabled(true);
m_ui->actionDatabaseMerge->setEnabled(m_ui->tabWidget->currentIndex() != -1);
m_searchWidgetAction->setEnabled(true);
@@ -591,13 +657,33 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
case DatabaseWidget::Mode::EditMode:
case DatabaseWidget::Mode::ImportMode:
case DatabaseWidget::Mode::LockedMode: {
- const QList<QAction*> entryActions = m_ui->menuEntries->actions();
- for (QAction* action : entryActions) {
- action->setEnabled(false);
+ // Enable select actions when editing an entry
+ bool editEntryActive = dbWidget->isEntryEditActive();
+ const auto editEntryActionsMask = QList<QAction*>({m_ui->actionEntryCopyUsername,
+ m_ui->actionEntryCopyPassword,
+ m_ui->actionEntryCopyURL,
+ m_ui->actionEntryOpenUrl,
+ m_ui->actionEntryAutoType,
+ m_ui->actionEntryDownloadIcon,
+ m_ui->actionEntryCopyNotes,
+ m_ui->actionEntryCopyTitle,
+ m_ui->menuEntryCopyAttribute->menuAction(),
+ m_ui->menuEntryTotp->menuAction(),
+ m_ui->actionEntrySetupTotp});
+
+ auto entryActions = m_ui->menuEntries->actions();
+ entryActions << m_ui->menuEntryCopyAttribute->actions();
+ entryActions << m_ui->menuEntryTotp->actions();
+ for (auto action : entryActions) {
+ bool enabled = editEntryActive && editEntryActionsMask.contains(action);
+ if (action->menu()) {
+ action->menu()->setEnabled(enabled);
+ }
+ action->setEnabled(enabled);
}
- const QList<QAction*> groupActions = m_ui->menuGroups->actions();
- for (QAction* action : groupActions) {
+ const auto groupActions = m_ui->menuGroups->actions();
+ for (auto action : groupActions) {
action->setEnabled(false);
}
@@ -605,7 +691,9 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
m_ui->actionChangeDatabaseSettings->setEnabled(false);
m_ui->actionDatabaseSave->setEnabled(false);
m_ui->actionDatabaseSaveAs->setEnabled(false);
+ m_ui->menuExport->setEnabled(false);
m_ui->actionExportCsv->setEnabled(false);
+ m_ui->actionExportHtml->setEnabled(false);
m_ui->actionDatabaseMerge->setEnabled(false);
m_searchWidgetAction->setEnabled(false);
@@ -616,13 +704,13 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
}
m_ui->actionDatabaseClose->setEnabled(true);
} else {
- const QList<QAction*> entryActions = m_ui->menuEntries->actions();
- for (QAction* action : entryActions) {
+ const auto entryActions = m_ui->menuEntries->actions();
+ for (auto action : entryActions) {
action->setEnabled(false);
}
- const QList<QAction*> groupActions = m_ui->menuGroups->actions();
- for (QAction* action : groupActions) {
+ const auto groupActions = m_ui->menuGroups->actions();
+ for (auto action : groupActions) {
action->setEnabled(false);
}
@@ -631,7 +719,9 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
m_ui->actionDatabaseSave->setEnabled(false);
m_ui->actionDatabaseSaveAs->setEnabled(false);
m_ui->actionDatabaseClose->setEnabled(false);
+ m_ui->menuExport->setEnabled(false);
m_ui->actionExportCsv->setEnabled(false);
+ m_ui->actionExportHtml->setEnabled(false);
m_ui->actionDatabaseMerge->setEnabled(false);
m_searchWidgetAction->setEnabled(false);
@@ -736,14 +826,39 @@ void MainWindow::showUpdateCheckDialog()
#endif
}
+void MainWindow::customOpenUrl(QString url)
+{
+ QDesktopServices::openUrl(QUrl(url));
+}
+
void MainWindow::openDonateUrl()
{
- QDesktopServices::openUrl(QUrl("https://keepassxc.org/donate"));
+ customOpenUrl("https://keepassxc.org/donate");
}
void MainWindow::openBugReportUrl()
{
- QDesktopServices::openUrl(QUrl("https://github.com/keepassxreboot/keepassxc/issues"));
+ customOpenUrl("https://github.com/keepassxreboot/keepassxc/issues");
+}
+
+void MainWindow::openGettingStartedGuide()
+{
+ customOpenUrl(QString("file:///%1").arg(filePath()->dataPath("docs/KeePassXC_GettingStarted.pdf")));
+}
+
+void MainWindow::openUserGuide()
+{
+ customOpenUrl(QString("file:///%1").arg(filePath()->dataPath("docs/KeePassXC_UserGuide.pdf")));
+}
+
+void MainWindow::openOnlineHelp()
+{
+ customOpenUrl("https://keepassxc.org/docs/");
+}
+
+void MainWindow::openKeyboardShortcuts()
+{
+ customOpenUrl("https://github.com/keepassxreboot/keepassxc/blob/develop/docs/KEYBINDS.md");
}
void MainWindow::switchToDatabases()
@@ -807,6 +922,12 @@ void MainWindow::switchToKeePass1Database()
switchToDatabases();
}
+void MainWindow::switchToOpVaultDatabase()
+{
+ m_ui->tabWidget->importOpVaultDatabase();
+ switchToDatabases();
+}
+
void MainWindow::switchToCsvImport()
{
m_ui->tabWidget->importCsv();
@@ -872,31 +993,29 @@ void MainWindow::toggleUsernamesHidden()
void MainWindow::closeEvent(QCloseEvent* event)
{
- // ignore double close events (happens on macOS when closing from the dock)
if (m_appExiting) {
event->accept();
return;
}
- // Don't ignore close event when the app is hidden to tray.
- // This can occur when the OS issues close events on shutdown.
- if (config()->get("GUI/MinimizeOnClose").toBool() && !isHidden() && !m_appExitCalled) {
+ // Ignore event and hide to tray if this is not an actual close
+ // request by the system's session manager.
+ if (config()->get("GUI/MinimizeOnClose").toBool() && !m_appExitCalled && !isHidden() && !qApp->isSavingSession()) {
event->ignore();
hideWindow();
return;
}
- bool accept = saveLastDatabases();
-
- if (accept) {
- m_appExiting = true;
+ m_appExiting = saveLastDatabases();
+ if (m_appExiting) {
saveWindowInformation();
-
event->accept();
QApplication::quit();
- } else {
- event->ignore();
+ return;
}
+
+ m_appExitCalled = false;
+ event->ignore();
}
void MainWindow::changeEvent(QEvent* event)
@@ -958,6 +1077,7 @@ void MainWindow::updateTrayIcon()
QAction* actionToggle = new QAction(tr("Toggle window"), menu);
menu->addAction(actionToggle);
+ actionToggle->setIcon(filePath()->icon("apps", "keepassxc"));
menu->addAction(m_ui->actionLockDatabases);
@@ -969,10 +1089,10 @@ void MainWindow::updateTrayIcon()
#else
menu->addAction(m_ui->actionQuit);
+#endif
connect(m_trayIcon,
SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
SLOT(trayIconTriggered(QSystemTrayIcon::ActivationReason)));
-#endif
connect(actionToggle, SIGNAL(triggered()), SLOT(toggleWindow()));
m_trayIcon->setContextMenu(menu);
@@ -1006,7 +1126,17 @@ void MainWindow::releaseContextFocusLock()
void MainWindow::showEntryContextMenu(const QPoint& globalPos)
{
- m_ui->menuEntries->popup(globalPos);
+ bool entrySelected = false;
+ auto dbWidget = m_ui->tabWidget->currentDatabaseWidget();
+ if (dbWidget) {
+ entrySelected = dbWidget->currentEntryHasFocus();
+ }
+
+ if (entrySelected) {
+ m_entryContextMenu->popup(globalPos);
+ } else {
+ m_entryNewContextMenu->popup(globalPos);
+ }
}
void MainWindow::showGroupContextMenu(const QPoint& globalPos)
@@ -1089,15 +1219,14 @@ void MainWindow::processTrayIconTrigger()
toggleWindow();
} else if (m_trayIconTriggerReason == QSystemTrayIcon::Trigger
|| m_trayIconTriggerReason == QSystemTrayIcon::MiddleClick) {
- // Toggle window if hidden
- // If on windows, check if focus switched within the last second because
- // clicking the tray icon removes focus from main window
- // If on Linux or macOS, check if the window is active
- if (isHidden()
+ // Toggle window if is not in front.
#ifdef Q_OS_WIN
- || (Clock::currentSecondsSinceEpoch() - m_lastFocusOutTime) <= 1) {
+ // If on Windows, check if focus switched within the last second because
+ // clicking the tray icon removes focus from main window.
+ if (isHidden() || (Clock::currentSecondsSinceEpoch() - m_lastFocusOutTime) <= 1) {
#else
- || windowHandle()->isActive()) {
+ // If on Linux or macOS, check if the window has focus.
+ if (hasFocus() || isHidden() || windowHandle()->isActive()) {
#endif
toggleWindow();
} else {
@@ -1287,3 +1416,20 @@ void MainWindow::lockAllDatabases()
{
lockDatabasesAfterInactivity();
}
+
+void MainWindow::displayDesktopNotification(const QString& msg, QString title, int msTimeoutHint)
+{
+ if (!m_trayIcon || !QSystemTrayIcon::supportsMessages()) {
+ return;
+ }
+
+ if (title.isEmpty()) {
+ title = BaseWindowTitle;
+ }
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
+ m_trayIcon->showMessage(title, msg, filePath()->applicationIcon(), msTimeoutHint);
+#else
+ m_trayIcon->showMessage(title, msg, QSystemTrayIcon::Information, msTimeoutHint);
+#endif
+}
diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
index a07933c41..89501eff3 100644
--- a/src/gui/MainWindow.h
+++ b/src/gui/MainWindow.h
@@ -75,6 +75,7 @@ public slots:
void bringToFront();
void closeAllDatabases();
void lockAllDatabases();
+ void displayDesktopNotification(const QString& msg, QString title = "", int msTimeoutHint = 10000);
protected:
void closeEvent(QCloseEvent* event) override;
@@ -90,6 +91,10 @@ private slots:
void hasUpdateAvailable(bool hasUpdate, const QString& version, bool isManuallyRequested);
void openDonateUrl();
void openBugReportUrl();
+ void openGettingStartedGuide();
+ void openUserGuide();
+ void openOnlineHelp();
+ void openKeyboardShortcuts();
void switchToDatabases();
void switchToSettings(bool enabled);
void switchToPasswordGen(bool enabled);
@@ -97,6 +102,7 @@ private slots:
void switchToOpenDatabase();
void switchToDatabaseFile(const QString& file);
void switchToKeePass1Database();
+ void switchToOpVaultDatabase();
void switchToCsvImport();
void closePasswordGen();
void databaseStatusChanged(DatabaseWidget* dbWidget);
@@ -130,6 +136,7 @@ private:
bool saveLastDatabases();
void updateTrayIcon();
bool isTrayIconEnabled() const;
+ void customOpenUrl(QString url);
static QStringList kdbxFilesFromUrls(const QList<QUrl>& urls);
void dragEnterEvent(QDragEnterEvent* event) override;
@@ -137,23 +144,25 @@ private:
const QScopedPointer<Ui::MainWindow> m_ui;
SignalMultiplexer m_actionMultiplexer;
- QAction* m_clearHistoryAction;
- QAction* m_searchWidgetAction;
- QActionGroup* m_lastDatabasesActions;
- QActionGroup* m_copyAdditionalAttributeActions;
- InactivityTimer* m_inactivityTimer;
- InactivityTimer* m_touchIDinactivityTimer;
+ QPointer<QAction> m_clearHistoryAction;
+ QPointer<QAction> m_searchWidgetAction;
+ QPointer<QMenu> m_entryContextMenu;
+ QPointer<QMenu> m_entryNewContextMenu;
+ QPointer<QActionGroup> m_lastDatabasesActions;
+ QPointer<QActionGroup> m_copyAdditionalAttributeActions;
+ QPointer<InactivityTimer> m_inactivityTimer;
+ QPointer<InactivityTimer> m_touchIDinactivityTimer;
int m_countDefaultAttributes;
- QSystemTrayIcon* m_trayIcon;
- ScreenLockListener* m_screenLockListener;
+ QPointer<QSystemTrayIcon> m_trayIcon;
+ QPointer<ScreenLockListener> m_screenLockListener;
QPointer<SearchWidget> m_searchWidget;
Q_DISABLE_COPY(MainWindow)
- bool m_appExitCalled;
- bool m_appExiting;
- bool m_contextMenuFocusLock;
- uint m_lastFocusOutTime;
+ bool m_appExitCalled = false;
+ bool m_appExiting = false;
+ bool m_contextMenuFocusLock = false;
+ uint m_lastFocusOutTime = 0;
QTimer m_trayIconTriggerTimer;
QSystemTrayIcon::ActivationReason m_trayIconTriggerReason;
};
diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui
index 004518eec..068788ecb 100644
--- a/src/gui/MainWindow.ui
+++ b/src/gui/MainWindow.ui
@@ -69,6 +69,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
<property name="currentIndex">
<number>2</number>
</property>
@@ -116,7 +119,11 @@
<number>0</number>
</property>
<item>
- <widget class="ApplicationSettingsWidget" name="settingsWidget" native="true"/>
+ <widget class="ApplicationSettingsWidget" name="settingsWidget" native="true">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ </widget>
</item>
</layout>
</widget>
@@ -141,7 +148,11 @@
</spacer>
</item>
<item>
- <widget class="WelcomeWidget" name="welcomeWidget" native="true"/>
+ <widget class="WelcomeWidget" name="welcomeWidget" native="true">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ </widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
@@ -166,7 +177,11 @@
<widget class="QWidget" name="pagePasswordGenerator">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
- <widget class="PasswordGeneratorWidget" name="passwordGeneratorWidget" native="true"/>
+ <widget class="PasswordGeneratorWidget" name="passwordGeneratorWidget" native="true">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ </widget>
</item>
</layout>
</widget>
@@ -183,6 +198,9 @@
<height>21</height>
</rect>
</property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
<property name="contextMenuPolicy">
<enum>Qt::PreventContextMenu</enum>
</property>
@@ -200,8 +218,16 @@
<string>&amp;Import</string>
</property>
<addaction name="actionImportKeePass1"/>
+ <addaction name="actionImportOpVault"/>
<addaction name="actionImportCsv"/>
</widget>
+ <widget class="QMenu" name="menuExport">
+ <property name="title">
+ <string>&amp;Export</string>
+ </property>
+ <addaction name="actionExportCsv"/>
+ <addaction name="actionExportHtml"/>
+ </widget>
<addaction name="actionDatabaseNew"/>
<addaction name="actionDatabaseOpen"/>
<addaction name="menuRecentDatabases"/>
@@ -214,7 +240,7 @@
<addaction name="separator"/>
<addaction name="actionDatabaseMerge"/>
<addaction name="menuImport"/>
- <addaction name="actionExportCsv"/>
+ <addaction name="menuExport"/>
<addaction name="separator"/>
<addaction name="actionQuit"/>
</widget>
@@ -223,6 +249,12 @@
<string>&amp;Help</string>
</property>
<addaction name="actionAbout"/>
+ <addaction name="separator"/>
+ <addaction name="actionGettingStarted"/>
+ <addaction name="actionUserGuide"/>
+ <addaction name="actionKeyboardShortcuts"/>
+ <addaction name="actionOnlineHelp"/>
+ <addaction name="separator"/>
<addaction name="actionCheckForUpdates"/>
<addaction name="actionDonate"/>
<addaction name="actionBugReport"/>
@@ -266,10 +298,12 @@
<addaction name="actionEntryCopyUsername"/>
<addaction name="actionEntryCopyPassword"/>
<addaction name="menuEntryCopyAttribute"/>
- <addaction name="separator"/>
<addaction name="menuEntryTotp"/>
- <addaction name="actionEntryOpenUrl"/>
+ <addaction name="separator"/>
<addaction name="actionEntryAutoType"/>
+ <addaction name="separator"/>
+ <addaction name="actionEntryOpenUrl"/>
+ <addaction name="actionEntryDownloadIcon"/>
</widget>
<widget class="QMenu" name="menuGroups">
<property name="title">
@@ -280,6 +314,11 @@
<addaction name="actionGroupEdit"/>
<addaction name="actionGroupDelete"/>
<addaction name="actionGroupEmptyRecycleBin"/>
+ <addaction name="separator"/>
+ <addaction name="actionGroupDownloadFavicons"/>
+ <addaction name="separator"/>
+ <addaction name="actionGroupSortAsc"/>
+ <addaction name="actionGroupSortDesc"/>
</widget>
<widget class="QMenu" name="menuTools">
<property name="title">
@@ -296,6 +335,9 @@
<addaction name="menuHelp"/>
</widget>
<widget class="QToolBar" name="toolBar">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
<property name="contextMenuPolicy">
<enum>Qt::PreventContextMenu</enum>
</property>
@@ -351,7 +393,7 @@
</action>
<action name="actionCheckForUpdates">
<property name="text">
- <string>Check for Updates...</string>
+ <string>&amp;Check for Updates...</string>
</property>
<property name="menuRole">
<enum>QAction::ApplicationSpecificRole</enum>
@@ -451,6 +493,30 @@
<string>&amp;Delete group</string>
</property>
</action>
+ <action name="actionGroupDownloadFavicons">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Downlo&amp;ad all favicons</string>
+ </property>
+ </action>
+ <action name="actionGroupSortAsc">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Sort &amp;A-Z</string>
+ </property>
+ </action>
+ <action name="actionGroupSortDesc">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Sort &amp;Z-A</string>
+ </property>
+ </action>
<action name="actionDatabaseSaveAs">
<property name="enabled">
<bool>false</bool>
@@ -527,7 +593,7 @@
<bool>true</bool>
</property>
<property name="text">
- <string>Password Generator</string>
+ <string>&amp;Password Generator</string>
</property>
</action>
<action name="actionEntryAutoType">
@@ -538,6 +604,11 @@
<string>Perform &amp;Auto-Type</string>
</property>
</action>
+ <action name="actionEntryDownloadIcon">
+ <property name="text">
+ <string>Download favicon</string>
+ </property>
+ </action>
<action name="actionEntryOpenUrl">
<property name="enabled">
<bool>false</bool>
@@ -595,6 +666,14 @@
<string>&amp;Export to CSV file...</string>
</property>
</action>
+ <action name="actionExportHtml">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Export to HTML file...</string>
+ </property>
+ </action>
<action name="actionImportKeePass1">
<property name="text">
<string>KeePass 1 database...</string>
@@ -603,6 +682,14 @@
<string>Import a KeePass 1 database</string>
</property>
</action>
+ <action name="actionImportOpVault">
+ <property name="text">
+ <string>1Password Vault...</string>
+ </property>
+ <property name="toolTip">
+ <string>Import a 1Password Vault</string>
+ </property>
+ </action>
<action name="actionImportCsv">
<property name="text">
<string>CSV file...</string>
@@ -649,9 +736,36 @@
<string>Report a &amp;bug</string>
</property>
</action>
- <action name="actionShare_entry">
+ <action name="actionGettingStarted">
<property name="text">
- <string>Share entry</string>
+ <string>&amp;Getting Started</string>
+ </property>
+ <property name="toolTip">
+ <string>Open Getting Started Guide PDF</string>
+ </property>
+ </action>
+ <action name="actionOnlineHelp">
+ <property name="text">
+ <string>&amp;Online Help...</string>
+ </property>
+ <property name="toolTip">
+ <string>Go to online documentation (opens browser)</string>
+ </property>
+ </action>
+ <action name="actionUserGuide">
+ <property name="text">
+ <string>&amp;User Guide</string>
+ </property>
+ <property name="toolTip">
+ <string>Open User Guide PDF</string>
+ </property>
+ </action>
+ <action name="actionKeyboardShortcuts">
+ <property name="text">
+ <string>&amp;Keyboard Shortcuts</string>
+ </property>
+ <property name="shortcut">
+ <string notr="true">Ctrl+/</string>
</property>
</action>
</widget>
diff --git a/src/gui/MessageBox.cpp b/src/gui/MessageBox.cpp
index 582baa5cc..7d2b2a516 100644
--- a/src/gui/MessageBox.cpp
+++ b/src/gui/MessageBox.cpp
@@ -18,6 +18,11 @@
#include "MessageBox.h"
+#include <QCheckBox>
+#include <QWindow>
+
+QWindow* MessageBox::m_overrideParent(nullptr);
+
MessageBox::Button MessageBox::m_nextAnswer(MessageBox::NoButton);
QHash<QAbstractButton*, MessageBox::Button> MessageBox::m_addedButtonLookup =
@@ -58,6 +63,7 @@ void MessageBox::initializeButtonDefs()
{Skip, {QMessageBox::tr("Skip"), QMessageBox::ButtonRole::AcceptRole}},
{Disable, {QMessageBox::tr("Disable"), QMessageBox::ButtonRole::AcceptRole}},
{Merge, {QMessageBox::tr("Merge"), QMessageBox::ButtonRole::AcceptRole}},
+ {Continue, {QMessageBox::tr("Continue"), QMessageBox::ButtonRole::AcceptRole}},
};
}
@@ -73,7 +79,8 @@ MessageBox::Button MessageBox::messageBox(QWidget* parent,
const QString& text,
MessageBox::Buttons buttons,
MessageBox::Button defaultButton,
- MessageBox::Action action)
+ MessageBox::Action action,
+ QCheckBox* checkbox)
{
if (m_nextAnswer == MessageBox::NoButton) {
QMessageBox msgBox(parent);
@@ -81,6 +88,14 @@ MessageBox::Button MessageBox::messageBox(QWidget* parent,
msgBox.setWindowTitle(title);
msgBox.setText(text);
+ if (m_overrideParent) {
+ // Force the creation of the QWindow, without this windowHandle() will return nullptr
+ msgBox.winId();
+ auto msgBoxWindow = msgBox.windowHandle();
+ Q_ASSERT(msgBoxWindow);
+ msgBoxWindow->setTransientParent(m_overrideParent);
+ }
+
for (uint64_t b = First; b <= Last; b <<= 1) {
if (b & buttons) {
QString text = m_buttonDefs[static_cast<Button>(b)].first;
@@ -98,6 +113,11 @@ MessageBox::Button MessageBox::messageBox(QWidget* parent,
}
}
+ if (checkbox) {
+ checkbox->setParent(&msgBox);
+ msgBox.setCheckBox(checkbox);
+ }
+
if (action == MessageBox::Raise) {
msgBox.setWindowFlags(Qt::WindowStaysOnTopHint);
msgBox.activateWindow();
@@ -121,9 +141,21 @@ MessageBox::Button MessageBox::critical(QWidget* parent,
const QString& text,
MessageBox::Buttons buttons,
MessageBox::Button defaultButton,
- MessageBox::Action action)
+ MessageBox::Action action,
+ QCheckBox* checkbox)
+{
+ return messageBox(parent, QMessageBox::Critical, title, text, buttons, defaultButton, action, checkbox);
+}
+
+MessageBox::Button MessageBox::warning(QWidget* parent,
+ const QString& title,
+ const QString& text,
+ MessageBox::Buttons buttons,
+ MessageBox::Button defaultButton,
+ MessageBox::Action action,
+ QCheckBox* checkbox)
{
- return messageBox(parent, QMessageBox::Critical, title, text, buttons, defaultButton, action);
+ return messageBox(parent, QMessageBox::Warning, title, text, buttons, defaultButton, action, checkbox);
}
MessageBox::Button MessageBox::information(QWidget* parent,
@@ -131,9 +163,10 @@ MessageBox::Button MessageBox::information(QWidget* parent,
const QString& text,
MessageBox::Buttons buttons,
MessageBox::Button defaultButton,
- MessageBox::Action action)
+ MessageBox::Action action,
+ QCheckBox* checkbox)
{
- return messageBox(parent, QMessageBox::Information, title, text, buttons, defaultButton, action);
+ return messageBox(parent, QMessageBox::Information, title, text, buttons, defaultButton, action, checkbox);
}
MessageBox::Button MessageBox::question(QWidget* parent,
@@ -141,22 +174,24 @@ MessageBox::Button MessageBox::question(QWidget* parent,
const QString& text,
MessageBox::Buttons buttons,
MessageBox::Button defaultButton,
- MessageBox::Action action)
+ MessageBox::Action action,
+ QCheckBox* checkbox)
{
- return messageBox(parent, QMessageBox::Question, title, text, buttons, defaultButton, action);
+ return messageBox(parent, QMessageBox::Question, title, text, buttons, defaultButton, action, checkbox);
}
-MessageBox::Button MessageBox::warning(QWidget* parent,
- const QString& title,
- const QString& text,
- MessageBox::Buttons buttons,
- MessageBox::Button defaultButton,
- MessageBox::Action action)
+void MessageBox::setNextAnswer(MessageBox::Button button)
{
- return messageBox(parent, QMessageBox::Warning, title, text, buttons, defaultButton, action);
+ m_nextAnswer = button;
}
-void MessageBox::setNextAnswer(MessageBox::Button button)
+MessageBox::OverrideParent::OverrideParent(QWindow* newParent)
+ : m_oldParent(MessageBox::m_overrideParent)
{
- m_nextAnswer = button;
+ MessageBox::m_overrideParent = newParent;
+}
+
+MessageBox::OverrideParent::~OverrideParent()
+{
+ MessageBox::m_overrideParent = m_oldParent;
}
diff --git a/src/gui/MessageBox.h b/src/gui/MessageBox.h
index b8bd10ad8..dc6ed4a40 100644
--- a/src/gui/MessageBox.h
+++ b/src/gui/MessageBox.h
@@ -59,10 +59,11 @@ public:
Skip = 1 << 24,
Disable = 1 << 25,
Merge = 1 << 26,
+ Continue = 1 << 27,
// Internal loop markers. Update Last when new KeePassXC button is added
First = Ok,
- Last = Merge,
+ Last = Continue,
};
enum Action
@@ -80,28 +81,43 @@ public:
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
- Button defaultButton = MessageBox::NoButton,
- Action action = MessageBox::None);
+ Button defaultButton = MessageBox::Ok,
+ Action action = MessageBox::None,
+ QCheckBox* checkbox = nullptr);
+ static Button warning(QWidget* parent,
+ const QString& title,
+ const QString& text,
+ Buttons buttons = MessageBox::Ok,
+ Button defaultButton = MessageBox::Ok,
+ Action action = MessageBox::None,
+ QCheckBox* checkbox = nullptr);
static Button information(QWidget* parent,
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
- Button defaultButton = MessageBox::NoButton,
- Action action = MessageBox::None);
+ Button defaultButton = MessageBox::Ok,
+ Action action = MessageBox::None,
+ QCheckBox* checkbox = nullptr);
static Button question(QWidget* parent,
const QString& title,
const QString& text,
- Buttons buttons = MessageBox::Ok,
- Button defaultButton = MessageBox::NoButton,
- Action action = MessageBox::None);
- static Button warning(QWidget* parent,
- const QString& title,
- const QString& text,
- Buttons buttons = MessageBox::Ok,
- Button defaultButton = MessageBox::NoButton,
- Action action = MessageBox::None);
+ Buttons buttons = MessageBox::Yes | MessageBox::Cancel,
+ Button defaultButton = MessageBox::Cancel,
+ Action action = MessageBox::None,
+ QCheckBox* checkbox = nullptr);
+
+ class OverrideParent
+ {
+ public:
+ explicit OverrideParent(QWindow* newParent);
+ ~OverrideParent();
+
+ private:
+ QWindow* m_oldParent;
+ };
private:
+ static QWindow* m_overrideParent;
static Button m_nextAnswer;
static QHash<QAbstractButton*, Button> m_addedButtonLookup;
static QMap<Button, std::pair<QString, QMessageBox::ButtonRole>> m_buttonDefs;
@@ -112,7 +128,8 @@ private:
const QString& text,
Buttons buttons = MessageBox::Ok,
Button defaultButton = MessageBox::NoButton,
- Action action = MessageBox::None);
+ Action action = MessageBox::None,
+ QCheckBox* checkbox = nullptr);
static QString stdButtonText(QMessageBox::StandardButton button);
};
diff --git a/src/gui/OpVaultOpenWidget.cpp b/src/gui/OpVaultOpenWidget.cpp
new file mode 100644
index 000000000..a322d2835
--- /dev/null
+++ b/src/gui/OpVaultOpenWidget.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "OpVaultOpenWidget.h"
+
+#include <QDir>
+
+#include "core/Database.h"
+#include "core/Metadata.h"
+#include "format/OpVaultReader.h"
+#include "gui/MessageBox.h"
+#include "ui_DatabaseOpenWidget.h"
+
+OpVaultOpenWidget::OpVaultOpenWidget(QWidget* parent)
+ : DatabaseOpenWidget(parent)
+{
+ m_ui->labelHeadline->setText("Import 1Password Database");
+}
+
+void OpVaultOpenWidget::openDatabase()
+{
+ OpVaultReader reader;
+
+ QString password;
+ password = m_ui->editPassword->text();
+
+ QDir opVaultDir(m_filename);
+
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ m_db.reset(reader.readDatabase(opVaultDir, password));
+ QApplication::restoreOverrideCursor();
+
+ if (m_db) {
+ emit dialogFinished(true);
+ } else {
+ m_ui->messageWidget->showMessage(tr("Read Database did not produce an instance\n%1").arg(reader.errorString()),
+ MessageWidget::Error);
+ m_ui->editPassword->clear();
+ }
+}
diff --git a/src/gui/OpVaultOpenWidget.h b/src/gui/OpVaultOpenWidget.h
new file mode 100644
index 000000000..aed96caba
--- /dev/null
+++ b/src/gui/OpVaultOpenWidget.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_OPVAULTOPENWIDGET_H
+#define KEEPASSXC_OPVAULTOPENWIDGET_H
+
+#include "gui/DatabaseOpenWidget.h"
+
+class OpVaultOpenWidget : public DatabaseOpenWidget
+{
+ Q_OBJECT
+
+public:
+ explicit OpVaultOpenWidget(QWidget* parent = nullptr);
+
+protected:
+ void openDatabase() override;
+};
+
+#endif // KEEPASSXC_OPVAULTOPENWIDGET_H
diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp
index e341eddd4..37b82ad8b 100644
--- a/src/gui/PasswordEdit.cpp
+++ b/src/gui/PasswordEdit.cpp
@@ -19,6 +19,7 @@
#include "PasswordEdit.h"
#include "core/Config.h"
+#include "core/FilePath.h"
#include "gui/Font.h"
const QColor PasswordEdit::CorrectSoFarColor = QColor(255, 205, 15);
@@ -28,6 +29,16 @@ PasswordEdit::PasswordEdit(QWidget* parent)
: QLineEdit(parent)
, m_basePasswordEdit(nullptr)
{
+ const QIcon errorIcon = filePath()->icon("status", "dialog-error");
+ m_errorAction = addAction(errorIcon, QLineEdit::TrailingPosition);
+ m_errorAction->setVisible(false);
+ m_errorAction->setToolTip(tr("Passwords do not match"));
+
+ const QIcon correctIcon = filePath()->icon("actions", "dialog-ok");
+ m_correctAction = addAction(correctIcon, QLineEdit::TrailingPosition);
+ m_correctAction->setVisible(false);
+ m_correctAction->setToolTip(tr("Passwords match so far"));
+
setEchoMode(QLineEdit::Password);
updateStylesheet();
@@ -83,20 +94,23 @@ bool PasswordEdit::passwordsEqual() const
void PasswordEdit::updateStylesheet()
{
- QString stylesheet("QLineEdit { ");
+ const QString stylesheetTemplate("QLineEdit { background: %1; }");
if (m_basePasswordEdit && !passwordsEqual()) {
- stylesheet.append("background: %1; ");
-
+ bool isCorrect = true;
if (m_basePasswordEdit->text().startsWith(text())) {
- stylesheet = stylesheet.arg(CorrectSoFarColor.name());
+ setStyleSheet(stylesheetTemplate.arg(CorrectSoFarColor.name()));
} else {
- stylesheet = stylesheet.arg(ErrorColor.name());
+ setStyleSheet(stylesheetTemplate.arg(ErrorColor.name()));
+ isCorrect = false;
}
+ m_correctAction->setVisible(isCorrect);
+ m_errorAction->setVisible(!isCorrect);
+ } else {
+ m_correctAction->setVisible(false);
+ m_errorAction->setVisible(false);
+ setStyleSheet("");
}
-
- stylesheet.append("}");
- setStyleSheet(stylesheet);
}
void PasswordEdit::autocompletePassword(const QString& password)
diff --git a/src/gui/PasswordEdit.h b/src/gui/PasswordEdit.h
index 29b33f0bd..b6e74ed00 100644
--- a/src/gui/PasswordEdit.h
+++ b/src/gui/PasswordEdit.h
@@ -19,6 +19,7 @@
#ifndef KEEPASSX_PASSWORDEDIT_H
#define KEEPASSX_PASSWORDEDIT_H
+#include <QAction>
#include <QLineEdit>
#include <QPointer>
@@ -47,6 +48,8 @@ private slots:
private:
bool passwordsEqual() const;
+ QPointer<QAction> m_errorAction;
+ QPointer<QAction> m_correctAction;
QPointer<PasswordEdit> m_basePasswordEdit;
};
diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp
index 80ea007aa..e0f8fbe5f 100644
--- a/src/gui/PasswordGeneratorWidget.cpp
+++ b/src/gui/PasswordGeneratorWidget.cpp
@@ -60,6 +60,7 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent)
connect(m_ui->comboBoxWordList, SIGNAL(currentIndexChanged(int)), SLOT(updateGenerator()));
connect(m_ui->optionButtons, SIGNAL(buttonClicked(int)), SLOT(updateGenerator()));
connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(updateGenerator()));
+ connect(m_ui->wordCaseComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateGenerator()));
// set font size of password quality and entropy labels dynamically to 80% of
// the default font size, but make it no smaller than 8pt
@@ -74,6 +75,11 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent)
// set default separator to Space
m_ui->editWordSeparator->setText(PassphraseGenerator::DefaultSeparator);
+ // add passphrase generator case options
+ m_ui->wordCaseComboBox->addItem(tr("lower case"), PassphraseGenerator::LOWERCASE);
+ m_ui->wordCaseComboBox->addItem(tr("UPPER CASE"), PassphraseGenerator::UPPERCASE);
+ m_ui->wordCaseComboBox->addItem(tr("Title Case"), PassphraseGenerator::TITLECASE);
+
QDir path(filePath()->wordlistPath(""));
QStringList files = path.entryList(QDir::Files);
m_ui->comboBoxWordList->addItems(files);
@@ -85,15 +91,19 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent)
m_ui->labelWordList->setVisible(false);
}
- m_dicewareGenerator->setDefaultWordList();
loadSettings();
- reset();
}
PasswordGeneratorWidget::~PasswordGeneratorWidget()
{
}
+void PasswordGeneratorWidget::showEvent(QShowEvent* event)
+{
+ QWidget::showEvent(event);
+ reset();
+}
+
void PasswordGeneratorWidget::loadSettings()
{
// Password config
@@ -102,6 +112,8 @@ void PasswordGeneratorWidget::loadSettings()
m_ui->checkBoxUpper->setChecked(config()->get("generator/UpperCase", PasswordGenerator::DefaultUpper).toBool());
m_ui->checkBoxUpperAdv->setChecked(config()->get("generator/UpperCase", PasswordGenerator::DefaultUpper).toBool());
m_ui->checkBoxNumbers->setChecked(config()->get("generator/Numbers", PasswordGenerator::DefaultNumbers).toBool());
+ m_ui->checkBoxSpecialChars->setChecked(
+ config()->get("generator/SpecialChars", PasswordGenerator::DefaultSpecial).toBool());
m_ui->checkBoxNumbersAdv->setChecked(
config()->get("generator/Numbers", PasswordGenerator::DefaultNumbers).toBool());
m_ui->advancedBar->setVisible(
@@ -114,6 +126,7 @@ void PasswordGeneratorWidget::loadSettings()
config()->get("generator/AdvancedMode", PasswordGenerator::DefaultAdvancedMode).toBool());
m_ui->editExcludedChars->setText(
config()->get("generator/ExcludedChars", PasswordGenerator::DefaultExcludedChars).toString());
+
m_ui->simpleBar->setVisible(
!(config()->get("generator/AdvancedMode", PasswordGenerator::DefaultAdvancedMode).toBool()));
m_ui->checkBoxBraces->setChecked(config()->get("generator/Braces", PasswordGenerator::DefaultBraces).toBool());
@@ -139,6 +152,7 @@ void PasswordGeneratorWidget::loadSettings()
config()->get("generator/WordSeparator", PassphraseGenerator::DefaultSeparator).toString());
m_ui->comboBoxWordList->setCurrentText(
config()->get("generator/WordList", PassphraseGenerator::DefaultWordList).toString());
+ m_ui->wordCaseComboBox->setCurrentIndex(config()->get("generator/WordCase", 0).toInt());
// Password or diceware?
m_ui->tabWidget->setCurrentIndex(config()->get("generator/Type", 0).toInt());
@@ -158,6 +172,7 @@ void PasswordGeneratorWidget::saveSettings()
config()->set("generator/Numbers", m_ui->checkBoxNumbersAdv->isChecked());
config()->set("generator/EASCII", m_ui->checkBoxExtASCIIAdv->isChecked());
}
+ config()->set("generator/AdvancedMode", m_ui->advancedBar->isVisible());
config()->set("generator/SpecialChars", m_ui->checkBoxSpecialChars->isChecked());
config()->set("generator/Braces", m_ui->checkBoxBraces->isChecked());
config()->set("generator/Punctuation", m_ui->checkBoxPunctuation->isChecked());
@@ -174,6 +189,7 @@ void PasswordGeneratorWidget::saveSettings()
config()->set("generator/WordCount", m_ui->spinBoxWordCount->value());
config()->set("generator/WordSeparator", m_ui->editWordSeparator->text());
config()->set("generator/WordList", m_ui->comboBoxWordList->currentText());
+ config()->set("generator/WordCase", m_ui->wordCaseComboBox->currentIndex());
// Password or diceware?
config()->set("generator/Type", m_ui->tabWidget->currentIndex());
@@ -247,9 +263,9 @@ void PasswordGeneratorWidget::updatePasswordStrength(const QString& password)
{
double entropy = 0.0;
if (m_ui->tabWidget->currentIndex() == Password) {
- entropy = m_passwordGenerator->calculateEntropy(password);
+ entropy = m_passwordGenerator->estimateEntropy(password);
} else {
- entropy = m_dicewareGenerator->calculateEntropy(password);
+ entropy = m_dicewareGenerator->estimateEntropy();
}
m_ui->entropyLabel->setText(tr("Entropy: %1 bit").arg(QString::number(entropy, 'f', 2)));
@@ -399,7 +415,6 @@ PasswordGenerator::CharClasses PasswordGeneratorWidget::charClasses()
PasswordGenerator::CharClasses classes;
if (m_ui->simpleBar->isVisible()) {
-
if (m_ui->checkBoxLower->isChecked()) {
classes |= PasswordGenerator::LowerLetters;
}
@@ -419,9 +434,7 @@ PasswordGenerator::CharClasses PasswordGeneratorWidget::charClasses()
if (m_ui->checkBoxExtASCII->isChecked()) {
classes |= PasswordGenerator::EASCII;
}
-
} else {
-
if (m_ui->checkBoxLowerAdv->isChecked()) {
classes |= PasswordGenerator::LowerLetters;
}
@@ -556,6 +569,9 @@ void PasswordGeneratorWidget::updateGenerator()
m_updatingSpinBox = false;
}
+ m_dicewareGenerator->setWordCase(
+ static_cast<PassphraseGenerator::PassphraseWordCase>(m_ui->wordCaseComboBox->currentData().toInt()));
+
m_ui->spinBoxWordCount->setMinimum(minWordCount);
m_ui->sliderWordCount->setMinimum(minWordCount);
diff --git a/src/gui/PasswordGeneratorWidget.h b/src/gui/PasswordGeneratorWidget.h
index f736aea13..b39a2f10f 100644
--- a/src/gui/PasswordGeneratorWidget.h
+++ b/src/gui/PasswordGeneratorWidget.h
@@ -53,6 +53,9 @@ public:
QString getGeneratedPassword();
bool isPasswordVisible() const;
+protected:
+ void showEvent(QShowEvent* event) override;
+
public slots:
void regeneratePassword();
void applyPassword();
diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui
index ada94d653..a30077015 100644
--- a/src/gui/PasswordGeneratorWidget.ui
+++ b/src/gui/PasswordGeneratorWidget.ui
@@ -160,6 +160,9 @@ QProgressBar::chunk {
</item>
<item row="0" column="1">
<widget class="PasswordEdit" name="editNewPassword">
+ <property name="accessibleName">
+ <string>Generated password</string>
+ </property>
<property name="maxLength">
<number>999</number>
</property>
@@ -167,6 +170,12 @@ QProgressBar::chunk {
</item>
<item row="0" column="2">
<widget class="QToolButton" name="togglePasswordButton">
+ <property name="accessibleName">
+ <string>Toggle password visibility</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
+ </property>
<property name="checkable">
<bool>true</bool>
</property>
@@ -253,7 +262,13 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Upper Case Letters</string>
+ <string>Upper-case letters</string>
+ </property>
+ <property name="accessibleName">
+ <string>Upper-case letters</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
</property>
<property name="text">
<string notr="true">A-Z</string>
@@ -278,7 +293,13 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Lower Case Letters</string>
+ <string>Lower-case letters</string>
+ </property>
+ <property name="accessibleName">
+ <string>Lower-case letters</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
</property>
<property name="text">
<string notr="true">a-z</string>
@@ -305,6 +326,12 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Numbers</string>
</property>
+ <property name="accessibleName">
+ <string>Numbers</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
+ </property>
<property name="text">
<string notr="true">0-9</string>
</property>
@@ -331,7 +358,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Special Characters</string>
+ <string>Special characters</string>
+ </property>
+ <property name="accessibleName">
+ <string>Special characters</string>
</property>
<property name="text">
<string notr="true">/*_&amp; ...</string>
@@ -364,6 +394,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Extended ASCII</string>
</property>
+ <property name="accessibleName">
+ <string>Extended ASCII</string>
+ </property>
<property name="text">
<string>ExtendedASCII</string>
</property>
@@ -447,7 +480,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Upper Case Letters A to F</string>
+ <string>Upper-case letters</string>
+ </property>
+ <property name="accessibleName">
+ <string>Upper-case letters</string>
</property>
<property name="text">
<string>A-Z</string>
@@ -472,7 +508,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Lower Case Letters A to F</string>
+ <string>Lower-case letters</string>
+ </property>
+ <property name="accessibleName">
+ <string>Lower-case letters</string>
</property>
<property name="text">
<string>a-z</string>
@@ -531,6 +570,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Braces</string>
</property>
+ <property name="accessibleName">
+ <string>Braces</string>
+ </property>
<property name="text">
<string>{[(</string>
</property>
@@ -563,6 +605,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Punctuation</string>
</property>
+ <property name="accessibleName">
+ <string>Punctuation</string>
+ </property>
<property name="text">
<string>.,:;</string>
</property>
@@ -618,7 +663,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Math</string>
+ <string>Math Symbols</string>
+ </property>
+ <property name="accessibleName">
+ <string>Math Symbols</string>
</property>
<property name="text">
<string>&lt;*+!?=</string>
@@ -643,7 +691,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
- <string>Dashes</string>
+ <string>Dashes and Slashes</string>
+ </property>
+ <property name="accessibleName">
+ <string>Dashes and Slashes</string>
</property>
<property name="text">
<string>\_|-/</string>
@@ -677,6 +728,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Logograms</string>
</property>
+ <property name="accessibleName">
+ <string>Logograms</string>
+ </property>
<property name="text">
<string>#$%&amp;&amp;@^`~</string>
</property>
@@ -786,6 +840,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Character set to exclude from generated password</string>
</property>
+ <property name="accessibleName">
+ <string>Excluded characters</string>
+ </property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
@@ -809,6 +866,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Add non-hex letters to &quot;do not include&quot; list</string>
</property>
+ <property name="accessibleName">
+ <string>Hex Passwords</string>
+ </property>
<property name="text">
<string>Hex</string>
</property>
@@ -881,6 +941,9 @@ QProgressBar::chunk {
</item>
<item>
<widget class="QSlider" name="sliderLength">
+ <property name="accessibleName">
+ <string>Password length</string>
+ </property>
<property name="minimum">
<number>1</number>
</property>
@@ -903,6 +966,9 @@ QProgressBar::chunk {
</item>
<item alignment="Qt::AlignRight">
<widget class="QSpinBox" name="spinBoxLength">
+ <property name="accessibleName">
+ <string>Password length</string>
+ </property>
<property name="minimum">
<number>1</number>
</property>
@@ -927,16 +993,10 @@ QProgressBar::chunk {
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0" alignment="Qt::AlignRight">
- <widget class="QLabel" name="labelWordList">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
+ <item row="3" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="wordCaseLabel">
<property name="text">
- <string>Wordlist:</string>
+ <string>Word Case:</string>
</property>
</widget>
</item>
@@ -950,16 +1010,39 @@ QProgressBar::chunk {
</property>
</widget>
</item>
- <item row="1" column="0" alignment="Qt::AlignRight">
- <widget class="QLabel" name="labelWordCount">
+ <item row="2" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="labelWordSeparator">
<property name="text">
- <string>Word Co&amp;unt:</string>
+ <string>Word Separator:</string>
</property>
- <property name="buddy">
- <cstring>spinBoxLength</cstring>
+ </widget>
+ </item>
+ <item row="0" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="labelWordList">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Wordlist:</string>
</property>
</widget>
</item>
+ <item row="4" column="1">
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="sizeConstraint">
@@ -1005,10 +1088,13 @@ QProgressBar::chunk {
</item>
</layout>
</item>
- <item row="2" column="0" alignment="Qt::AlignRight">
- <widget class="QLabel" name="labelWordSeparator">
+ <item row="1" column="0" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="labelWordCount">
<property name="text">
- <string>Word Separator:</string>
+ <string>Word Co&amp;unt:</string>
+ </property>
+ <property name="buddy">
+ <cstring>spinBoxLength</cstring>
</property>
</widget>
</item>
@@ -1020,17 +1106,24 @@ QProgressBar::chunk {
</widget>
</item>
<item row="3" column="1">
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QComboBox" name="wordCaseComboBox"/>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
</item>
</layout>
</item>
@@ -1057,6 +1150,12 @@ QProgressBar::chunk {
</item>
<item>
<widget class="QPushButton" name="buttonGenerate">
+ <property name="toolTip">
+ <string>Regenerate password</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
+ </property>
<property name="text">
<string>Regenerate</string>
</property>
@@ -1064,6 +1163,12 @@ QProgressBar::chunk {
</item>
<item>
<widget class="QPushButton" name="buttonCopy">
+ <property name="toolTip">
+ <string>Copy password</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
+ </property>
<property name="text">
<string>Copy</string>
</property>
@@ -1074,6 +1179,12 @@ QProgressBar::chunk {
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string>Accept password</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
+ </property>
<property name="text">
<string>Accept</string>
</property>
@@ -1109,6 +1220,7 @@ QProgressBar::chunk {
<tabstops>
<tabstop>editNewPassword</tabstop>
<tabstop>togglePasswordButton</tabstop>
+ <tabstop>tabWidget</tabstop>
<tabstop>sliderLength</tabstop>
<tabstop>spinBoxLength</tabstop>
<tabstop>checkBoxUpper</tabstop>
@@ -1122,15 +1234,16 @@ QProgressBar::chunk {
<tabstop>checkBoxPunctuation</tabstop>
<tabstop>checkBoxMath</tabstop>
<tabstop>checkBoxLogograms</tabstop>
+ <tabstop>checkBoxLowerAdv</tabstop>
<tabstop>checkBoxBraces</tabstop>
<tabstop>checkBoxQuotes</tabstop>
<tabstop>checkBoxDashes</tabstop>
<tabstop>checkBoxExtASCIIAdv</tabstop>
<tabstop>editExcludedChars</tabstop>
- <tabstop>buttonSimpleMode</tabstop>
+ <tabstop>buttonAddHex</tabstop>
<tabstop>checkBoxExcludeAlike</tabstop>
<tabstop>checkBoxEnsureEvery</tabstop>
- <tabstop>tabWidget</tabstop>
+ <tabstop>buttonSimpleMode</tabstop>
<tabstop>comboBoxWordList</tabstop>
<tabstop>sliderWordCount</tabstop>
<tabstop>spinBoxWordCount</tabstop>
diff --git a/src/gui/SearchHelpWidget.ui b/src/gui/SearchHelpWidget.ui
index e4d77b1a0..45e0d0bc6 100644
--- a/src/gui/SearchHelpWidget.ui
+++ b/src/gui/SearchHelpWidget.ui
@@ -237,21 +237,21 @@
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
- <string notr="true">username</string>
+ <string notr="true">username (u)</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
- <string notr="true">password</string>
+ <string notr="true">password (p, pw)</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
- <string notr="true">title</string>
+ <string notr="true">title (t)</string>
</property>
</widget>
</item>
@@ -265,21 +265,21 @@
<item row="0" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
- <string notr="true">notes</string>
+ <string notr="true">notes (n)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_12">
<property name="text">
- <string notr="true">attribute</string>
+ <string notr="true">attribute (attr)</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_14">
<property name="text">
- <string notr="true">attachment</string>
+ <string notr="true">attachment (attach)</string>
</property>
</widget>
</item>
diff --git a/src/gui/SearchWidget.cpp b/src/gui/SearchWidget.cpp
index 4b910f4c7..5102d196f 100644
--- a/src/gui/SearchWidget.cpp
+++ b/src/gui/SearchWidget.cpp
@@ -48,7 +48,8 @@ SearchWidget::SearchWidget(QWidget* parent)
connect(m_ui->searchEdit, SIGNAL(textChanged(QString)), SLOT(startSearchTimer()));
connect(m_ui->clearIcon, SIGNAL(triggered(bool)), m_ui->searchEdit, SLOT(clear()));
connect(m_ui->helpIcon, SIGNAL(triggered()), SLOT(toggleHelp()));
- connect(m_searchTimer, SIGNAL(timeout()), this, SLOT(startSearch()));
+ connect(m_ui->searchIcon, SIGNAL(triggered()), SLOT(showSearchMenu()));
+ connect(m_searchTimer, SIGNAL(timeout()), SLOT(startSearch()));
connect(m_clearSearchTimer, SIGNAL(timeout()), m_ui->searchEdit, SLOT(clear()));
connect(this, SIGNAL(escapePressed()), m_ui->searchEdit, SLOT(clear()));
@@ -59,18 +60,17 @@ SearchWidget::SearchWidget(QWidget* parent)
.arg(QKeySequence(QKeySequence::Find).toString(QKeySequence::NativeText)));
m_ui->searchEdit->installEventFilter(this);
- QMenu* searchMenu = new QMenu();
- m_actionCaseSensitive = searchMenu->addAction(tr("Case sensitive"), this, SLOT(updateCaseSensitive()));
+ m_searchMenu = new QMenu();
+ m_actionCaseSensitive = m_searchMenu->addAction(tr("Case sensitive"), this, SLOT(updateCaseSensitive()));
m_actionCaseSensitive->setObjectName("actionSearchCaseSensitive");
m_actionCaseSensitive->setCheckable(true);
- m_actionLimitGroup = searchMenu->addAction(tr("Limit search to selected group"), this, SLOT(updateLimitGroup()));
+ m_actionLimitGroup = m_searchMenu->addAction(tr("Limit search to selected group"), this, SLOT(updateLimitGroup()));
m_actionLimitGroup->setObjectName("actionSearchLimitGroup");
m_actionLimitGroup->setCheckable(true);
m_actionLimitGroup->setChecked(config()->get("SearchLimitGroup", false).toBool());
m_ui->searchIcon->setIcon(filePath()->icon("actions", "system-search"));
- m_ui->searchIcon->setMenu(searchMenu);
m_ui->searchEdit->addAction(m_ui->searchIcon, QLineEdit::LeadingPosition);
m_ui->helpIcon->setIcon(filePath()->icon("actions", "system-help"));
@@ -116,8 +116,13 @@ bool SearchWidget::eventFilter(QObject* obj, QEvent* event)
}
}
} else if (event->type() == QEvent::FocusOut) {
- // Auto-clear search after 5 minutes
- m_clearSearchTimer->start(300000);
+ if (config()->get("security/clearsearch").toBool()) {
+ int timeout = config()->get("security/clearsearchtimeout").toInt();
+ if (timeout > 0) {
+ // Auto-clear search after set timeout (5 minutes by default)
+ m_clearSearchTimer->start(timeout * 60000); // 60 sec * 1000 ms
+ }
+ }
} else if (event->type() == QEvent::FocusIn) {
m_clearSearchTimer->stop();
}
@@ -157,7 +162,7 @@ void SearchWidget::startSearchTimer()
if (!m_searchTimer->isActive()) {
m_searchTimer->stop();
}
- m_searchTimer->start(300);
+ m_searchTimer->start(100);
}
void SearchWidget::startSearch()
@@ -209,3 +214,8 @@ void SearchWidget::toggleHelp()
m_helpWidget->show();
}
}
+
+void SearchWidget::showSearchMenu()
+{
+ m_searchMenu->exec(m_ui->searchEdit->mapToGlobal(m_ui->searchEdit->rect().bottomLeft()));
+}
diff --git a/src/gui/SearchWidget.h b/src/gui/SearchWidget.h
index 43dd76430..f3646c362 100644
--- a/src/gui/SearchWidget.h
+++ b/src/gui/SearchWidget.h
@@ -69,6 +69,7 @@ private slots:
void updateLimitGroup();
void searchFocus();
void toggleHelp();
+ void showSearchMenu();
private:
const QScopedPointer<Ui::SearchWidget> m_ui;
@@ -77,6 +78,7 @@ private:
QTimer* m_clearSearchTimer;
QAction* m_actionCaseSensitive;
QAction* m_actionLimitGroup;
+ QMenu* m_searchMenu;
};
#endif // SEARCHWIDGET_H
diff --git a/src/gui/TotpDialog.cpp b/src/gui/TotpDialog.cpp
index a9e4272d2..3f438e9ae 100644
--- a/src/gui/TotpDialog.cpp
+++ b/src/gui/TotpDialog.cpp
@@ -22,6 +22,9 @@
#include "core/Clock.h"
#include "core/Config.h"
#include "gui/Clipboard.h"
+#include "gui/MainWindow.h"
+
+#include <QShortcut>
TotpDialog::TotpDialog(QWidget* parent, Entry* entry)
: QDialog(parent)
@@ -39,6 +42,7 @@ TotpDialog::TotpDialog(QWidget* parent, Entry* entry)
resetCounter();
updateProgressBar();
+ connect(parent, SIGNAL(lockedDatabase()), SLOT(close()));
connect(&m_totpUpdateTimer, SIGNAL(timeout()), this, SLOT(updateProgressBar()));
connect(&m_totpUpdateTimer, SIGNAL(timeout()), this, SLOT(updateSeconds()));
m_totpUpdateTimer.start(m_step * 10);
@@ -46,6 +50,8 @@ TotpDialog::TotpDialog(QWidget* parent, Entry* entry)
setAttribute(Qt::WA_DeleteOnClose);
+ new QShortcut(QKeySequence(QKeySequence::Copy), this, SLOT(copyToClipboard()));
+
m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Copy"));
connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(close()));
@@ -59,8 +65,13 @@ TotpDialog::~TotpDialog()
void TotpDialog::copyToClipboard()
{
clipboard()->setText(m_entry->totp());
- if (config()->get("MinimizeOnCopy").toBool()) {
- qobject_cast<DatabaseWidget*>(parent())->window()->showMinimized();
+ if (config()->get("HideWindowOnCopy").toBool()) {
+ if (config()->get("MinimizeOnCopy").toBool()) {
+ getMainWindow()->showMinimized();
+ } else if (config()->get("DropToBackgroundOnCopy").toBool()) {
+ getMainWindow()->lower();
+ window()->lower();
+ }
}
}
diff --git a/src/gui/TotpExportSettingsDialog.cpp b/src/gui/TotpExportSettingsDialog.cpp
index dc7fcafd7..178cd6d96 100644
--- a/src/gui/TotpExportSettingsDialog.cpp
+++ b/src/gui/TotpExportSettingsDialog.cpp
@@ -16,10 +16,12 @@
*/
#include "TotpExportSettingsDialog.h"
+
#include "core/Config.h"
#include "core/Entry.h"
#include "gui/Clipboard.h"
#include "gui/DatabaseWidget.h"
+#include "gui/MainWindow.h"
#include "gui/SquareSvgWidget.h"
#include "qrcode/QrCode.h"
#include "totp/totp.h"
@@ -29,6 +31,7 @@
#include <QLabel>
#include <QMessageBox>
#include <QPushButton>
+#include <QShortcut>
#include <QSizePolicy>
#include <QVBoxLayout>
@@ -55,10 +58,13 @@ TotpExportSettingsDialog::TotpExportSettingsDialog(DatabaseWidget* parent, Entry
connect(m_buttonBox, SIGNAL(rejected()), SLOT(close()));
connect(m_buttonBox, SIGNAL(accepted()), SLOT(copyToClipboard()));
- connect(m_timer, SIGNAL(timeout()), this, SLOT(autoClose()));
- connect(parent, SIGNAL(lockedDatabase()), this, SLOT(close()));
+ connect(m_timer, SIGNAL(timeout()), SLOT(autoClose()));
+ connect(parent, SIGNAL(lockedDatabase()), SLOT(close()));
+
+ new QShortcut(QKeySequence(QKeySequence::Copy), this, SLOT(copyToClipboard()));
m_buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Copy"));
+ m_buttonBox->setFocus();
m_countDown->setAlignment(Qt::AlignCenter);
m_secTillClose = 45;
@@ -92,15 +98,18 @@ TotpExportSettingsDialog::TotpExportSettingsDialog(DatabaseWidget* parent, Entry
errorBox->exec();
close();
}
-
- show();
}
void TotpExportSettingsDialog::copyToClipboard()
{
clipboard()->setText(m_totpUri);
- if (config()->get("MinimizeOnCopy").toBool()) {
- static_cast<DatabaseWidget*>(parent())->window()->showMinimized();
+ if (config()->get("HideWindowOnCopy").toBool()) {
+ if (config()->get("MinimizeOnCopy").toBool()) {
+ getMainWindow()->showMinimized();
+ } else if (config()->get("DropToBackgroundOnCopy").toBool()) {
+ getMainWindow()->lower();
+ window()->lower();
+ }
}
}
diff --git a/src/gui/TotpSetupDialog.cpp b/src/gui/TotpSetupDialog.cpp
index 0e2c8da5a..8acf7d115 100644
--- a/src/gui/TotpSetupDialog.cpp
+++ b/src/gui/TotpSetupDialog.cpp
@@ -19,6 +19,8 @@
#include "TotpSetupDialog.h"
#include "ui_TotpSetupDialog.h"
+#include "core/Base32.h"
+#include "gui/MessageBox.h"
#include "totp/totp.h"
TotpSetupDialog::TotpSetupDialog(QWidget* parent, Entry* entry)
@@ -43,37 +45,73 @@ TotpSetupDialog::~TotpSetupDialog()
void TotpSetupDialog::saveSettings()
{
+ // Secret key sanity check
+ auto key = m_ui->seedEdit->text().toLatin1();
+ auto sanitizedKey = Base32::sanitizeInput(key);
+ if (sanitizedKey != key) {
+ MessageBox::information(this,
+ tr("Invalid TOTP Secret"),
+ tr("You have entered an invalid secret key. The key must be in Base32 format.\n"
+ "Example: JBSWY3DPEHPK3PXP"));
+ return;
+ }
+
QString encShortName;
uint digits = Totp::DEFAULT_DIGITS;
uint step = Totp::DEFAULT_STEP;
+ Totp::Algorithm algorithm = Totp::DEFAULT_ALGORITHM;
+ Totp::StorageFormat format = Totp::DEFAULT_FORMAT;
if (m_ui->radioSteam->isChecked()) {
digits = Totp::STEAM_DIGITS;
encShortName = Totp::STEAM_SHORTNAME;
} else if (m_ui->radioCustom->isChecked()) {
+ algorithm = static_cast<Totp::Algorithm>(m_ui->algorithmComboBox->currentData().toInt());
step = m_ui->stepSpinBox->value();
- if (m_ui->radio8Digits->isChecked()) {
- digits = 8;
- } else if (m_ui->radio7Digits->isChecked()) {
- digits = 7;
+ digits = m_ui->digitsSpinBox->value();
+ }
+
+ auto settings = m_entry->totpSettings();
+ if (settings) {
+ if (key.isEmpty()) {
+ auto answer = MessageBox::question(this,
+ tr("Confirm Remove TOTP Settings"),
+ tr("Are you sure you want to delete TOTP settings for this entry?"),
+ MessageBox::Delete | MessageBox::Cancel);
+ if (answer != MessageBox::Delete) {
+ return;
+ }
+ }
+
+ format = settings->format;
+ if (format == Totp::StorageFormat::LEGACY && m_ui->radioCustom->isChecked()) {
+ // Implicitly upgrade to the OTPURL format to allow for custom settings
+ format = Totp::DEFAULT_FORMAT;
}
}
- auto settings = Totp::createSettings(m_ui->seedEdit->text(), digits, step, encShortName, m_entry->totpSettings());
- m_entry->setTotp(settings);
+ m_entry->setTotp(Totp::createSettings(key, digits, step, format, encShortName, algorithm));
emit totpUpdated();
close();
}
void TotpSetupDialog::toggleCustom(bool status)
{
- m_ui->customGroup->setEnabled(status);
+ m_ui->customSettingsGroup->setEnabled(status);
}
void TotpSetupDialog::init()
{
+ // Add algorithm choices
+ auto algorithms = Totp::supportedAlgorithms();
+ for (const auto& item : algorithms) {
+ m_ui->algorithmComboBox->addItem(item.first, item.second);
+ }
+ m_ui->algorithmComboBox->setCurrentIndex(0);
+
+ // Read entry totp settings
auto settings = m_entry->totpSettings();
- if (!settings.isNull()) {
+ if (settings) {
m_ui->seedEdit->setText(settings->key);
m_ui->stepSpinBox->setValue(settings->step);
@@ -81,12 +119,10 @@ void TotpSetupDialog::init()
m_ui->radioSteam->setChecked(true);
} else if (settings->custom) {
m_ui->radioCustom->setChecked(true);
- if (settings->digits == 8) {
- m_ui->radio8Digits->setChecked(true);
- } else if (settings->digits == 7) {
- m_ui->radio7Digits->setChecked(true);
- } else {
- m_ui->radio6Digits->setChecked(true);
+ m_ui->digitsSpinBox->setValue(settings->digits);
+ int index = m_ui->algorithmComboBox->findData(settings->algorithm);
+ if (index != -1) {
+ m_ui->algorithmComboBox->setCurrentIndex(index);
}
}
}
diff --git a/src/gui/TotpSetupDialog.ui b/src/gui/TotpSetupDialog.ui
index 6f2af49f1..84ba4cb54 100644
--- a/src/gui/TotpSetupDialog.ui
+++ b/src/gui/TotpSetupDialog.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>249</width>
- <height>248</height>
+ <height>278</height>
</rect>
</property>
<property name="windowTitle">
@@ -25,12 +25,31 @@
<item>
<widget class="QLabel" name="label_3">
<property name="text">
- <string>Key:</string>
+ <string>Secret Key:</string>
</property>
</widget>
</item>
<item>
- <widget class="QLineEdit" name="seedEdit"/>
+ <widget class="QLineEdit" name="seedEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Secret key must be in Base32 format</string>
+ </property>
+ <property name="accessibleName">
+ <string>Secret key field</string>
+ </property>
+ </widget>
</item>
</layout>
</item>
@@ -86,13 +105,10 @@
</widget>
</item>
<item>
- <widget class="QGroupBox" name="customGroup">
+ <widget class="QGroupBox" name="customSettingsGroup">
<property name="enabled">
<bool>false</bool>
</property>
- <property name="styleSheet">
- <string notr="true"/>
- </property>
<property name="title">
<string>Custom Settings</string>
</property>
@@ -106,21 +122,40 @@
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
</property>
+ <property name="horizontalSpacing">
+ <number>7</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>7</number>
+ </property>
<property name="leftMargin">
- <number>5</number>
+ <number>20</number>
</property>
<property name="rightMargin">
- <number>5</number>
+ <number>20</number>
</property>
<item row="1" column="0">
+ <widget class="QLabel" name="algorithmLabel">
+ <property name="text">
+ <string>Algorithm:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="algorithmComboBox"/>
+ </item>
+ <item row="2" column="0">
<widget class="QLabel" name="stepLabel">
<property name="text">
<string>Time step:</string>
</property>
</widget>
</item>
- <item row="1" column="1">
+ <item row="2" column="1">
<widget class="QSpinBox" name="stepSpinBox">
+ <property name="accessibleName">
+ <string>Time step field</string>
+ </property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
@@ -135,34 +170,26 @@
</property>
</widget>
</item>
- <item row="2" column="0">
+ <item row="3" column="0">
<widget class="QLabel" name="digitsLabel">
<property name="text">
<string>Code size:</string>
</property>
</widget>
</item>
- <item row="2" column="1">
- <widget class="QRadioButton" name="radio6Digits">
- <property name="text">
- <string>6 digits</string>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="digitsSpinBox">
+ <property name="suffix">
+ <string> digits</string>
</property>
- <property name="checked">
- <bool>true</bool>
+ <property name="minimum">
+ <number>6</number>
</property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QRadioButton" name="radio7Digits">
- <property name="text">
- <string>7 digits</string>
+ <property name="maximum">
+ <number>10</number>
</property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QRadioButton" name="radio8Digits">
- <property name="text">
- <string>8 digits</string>
+ <property name="singleStep">
+ <number>1</number>
</property>
</widget>
</item>
@@ -180,7 +207,17 @@
</widget>
</item>
</layout>
+ <zorder>customSettingsGroup</zorder>
+ <zorder>buttonBox</zorder>
+ <zorder>groupBox</zorder>
</widget>
+ <tabstops>
+ <tabstop>seedEdit</tabstop>
+ <tabstop>radioDefault</tabstop>
+ <tabstop>radioSteam</tabstop>
+ <tabstop>radioCustom</tabstop>
+ <tabstop>stepSpinBox</tabstop>
+ </tabstops>
<resources/>
<connections/>
<buttongroups>
diff --git a/src/gui/WelcomeWidget.cpp b/src/gui/WelcomeWidget.cpp
index e5e603672..35cce553e 100644
--- a/src/gui/WelcomeWidget.cpp
+++ b/src/gui/WelcomeWidget.cpp
@@ -48,6 +48,7 @@ WelcomeWidget::WelcomeWidget(QWidget* parent)
connect(m_ui->buttonNewDatabase, SIGNAL(clicked()), SIGNAL(newDatabase()));
connect(m_ui->buttonOpenDatabase, SIGNAL(clicked()), SIGNAL(openDatabase()));
connect(m_ui->buttonImportKeePass1, SIGNAL(clicked()), SIGNAL(importKeePass1Database()));
+ connect(m_ui->buttonImportOpVault, SIGNAL(clicked()), SIGNAL(importOpVaultDatabase()));
connect(m_ui->buttonImportCSV, SIGNAL(clicked()), SIGNAL(importCsv()));
connect(m_ui->recentListWidget,
SIGNAL(itemActivated(QListWidgetItem*)),
diff --git a/src/gui/WelcomeWidget.h b/src/gui/WelcomeWidget.h
index 54827e026..de4956779 100644
--- a/src/gui/WelcomeWidget.h
+++ b/src/gui/WelcomeWidget.h
@@ -41,6 +41,7 @@ signals:
void openDatabase();
void openDatabaseFile(QString);
void importKeePass1Database();
+ void importOpVaultDatabase();
void importCsv();
protected:
diff --git a/src/gui/WelcomeWidget.ui b/src/gui/WelcomeWidget.ui
index a842ff41b..8b72df840 100644
--- a/src/gui/WelcomeWidget.ui
+++ b/src/gui/WelcomeWidget.ui
@@ -127,6 +127,13 @@
</widget>
</item>
<item>
+ <widget class="QPushButton" name="buttonImportOpVault">
+ <property name="text">
+ <string>Import from 1Password</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QPushButton" name="buttonImportCSV">
<property name="text">
<string>Import from CSV</string>
@@ -178,10 +185,21 @@
<height>110</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Open a recent database</string>
+ </property>
</widget>
</item>
</layout>
</widget>
+ <tabstops>
+ <tabstop>buttonNewDatabase</tabstop>
+ <tabstop>buttonOpenDatabase</tabstop>
+ <tabstop>buttonImportKeePass1</tabstop>
+ <tabstop>buttonImportOpVault</tabstop>
+ <tabstop>buttonImportCSV</tabstop>
+ <tabstop>recentListWidget</tabstop>
+ </tabstops>
<resources/>
<connections/>
</ui>
diff --git a/src/gui/csvImport/CsvImportWidget.ui b/src/gui/csvImport/CsvImportWidget.ui
index df0af79f1..beaa39386 100644
--- a/src/gui/csvImport/CsvImportWidget.ui
+++ b/src/gui/csvImport/CsvImportWidget.ui
@@ -143,6 +143,9 @@
<bold>false</bold>
</font>
</property>
+ <property name="accessibleName">
+ <string>Codec</string>
+ </property>
<property name="editable">
<bool>false</bool>
</property>
@@ -184,6 +187,9 @@
<bold>false</bold>
</font>
</property>
+ <property name="accessibleName">
+ <string>Text qualification</string>
+ </property>
<property name="editable">
<bool>false</bool>
</property>
@@ -225,6 +231,9 @@
<bold>false</bold>
</font>
</property>
+ <property name="accessibleName">
+ <string>Field separation</string>
+ </property>
<property name="editable">
<bool>false</bool>
</property>
@@ -266,6 +275,9 @@
<bold>false</bold>
</font>
</property>
+ <property name="accessibleName">
+ <string>Comments start with</string>
+ </property>
<property name="editable">
<bool>false</bool>
</property>
@@ -308,7 +320,7 @@
</font>
</property>
<property name="text">
- <string>Number of headers line to discard</string>
+ <string>Number of header lines to discard</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -323,6 +335,9 @@
<bold>false</bold>
</font>
</property>
+ <property name="accessibleName">
+ <string>Number of header lines to discard</string>
+ </property>
</widget>
</item>
</layout>
@@ -417,6 +432,9 @@
<bold>false</bold>
</font>
</property>
+ <property name="accessibleName">
+ <string>CSV import preview</string>
+ </property>
<attribute name="horizontalHeaderVisible">
<bool>true</bool>
</attribute>
diff --git a/src/gui/dbsettings/DatabaseSettingsDialog.cpp b/src/gui/dbsettings/DatabaseSettingsDialog.cpp
index 6475793f9..33c4df2c4 100644
--- a/src/gui/dbsettings/DatabaseSettingsDialog.cpp
+++ b/src/gui/dbsettings/DatabaseSettingsDialog.cpp
@@ -19,6 +19,7 @@
#include "DatabaseSettingsDialog.h"
#include "ui_DatabaseSettingsDialog.h"
+#include "DatabaseSettingsPageStatistics.h"
#include "DatabaseSettingsWidgetEncryption.h"
#include "DatabaseSettingsWidgetGeneral.h"
#include "DatabaseSettingsWidgetMasterKey.h"
@@ -28,6 +29,9 @@
#if defined(WITH_XC_KEESHARE)
#include "keeshare/DatabaseSettingsPageKeeShare.h"
#endif
+#if defined(WITH_XC_FDOSECRETS)
+#include "fdosecrets/DatabaseSettingsPageFdoSecrets.h"
+#endif
#include "core/Config.h"
#include "core/Database.h"
@@ -74,17 +78,23 @@ DatabaseSettingsDialog::DatabaseSettingsDialog(QWidget* parent)
connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(reject()));
m_ui->categoryList->addCategory(tr("General"), FilePath::instance()->icon("categories", "preferences-other"));
- m_ui->categoryList->addCategory(tr("Security"), FilePath::instance()->icon("actions", "document-encrypt"));
+ m_ui->categoryList->addCategory(tr("Security"), FilePath::instance()->icon("status", "security-high"));
m_ui->stackedWidget->addWidget(m_generalWidget);
m_ui->stackedWidget->addWidget(m_securityTabWidget);
m_securityTabWidget->addTab(m_masterKeyWidget, tr("Master Key"));
m_securityTabWidget->addTab(m_encryptionWidget, tr("Encryption Settings"));
+ addSettingsPage(new DatabaseSettingsPageStatistics());
+
#if defined(WITH_XC_KEESHARE)
addSettingsPage(new DatabaseSettingsPageKeeShare());
#endif
+#if defined(WITH_XC_FDOSECRETS)
+ addSettingsPage(new DatabaseSettingsPageFdoSecrets());
+#endif
+
m_ui->stackedWidget->setCurrentIndex(0);
m_securityTabWidget->setCurrentIndex(0);
diff --git a/src/gui/dbsettings/DatabaseSettingsPageStatistics.cpp b/src/gui/dbsettings/DatabaseSettingsPageStatistics.cpp
new file mode 100644
index 000000000..6fe24ff0f
--- /dev/null
+++ b/src/gui/dbsettings/DatabaseSettingsPageStatistics.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "DatabaseSettingsPageStatistics.h"
+
+#include "DatabaseSettingsWidgetStatistics.h"
+#include "core/Database.h"
+#include "core/FilePath.h"
+#include "core/Group.h"
+
+#include <QApplication>
+
+QString DatabaseSettingsPageStatistics::name()
+{
+ return QApplication::tr("Statistics");
+}
+
+QIcon DatabaseSettingsPageStatistics::icon()
+{
+ return FilePath::instance()->icon("actions", "statistics");
+}
+
+QWidget* DatabaseSettingsPageStatistics::createWidget()
+{
+ return new DatabaseSettingsWidgetStatistics();
+}
+
+void DatabaseSettingsPageStatistics::loadSettings(QWidget* widget, QSharedPointer<Database> db)
+{
+ DatabaseSettingsWidgetStatistics* settingsWidget = reinterpret_cast<DatabaseSettingsWidgetStatistics*>(widget);
+ settingsWidget->loadSettings(db);
+}
+
+void DatabaseSettingsPageStatistics::saveSettings(QWidget* widget)
+{
+ DatabaseSettingsWidgetStatistics* settingsWidget = reinterpret_cast<DatabaseSettingsWidgetStatistics*>(widget);
+ settingsWidget->saveSettings();
+}
diff --git a/src/gui/dbsettings/DatabaseSettingsPageStatistics.h b/src/gui/dbsettings/DatabaseSettingsPageStatistics.h
new file mode 100644
index 000000000..c890f3b81
--- /dev/null
+++ b/src/gui/dbsettings/DatabaseSettingsPageStatistics.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_DATABASESETTINGSPAGESTATISTICS_H
+#define KEEPASSXC_DATABASESETTINGSPAGESTATISTICS_H
+
+#include <QWidget>
+
+#include "DatabaseSettingsDialog.h"
+
+class DatabaseSettingsPageStatistics : public IDatabaseSettingsPage
+{
+public:
+ QString name() override;
+ QIcon icon() override;
+ QWidget* createWidget() override;
+ void loadSettings(QWidget* widget, QSharedPointer<Database> db) override;
+ void saveSettings(QWidget* widget) override;
+};
+
+#endif // KEEPASSXC_DATABASESETTINGSPAGESTATISTICS_H
diff --git a/src/gui/dbsettings/DatabaseSettingsWidget.cpp b/src/gui/dbsettings/DatabaseSettingsWidget.cpp
index 4699344a7..224c4e565 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidget.cpp
+++ b/src/gui/dbsettings/DatabaseSettingsWidget.cpp
@@ -43,3 +43,9 @@ void DatabaseSettingsWidget::load(QSharedPointer<Database> db)
m_db = std::move(db);
initialize();
}
+
+const QSharedPointer<Database> DatabaseSettingsWidget::getDatabase() const
+{
+ return m_db;
+}
+
diff --git a/src/gui/dbsettings/DatabaseSettingsWidget.h b/src/gui/dbsettings/DatabaseSettingsWidget.h
index 5a6e5c069..9efe072b8 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidget.h
+++ b/src/gui/dbsettings/DatabaseSettingsWidget.h
@@ -38,6 +38,8 @@ public:
virtual void load(QSharedPointer<Database> db);
+ const QSharedPointer<Database> getDatabase() const;
+
signals:
/**
* Can be emitted to indicate size changes and allow parents widgets to adjust properly.
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp b/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp
index fac85c21e..4ea30c1f6 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp
@@ -242,12 +242,12 @@ void DatabaseSettingsWidgetBrowser::convertAttributesToCustomData()
{
if (MessageBox::Yes
!= MessageBox::question(
- this,
- tr("Move KeePassHTTP attributes to custom data"),
- tr("Do you really want to move all legacy browser integration data to the latest standard?\n"
- "This is necessary to maintain compatibility with the browser plugin."),
- MessageBox::Yes | MessageBox::Cancel,
- MessageBox::Cancel)) {
+ this,
+ tr("Move KeePassHTTP attributes to custom data"),
+ tr("Do you really want to move all legacy browser integration data to the latest standard?\n"
+ "This is necessary to maintain compatibility with the browser plugin."),
+ MessageBox::Yes | MessageBox::Cancel,
+ MessageBox::Cancel)) {
return;
}
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.ui b/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.ui
index b9bbf433b..463f572d5 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.ui
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetBrowser.ui
@@ -112,6 +112,9 @@
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QTableView" name="customDataTable">
+ <property name="accessibleName">
+ <string>Stored browser keys</string>
+ </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@@ -133,6 +136,9 @@
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="removeCustomDataButton">
+ <property name="accessibleName">
+ <string>Remove selected key</string>
+ </property>
<property name="text">
<string>Remove</string>
</property>
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp b/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp
index e5bd08a10..e2a8cdafe 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp
@@ -400,8 +400,10 @@ void DatabaseSettingsWidgetEncryption::updateFormatCompatibility(int index, bool
if (kdf->uuid() == KeePass2::KDF_ARGON2) {
auto argon2Kdf = kdf.staticCast<Argon2Kdf>();
- argon2Kdf->setMemory(128 * 1024);
- argon2Kdf->setParallelism(static_cast<quint32>(QThread::idealThreadCount()));
+ // Default to 64 MiB of memory and 2 threads
+ // these settings are safe for desktop and mobile devices
+ argon2Kdf->setMemory(1 << 16);
+ argon2Kdf->setParallelism(2);
}
activateChangeDecryptionTime();
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.ui b/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.ui
index 1de060e9a..f8ba579dc 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.ui
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetEncryption.ui
@@ -77,6 +77,9 @@
</item>
<item>
<widget class="QPushButton" name="activateChangeDecryptionTimeButton">
+ <property name="accessibleName">
+ <string>Change existing decryption time</string>
+ </property>
<property name="text">
<string>Change</string>
</property>
@@ -89,6 +92,9 @@
<layout class="QVBoxLayout" name="decryptionTimeSliderLayout">
<item>
<widget class="QSlider" name="decryptionTimeSlider">
+ <property name="accessibleName">
+ <string>Decryption time in seconds</string>
+ </property>
<property name="minimum">
<number>1</number>
</property>
@@ -198,6 +204,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Database format</string>
+ </property>
</widget>
</item>
</layout>
@@ -240,6 +249,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Encryption algorithm</string>
+ </property>
<item>
<property name="text">
<string>AES: 256 Bit (default)</string>
@@ -267,6 +279,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Key derivation function</string>
+ </property>
</widget>
</item>
<item row="2" column="0">
@@ -292,6 +307,9 @@
<height>16777215</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Transform rounds</string>
+ </property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
@@ -349,6 +367,9 @@
<height>16777215</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Memory usage</string>
+ </property>
<property name="minimum">
<number>1</number>
</property>
@@ -378,6 +399,9 @@
<height>16777215</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Parallelism</string>
+ </property>
<property name="minimum">
<number>1</number>
</property>
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp b/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp
index b96016fdc..65d7f52b6 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp
@@ -23,6 +23,7 @@
#include "core/Entry.h"
#include "core/Group.h"
#include "core/Metadata.h"
+#include "gui/MessageBox.h"
DatabaseSettingsWidgetGeneral::DatabaseSettingsWidgetGeneral(QWidget* parent)
: DatabaseSettingsWidget(parent)
@@ -77,9 +78,31 @@ void DatabaseSettingsWidgetGeneral::showEvent(QShowEvent* event)
bool DatabaseSettingsWidgetGeneral::save()
{
+ auto* meta = m_db->metadata();
+
+ if (!m_ui->recycleBinEnabledCheckBox->isChecked() && meta->recycleBinEnabled()) {
+ auto recycleBin = meta->recycleBin();
+ if (recycleBin && !recycleBin->isEmpty()) {
+ auto result = MessageBox::question(this,
+ tr("Delete Recycle Bin"),
+ tr("Do you want to delete the current recycle bin and all its "
+ "contents?\nThis action is not reversible."),
+ MessageBox::Delete | MessageBox::No,
+ MessageBox::No);
+
+ if (result == MessageBox::Delete) {
+ recycleBin->deleteLater();
+ } else {
+ recycleBin->setName(recycleBin->name().append(tr(" (old)")));
+ recycleBin->setIcon(Group::DefaultIconNumber);
+ }
+ }
+
+ meta->setRecycleBin(nullptr);
+ }
+
m_db->setCompressionAlgorithm(m_ui->compressionCheckbox->isChecked() ? Database::CompressionGZip
: Database::CompressionNone);
- Metadata* meta = m_db->metadata();
meta->setName(m_ui->dbNameEdit->text());
meta->setDescription(m_ui->dbDescriptionEdit->text());
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.ui b/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.ui
index 00c1437bb..02f07952b 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.ui
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.ui
@@ -49,7 +49,11 @@
</widget>
</item>
<item row="0" column="1">
- <widget class="QLineEdit" name="dbNameEdit"/>
+ <widget class="QLineEdit" name="dbNameEdit">
+ <property name="accessibleName">
+ <string>Database name field</string>
+ </property>
+ </widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="dbDescriptionLabel">
@@ -59,7 +63,11 @@
</widget>
</item>
<item row="1" column="1">
- <widget class="QLineEdit" name="dbDescriptionEdit"/>
+ <widget class="QLineEdit" name="dbDescriptionEdit">
+ <property name="accessibleName">
+ <string>Database description field</string>
+ </property>
+ </widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="defaultUsernameLabel">
@@ -73,6 +81,9 @@
<property name="enabled">
<bool>true</bool>
</property>
+ <property name="accessibleName">
+ <string>Default username field</string>
+ </property>
</widget>
</item>
</layout>
@@ -88,6 +99,9 @@
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="historyMaxItemsCheckBox">
+ <property name="toolTip">
+ <string>Maximum number of history items per entry</string>
+ </property>
<property name="text">
<string>Max. history items:</string>
</property>
@@ -95,6 +109,9 @@
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="historyMaxSizeCheckBox">
+ <property name="toolTip">
+ <string>Maximum size of history per entry</string>
+ </property>
<property name="text">
<string>Max. history size:</string>
</property>
@@ -102,6 +119,12 @@
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="historyMaxSizeSpinBox">
+ <property name="toolTip">
+ <string>Maximum size of history per entry</string>
+ </property>
+ <property name="accessibleName">
+ <string>Maximum size of history per entry</string>
+ </property>
<property name="suffix">
<string> MiB</string>
</property>
@@ -115,6 +138,12 @@
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="historyMaxItemsSpinBox">
+ <property name="toolTip">
+ <string>Maximum number of history items per entry</string>
+ </property>
+ <property name="accessibleName">
+ <string>Maximum number of history items per entry</string>
+ </property>
<property name="maximum">
<number>2000000000</number>
</property>
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetMasterKey.cpp b/src/gui/dbsettings/DatabaseSettingsWidgetMasterKey.cpp
index ed22244c7..a58ee701f 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetMasterKey.cpp
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetMasterKey.cpp
@@ -155,7 +155,21 @@ bool DatabaseSettingsWidgetMasterKey::save()
}
}
- if (!addToCompositeKey(m_passwordEditWidget, newKey, oldPasswordKey)) {
+ if (m_passwordEditWidget->visiblePage() == KeyComponentWidget::Page::AddNew || m_passwordEditWidget->isEmpty()) {
+ QScopedPointer<QMessageBox> msgBox(new QMessageBox(this));
+ msgBox->setIcon(QMessageBox::Warning);
+ msgBox->setWindowTitle(tr("No password set"));
+ msgBox->setText(tr("WARNING! You have not set a password. Using a database without "
+ "a password is strongly discouraged!\n\n"
+ "Are you sure you want to continue without a password?"));
+ auto btn = msgBox->addButton(tr("Continue without password"), QMessageBox::ButtonRole::AcceptRole);
+ msgBox->addButton(QMessageBox::Cancel);
+ msgBox->setDefaultButton(QMessageBox::Cancel);
+ msgBox->exec();
+ if (msgBox->clickedButton() != btn) {
+ return false;
+ }
+ } else if (!addToCompositeKey(m_passwordEditWidget, newKey, oldPasswordKey)) {
return false;
}
@@ -178,19 +192,6 @@ bool DatabaseSettingsWidgetMasterKey::save()
return false;
}
- if (m_passwordEditWidget->isEmpty()) {
- auto answer = MessageBox::warning(this,
- tr("No password set"),
- tr("WARNING! You have not set a password. Using a database without "
- "a password is strongly discouraged!\n\n"
- "Are you sure you want to continue without a password?"),
- MessageBox::Yes | MessageBox::Cancel,
- MessageBox::Cancel);
- if (answer != MessageBox::Yes) {
- return false;
- }
- }
-
m_db->setKey(newKey, true, false, false);
emit editFinished(true);
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.ui b/src/gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.ui
index b4ac30b9b..6878a5536 100644
--- a/src/gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.ui
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.ui
@@ -31,7 +31,11 @@
</widget>
</item>
<item row="0" column="1">
- <widget class="QLineEdit" name="databaseName"/>
+ <widget class="QLineEdit" name="databaseName">
+ <property name="accessibleName">
+ <string>Database name field</string>
+ </property>
+ </widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="databaseDescriptionLabel">
@@ -41,7 +45,11 @@
</widget>
</item>
<item row="1" column="1">
- <widget class="QLineEdit" name="databaseDescription"/>
+ <widget class="QLineEdit" name="databaseDescription">
+ <property name="accessibleName">
+ <string>Database description field</string>
+ </property>
+ </widget>
</item>
</layout>
</widget>
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.cpp b/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.cpp
new file mode 100644
index 000000000..e61436696
--- /dev/null
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "DatabaseSettingsWidgetStatistics.h"
+#include "ui_DatabaseSettingsWidgetStatistics.h"
+
+#include "core/Database.h"
+#include "core/FilePath.h"
+#include "core/Group.h"
+#include "core/Metadata.h"
+#include "zxcvbn.h"
+
+#include <QFileInfo>
+#include <QHash>
+#include <QStandardItemModel>
+
+namespace
+{
+ class Stats
+ {
+ public:
+ // The statistics we collect:
+ QDateTime modified; // File modification time
+ int nGroups = 0; // Number of groups in the database
+ int nEntries = 0; // Number of entries (across all groups)
+ int nExpired = 0; // Number of expired entries
+ int nPwdsWeak = 0; // Number of weak or poor passwords
+ int nPwdsShort = 0; // Number of passwords 8 characters or less in size
+ int nPwdsUnique = 0; // Number of unique passwords
+ int nPwdsReused = 0; // Number of non-unique passwords
+ int pwdTotalLen = 0; // Total length of all passwords
+
+ // Ctor does all the work
+ explicit Stats(QSharedPointer<Database> db)
+ : modified(QFileInfo(db->filePath()).lastModified())
+ {
+ gatherStats(db->rootGroup()->groupsRecursive(true));
+ }
+
+ // Get average password length
+ int averagePwdLength() const
+ {
+ return m_passwords.empty() ? 0 : pwdTotalLen / m_passwords.size();
+ }
+
+ // Get max number of password reuse (=how many entries
+ // share the same password)
+ int maxPwdReuse() const
+ {
+ int ret = 0;
+ for (const auto& count : m_passwords) {
+ ret = std::max(ret, count);
+ }
+ return ret;
+ }
+
+ // A warning sign is displayed if one of the
+ // following returns true.
+ bool isAnyExpired() const
+ {
+ return nExpired > 0;
+ }
+
+ bool areTooManyPwdsReused() const
+ {
+ return nPwdsReused > nPwdsUnique / 10;
+ }
+
+ bool arePwdsReusedTooOften() const
+ {
+ return maxPwdReuse() > 3;
+ }
+
+ bool isAvgPwdTooShort() const
+ {
+ return averagePwdLength() < 10;
+ }
+
+ private:
+ QHash<QString, int> m_passwords;
+
+ void gatherStats(const QList<Group*>& groups)
+ {
+ for (const auto* group : groups) {
+ // Don't count anything in the recycle bin
+ if (group == group->database()->metadata()->recycleBin()) {
+ continue;
+ }
+
+ ++nGroups;
+
+ for (const auto* entry : group->entries()) {
+ ++nEntries;
+
+ if (entry->isExpired()) {
+ ++nExpired;
+ }
+
+ // Get password statistics
+ const auto pwd = entry->password();
+ if (!pwd.isEmpty()) {
+ if (!m_passwords.contains(pwd)) {
+ ++nPwdsUnique;
+ } else {
+ ++nPwdsReused;
+ }
+
+ if (pwd.size() < 8) {
+ ++nPwdsShort;
+ }
+
+ if (ZxcvbnMatch(pwd.toLatin1(), nullptr, nullptr) < 65) {
+ ++nPwdsWeak;
+ }
+
+ pwdTotalLen += pwd.size();
+ m_passwords[pwd]++;
+ }
+ }
+ }
+ }
+ };
+} // namespace
+
+DatabaseSettingsWidgetStatistics::DatabaseSettingsWidgetStatistics(QWidget* parent)
+ : QWidget(parent)
+ , m_ui(new Ui::DatabaseSettingsWidgetStatistics())
+ , m_errIcon(FilePath::instance()->icon("status", "dialog-error"))
+{
+ m_ui->setupUi(this);
+}
+
+DatabaseSettingsWidgetStatistics::~DatabaseSettingsWidgetStatistics()
+{
+}
+
+void DatabaseSettingsWidgetStatistics::addStatsRow(QString name, QString value, bool bad, QString badMsg)
+{
+ auto row = QList<QStandardItem*>();
+ row << new QStandardItem(name);
+ row << new QStandardItem(value);
+ m_referencesModel->appendRow(row);
+
+ if (bad) {
+ m_referencesModel->item(m_referencesModel->rowCount() - 1, 1)->setIcon(m_errIcon);
+ if (!badMsg.isEmpty()) {
+ m_referencesModel->item(m_referencesModel->rowCount() - 1, 1)->setToolTip(badMsg);
+ }
+ }
+};
+
+void DatabaseSettingsWidgetStatistics::loadSettings(QSharedPointer<Database> db)
+{
+ m_referencesModel.reset(new QStandardItemModel());
+ m_referencesModel->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Value"));
+
+ const auto stats = Stats(db);
+ addStatsRow(tr("Database name"), db->metadata()->name());
+ addStatsRow(tr("Description"), db->metadata()->description());
+ addStatsRow(tr("Location"), db->filePath());
+ addStatsRow(tr("Last saved"), stats.modified.toString(Qt::DefaultLocaleShortDate));
+ addStatsRow(tr("Unsaved changes"),
+ db->isModified() ? tr("yes") : tr("no"),
+ db->isModified(),
+ tr("The database was modified, but the changes have not yet been saved to disk."));
+ addStatsRow(tr("Number of groups"), QString::number(stats.nGroups));
+ addStatsRow(tr("Number of entries"), QString::number(stats.nEntries));
+ addStatsRow(tr("Number of expired entries"),
+ QString::number(stats.nExpired),
+ stats.isAnyExpired(),
+ tr("The database contains entries that have expired."));
+ addStatsRow(tr("Unique passwords"), QString::number(stats.nPwdsUnique));
+ addStatsRow(tr("Non-unique passwords"),
+ QString::number(stats.nPwdsReused),
+ stats.areTooManyPwdsReused(),
+ tr("More than 10% of passwords are reused. Use unique passwords when possible."));
+ addStatsRow(tr("Maximum password reuse"),
+ QString::number(stats.maxPwdReuse()),
+ stats.arePwdsReusedTooOften(),
+ tr("Some passwords are used more than three times. Use unique passwords when possible."));
+ addStatsRow(tr("Number of short passwords"),
+ QString::number(stats.nPwdsShort),
+ stats.nPwdsShort > 0,
+ tr("Recommended minimum password length is at least 8 characters."));
+ addStatsRow(tr("Number of weak passwords"),
+ QString::number(stats.nPwdsWeak),
+ stats.nPwdsWeak > 0,
+ tr("Recommend using long, randomized passwords with a rating of 'good' or 'excellent'."));
+ addStatsRow(tr("Average password length"),
+ tr("%1 characters").arg(stats.averagePwdLength()),
+ stats.isAvgPwdTooShort(),
+ tr("Average password length is less than ten characters. Longer passwords provide more security."));
+
+ m_ui->sharedGroupsView->setModel(m_referencesModel.data());
+ m_ui->sharedGroupsView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+}
+
+void DatabaseSettingsWidgetStatistics::saveSettings()
+{
+ // nothing to do - the tab is passive
+}
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.h b/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.h
new file mode 100644
index 000000000..189df41ff
--- /dev/null
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_DATABASESETTINGSWIDGETSTATISTICS_H
+#define KEEPASSXC_DATABASESETTINGSWIDGETSTATISTICS_H
+
+#include <QIcon>
+#include <QWidget>
+
+class Database;
+class QStandardItemModel;
+
+namespace Ui
+{
+ class DatabaseSettingsWidgetStatistics;
+}
+
+class DatabaseSettingsWidgetStatistics : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit DatabaseSettingsWidgetStatistics(QWidget* parent = nullptr);
+ ~DatabaseSettingsWidgetStatistics();
+
+ void loadSettings(QSharedPointer<Database> db);
+ void saveSettings();
+
+private:
+ QScopedPointer<Ui::DatabaseSettingsWidgetStatistics> m_ui;
+
+ QIcon m_errIcon;
+ QScopedPointer<QStandardItemModel> m_referencesModel;
+
+ void addStatsRow(QString name, QString value, bool bad = false, QString badMsg = "");
+};
+
+#endif // KEEPASSXC_DATABASESETTINGSWIDGETSTATISTICS_H
diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.ui b/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.ui
new file mode 100644
index 000000000..6eef5b366
--- /dev/null
+++ b/src/gui/dbsettings/DatabaseSettingsWidgetStatistics.ui
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DatabaseSettingsWidgetStatistics</class>
+ <widget class="QWidget" name="DatabaseSettingsWidgetStatistics">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>327</width>
+ <height>379</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout" stretch="0">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="enableGroupBox">
+ <property name="title">
+ <string>Statistics</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTableView" name="sharedGroupsView">
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="showDropIndicator" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="textElideMode">
+ <enum>Qt::ElideMiddle</enum>
+ </property>
+ <property name="sortingEnabled">
+ <bool>false</bool>
+ </property>
+ <attribute name="horizontalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderStretchLastSection">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <italic>true</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>Hover over lines with error icons for further information.</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/gui/entry/AutoTypeMatchView.cpp b/src/gui/entry/AutoTypeMatchView.cpp
index 9c4e81d92..180473fd3 100644
--- a/src/gui/entry/AutoTypeMatchView.cpp
+++ b/src/gui/entry/AutoTypeMatchView.cpp
@@ -18,8 +18,11 @@
#include "AutoTypeMatchView.h"
+#include "core/Entry.h"
+#include "gui/Clipboard.h"
#include "gui/SortFilterHideProxyModel.h"
+#include <QAction>
#include <QHeaderView>
#include <QKeyEvent>
@@ -42,13 +45,35 @@ AutoTypeMatchView::AutoTypeMatchView(QWidget* parent)
setSelectionMode(QAbstractItemView::SingleSelection);
header()->setDefaultSectionSize(150);
+ setContextMenuPolicy(Qt::ActionsContextMenu);
+ auto* copyUserNameAction = new QAction(tr("Copy &username"), this);
+ auto* copyPasswordAction = new QAction(tr("Copy &password"), this);
+ addAction(copyUserNameAction);
+ addAction(copyPasswordAction);
+
+ connect(copyUserNameAction, SIGNAL(triggered()), this, SLOT(userNameCopied()));
+ connect(copyPasswordAction, SIGNAL(triggered()), this, SLOT(passwordCopied()));
+
connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex)));
// clang-format off
- connect(
- selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(matchSelectionChanged()));
+ connect(selectionModel(),
+ SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+ SIGNAL(matchSelectionChanged()));
// clang-format on
}
+void AutoTypeMatchView::userNameCopied()
+{
+ clipboard()->setText(currentMatch().entry->username());
+ emit matchTextCopied();
+}
+
+void AutoTypeMatchView::passwordCopied()
+{
+ clipboard()->setText(currentMatch().entry->password());
+ emit matchTextCopied();
+}
+
void AutoTypeMatchView::keyPressEvent(QKeyEvent* event)
{
if ((event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) && currentIndex().isValid()) {
diff --git a/src/gui/entry/AutoTypeMatchView.h b/src/gui/entry/AutoTypeMatchView.h
index b9f3f3aa5..69d0795d9 100644
--- a/src/gui/entry/AutoTypeMatchView.h
+++ b/src/gui/entry/AutoTypeMatchView.h
@@ -42,12 +42,15 @@ public:
signals:
void matchActivated(AutoTypeMatch match);
void matchSelectionChanged();
+ void matchTextCopied();
protected:
void keyPressEvent(QKeyEvent* event) override;
private slots:
void emitMatchActivated(const QModelIndex& index);
+ void userNameCopied();
+ void passwordCopied();
private:
AutoTypeMatchModel* const m_model;
diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp
index 323bf22fc..3fa75e3b8 100644
--- a/src/gui/entry/EditEntryWidget.cpp
+++ b/src/gui/entry/EditEntryWidget.cpp
@@ -19,6 +19,7 @@
#include "EditEntryWidget.h"
#include "ui_EditEntryWidgetAdvanced.h"
#include "ui_EditEntryWidgetAutoType.h"
+#include "ui_EditEntryWidgetBrowser.h"
#include "ui_EditEntryWidgetHistory.h"
#include "ui_EditEntryWidgetMain.h"
#include "ui_EditEntryWidgetSSHAgent.h"
@@ -32,6 +33,7 @@
#include <QSortFilterProxyModel>
#include <QStackedLayout>
#include <QStandardPaths>
+#include <QStringListModel>
#include <QTemporaryFile>
#include "autotype/AutoType.h"
@@ -48,6 +50,10 @@
#include "sshagent/KeeAgentSettings.h"
#include "sshagent/SSHAgent.h"
#endif
+#ifdef WITH_XC_BROWSER
+#include "EntryURLModel.h"
+#include "browser/BrowserService.h"
+#endif
#include "gui/Clipboard.h"
#include "gui/EditWidgetIcons.h"
#include "gui/EditWidgetProperties.h"
@@ -67,6 +73,7 @@ EditEntryWidget::EditEntryWidget(QWidget* parent)
, m_autoTypeUi(new Ui::EditEntryWidgetAutoType())
, m_sshAgentUi(new Ui::EditEntryWidgetSSHAgent())
, m_historyUi(new Ui::EditEntryWidgetHistory())
+ , m_browserUi(new Ui::EditEntryWidgetBrowser())
, m_customData(new CustomData())
, m_mainWidget(new QWidget())
, m_advancedWidget(new QWidget())
@@ -75,6 +82,11 @@ EditEntryWidget::EditEntryWidget(QWidget* parent)
#ifdef WITH_XC_SSHAGENT
, m_sshAgentWidget(new QWidget())
#endif
+#ifdef WITH_XC_BROWSER
+ , m_browserSettingsChanged(false)
+ , m_browserWidget(new QWidget())
+ , m_additionalURLsDataModel(new EntryURLModel(this))
+#endif
, m_editWidgetProperties(new EditWidgetProperties())
, m_historyWidget(new QWidget())
, m_entryAttributes(new EntryAttributes(this))
@@ -85,6 +97,8 @@ EditEntryWidget::EditEntryWidget(QWidget* parent)
, m_autoTypeAssocModel(new AutoTypeAssociationsModel(this))
, m_autoTypeDefaultSequenceGroup(new QButtonGroup(this))
, m_autoTypeWindowSequenceGroup(new QButtonGroup(this))
+ , m_usernameCompleter(new QCompleter(this))
+ , m_usernameCompleterModel(new QStringListModel(this))
{
setupMain();
setupAdvanced();
@@ -100,6 +114,10 @@ EditEntryWidget::EditEntryWidget(QWidget* parent)
}
#endif
+#ifdef WITH_XC_BROWSER
+ setupBrowser();
+#endif
+
setupProperties();
setupHistory();
setupEntryUpdate();
@@ -129,6 +147,12 @@ void EditEntryWidget::setupMain()
m_mainUi->setupUi(m_mainWidget);
addPage(tr("Entry"), FilePath::instance()->icon("actions", "document-edit"), m_mainWidget);
+ m_mainUi->usernameComboBox->setEditable(true);
+ m_usernameCompleter->setCompletionMode(QCompleter::InlineCompletion);
+ m_usernameCompleter->setCaseSensitivity(Qt::CaseSensitive);
+ m_usernameCompleter->setModel(m_usernameCompleterModel);
+ m_mainUi->usernameComboBox->setCompleter(m_usernameCompleter);
+
m_mainUi->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
m_mainUi->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator"));
#ifdef WITH_XC_NETWORKING
@@ -188,6 +212,7 @@ void EditEntryWidget::setupAdvanced()
void EditEntryWidget::setupIcon()
{
+ m_iconsWidget->setShowApplyIconToButton(false);
addPage(tr("Icon"), FilePath::instance()->icon("apps", "preferences-desktop-icons"), m_iconsWidget);
connect(this, SIGNAL(accepted()), m_iconsWidget, SLOT(abortRequests()));
connect(this, SIGNAL(rejected()), m_iconsWidget, SLOT(abortRequests()));
@@ -236,6 +261,121 @@ void EditEntryWidget::setupAutoType()
// clang-format on
}
+#ifdef WITH_XC_BROWSER
+void EditEntryWidget::setupBrowser()
+{
+ m_browserUi->setupUi(m_browserWidget);
+
+ if (config()->get("Browser/Enabled", false).toBool()) {
+ addPage(tr("Browser Integration"), FilePath::instance()->icon("apps", "internet-web-browser"), m_browserWidget);
+ m_additionalURLsDataModel->setEntryAttributes(m_entryAttributes);
+ m_browserUi->additionalURLsView->setModel(m_additionalURLsDataModel);
+
+ // clang-format off
+ connect(m_browserUi->skipAutoSubmitCheckbox, SIGNAL(toggled(bool)), SLOT(updateBrowserModified()));
+ connect(m_browserUi->hideEntryCheckbox, SIGNAL(toggled(bool)), SLOT(updateBrowserModified()));
+ connect(m_browserUi->addURLButton, SIGNAL(clicked()), SLOT(insertURL()));
+ connect(m_browserUi->removeURLButton, SIGNAL(clicked()), SLOT(removeCurrentURL()));
+ connect(m_browserUi->editURLButton, SIGNAL(clicked()), SLOT(editCurrentURL()));
+ connect(m_browserUi->additionalURLsView->selectionModel(),
+ SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ SLOT(updateCurrentURL()));
+ connect(m_additionalURLsDataModel,
+ SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)),
+ SLOT(updateCurrentAttribute()));
+ // clang-format on
+ }
+}
+
+void EditEntryWidget::updateBrowserModified()
+{
+ m_browserSettingsChanged = true;
+}
+
+void EditEntryWidget::updateBrowser()
+{
+ if (!m_browserSettingsChanged) {
+ return;
+ }
+
+ auto skip = m_browserUi->skipAutoSubmitCheckbox->isChecked();
+ auto hide = m_browserUi->hideEntryCheckbox->isChecked();
+ m_customData->set(BrowserService::OPTION_SKIP_AUTO_SUBMIT, (skip ? QString("true") : QString("false")));
+ m_customData->set(BrowserService::OPTION_HIDE_ENTRY, (hide ? QString("true") : QString("false")));
+}
+
+void EditEntryWidget::insertURL()
+{
+ Q_ASSERT(!m_history);
+
+ QString name("KP2A_URL");
+ int i = 1;
+
+ while (m_entryAttributes->keys().contains(name)) {
+ name = QString("KP2A_URL_%1").arg(i);
+ i++;
+ }
+
+ m_entryAttributes->set(name, tr("<empty URL>"));
+ QModelIndex index = m_additionalURLsDataModel->indexByKey(name);
+
+ m_browserUi->additionalURLsView->setCurrentIndex(index);
+ m_browserUi->additionalURLsView->edit(index);
+
+ setModified(true);
+}
+
+void EditEntryWidget::removeCurrentURL()
+{
+ Q_ASSERT(!m_history);
+
+ QModelIndex index = m_browserUi->additionalURLsView->currentIndex();
+
+ if (index.isValid()) {
+ auto result = MessageBox::question(this,
+ tr("Confirm Removal"),
+ tr("Are you sure you want to remove this URL?"),
+ MessageBox::Remove | MessageBox::Cancel,
+ MessageBox::Cancel);
+
+ if (result == MessageBox::Remove) {
+ m_entryAttributes->remove(m_additionalURLsDataModel->keyByIndex(index));
+ if (m_additionalURLsDataModel->rowCount() == 0) {
+ m_browserUi->editURLButton->setEnabled(false);
+ m_browserUi->removeURLButton->setEnabled(false);
+ }
+ setModified(true);
+ }
+ }
+}
+
+void EditEntryWidget::editCurrentURL()
+{
+ Q_ASSERT(!m_history);
+
+ QModelIndex index = m_browserUi->additionalURLsView->currentIndex();
+
+ if (index.isValid()) {
+ m_browserUi->additionalURLsView->edit(index);
+ setModified(true);
+ }
+}
+
+void EditEntryWidget::updateCurrentURL()
+{
+ QModelIndex index = m_browserUi->additionalURLsView->currentIndex();
+
+ if (index.isValid()) {
+ // Don't allow editing in history view
+ m_browserUi->editURLButton->setEnabled(!m_history);
+ m_browserUi->removeURLButton->setEnabled(!m_history);
+ } else {
+ m_browserUi->editURLButton->setEnabled(false);
+ m_browserUi->removeURLButton->setEnabled(false);
+ }
+}
+#endif
+
void EditEntryWidget::setupProperties()
{
addPage(tr("Properties"), FilePath::instance()->icon("actions", "document-properties"), m_editWidgetProperties);
@@ -272,7 +412,7 @@ void EditEntryWidget::setupEntryUpdate()
{
// Entry tab
connect(m_mainUi->titleEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
- connect(m_mainUi->usernameEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
+ connect(m_mainUi->usernameComboBox->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->passwordRepeatEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
@@ -320,6 +460,16 @@ void EditEntryWidget::setupEntryUpdate()
connect(m_sshAgentUi->lifetimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setModified()));
}
#endif
+
+#ifdef WITH_XC_BROWSER
+ if (config()->get("Browser/Enabled", false).toBool()) {
+ connect(m_browserUi->skipAutoSubmitCheckbox, SIGNAL(toggled(bool)), SLOT(setModified()));
+ connect(m_browserUi->hideEntryCheckbox, SIGNAL(toggled(bool)), SLOT(setModified()));
+ connect(m_browserUi->addURLButton, SIGNAL(toggled(bool)), SLOT(setModified()));
+ connect(m_browserUi->removeURLButton, SIGNAL(toggled(bool)), SLOT(setModified()));
+ connect(m_browserUi->editURLButton, SIGNAL(toggled(bool)), SLOT(setModified()));
+ }
+#endif
}
void EditEntryWidget::emitHistoryEntryActivated(const QModelIndex& index)
@@ -659,13 +809,9 @@ void EditEntryWidget::toggleHideNotes(bool visible)
m_mainUi->notesHint->setVisible(!visible);
}
-QString EditEntryWidget::entryTitle() const
+Entry* EditEntryWidget::currentEntry() const
{
- if (m_entry) {
- return m_entry->title();
- } else {
- return QString();
- }
+ return m_entry;
}
void EditEntryWidget::loadEntry(Entry* entry,
@@ -706,7 +852,7 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
m_customData->copyDataFrom(entry->customData());
m_mainUi->titleEdit->setReadOnly(m_history);
- m_mainUi->usernameEdit->setReadOnly(m_history);
+ m_mainUi->usernameComboBox->lineEdit()->setReadOnly(m_history);
m_mainUi->urlEdit->setReadOnly(m_history);
m_mainUi->passwordEdit->setReadOnly(m_history);
m_mainUi->passwordRepeatEdit->setReadOnly(m_history);
@@ -716,6 +862,11 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
m_mainUi->notesEdit->setReadOnly(m_history);
m_mainUi->notesEdit->setVisible(!config()->get("security/hidenotes").toBool());
m_mainUi->notesHint->setVisible(config()->get("security/hidenotes").toBool());
+ if (config()->get("GUI/MonospaceNotes", false).toBool()) {
+ m_mainUi->notesEdit->setFont(Font::fixedFont());
+ } else {
+ m_mainUi->notesEdit->setFont(Font::defaultFont());
+ }
m_mainUi->togglePasswordGeneratorButton->setChecked(false);
m_mainUi->togglePasswordGeneratorButton->setDisabled(m_history);
m_mainUi->passwordGenerator->reset(entry->password().length());
@@ -741,7 +892,7 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
m_historyWidget->setEnabled(!m_history);
m_mainUi->titleEdit->setText(entry->title());
- m_mainUi->usernameEdit->setText(entry->username());
+ m_mainUi->usernameComboBox->lineEdit()->setText(entry->username());
m_mainUi->urlEdit->setText(entry->url());
m_mainUi->passwordEdit->setText(entry->password());
m_mainUi->passwordRepeatEdit->setText(entry->password());
@@ -750,6 +901,13 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
m_mainUi->expirePresets->setEnabled(!m_history);
m_mainUi->togglePasswordButton->setChecked(config()->get("security/passwordscleartext").toBool());
+ QList<QString> commonUsernames = m_db->commonUsernames();
+ m_usernameCompleterModel->setStringList(commonUsernames);
+ QString usernameToRestore = m_mainUi->usernameComboBox->lineEdit()->text();
+ m_mainUi->usernameComboBox->clear();
+ m_mainUi->usernameComboBox->addItems(commonUsernames);
+ m_mainUi->usernameComboBox->lineEdit()->setText(usernameToRestore);
+
m_mainUi->notesEdit->setPlainText(entry->notes());
m_advancedUi->attachmentsWidget->setEntryAttachments(entry->attachments());
@@ -798,6 +956,31 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
}
#endif
+#ifdef WITH_XC_BROWSER
+ if (m_customData->contains(BrowserService::OPTION_SKIP_AUTO_SUBMIT)) {
+ // clang-format off
+ m_browserUi->skipAutoSubmitCheckbox->setChecked(m_customData->value(BrowserService::OPTION_SKIP_AUTO_SUBMIT) == "true");
+ // clang-format on
+ } else {
+ m_browserUi->skipAutoSubmitCheckbox->setChecked(false);
+ }
+
+ if (m_customData->contains(BrowserService::OPTION_HIDE_ENTRY)) {
+ m_browserUi->hideEntryCheckbox->setChecked(m_customData->value(BrowserService::OPTION_HIDE_ENTRY) == "true");
+ } else {
+ m_browserUi->hideEntryCheckbox->setChecked(false);
+ }
+
+ m_browserUi->addURLButton->setEnabled(!m_history);
+ m_browserUi->removeURLButton->setEnabled(false);
+ m_browserUi->editURLButton->setEnabled(false);
+ m_browserUi->additionalURLsView->setEditTriggers(editTriggers);
+
+ if (m_additionalURLsDataModel->rowCount() != 0) {
+ m_browserUi->additionalURLsView->setCurrentIndex(m_additionalURLsDataModel->index(0, 0));
+ }
+#endif
+
m_editWidgetProperties->setFields(entry->timeInfo(), entry->uuid());
if (!m_history && !restore) {
@@ -870,6 +1053,12 @@ bool EditEntryWidget::commitEntry()
}
#endif
+#ifdef WITH_XC_BROWSER
+ if (config()->get("Browser/Enabled", false).toBool()) {
+ updateBrowser();
+ }
+#endif
+
if (!m_create) {
m_entry->beginUpdate();
}
@@ -909,7 +1098,7 @@ void EditEntryWidget::updateEntryData(Entry* entry) const
entry->attachments()->copyDataFrom(m_advancedUi->attachmentsWidget->entryAttachments());
entry->customData()->copyDataFrom(m_customData.data());
entry->setTitle(m_mainUi->titleEdit->text().replace(newLineRegex, " "));
- entry->setUsername(m_mainUi->usernameEdit->text().replace(newLineRegex, " "));
+ entry->setUsername(m_mainUi->usernameComboBox->lineEdit()->text().replace(newLineRegex, " "));
entry->setUrl(m_mainUi->urlEdit->text().replace(newLineRegex, " "));
entry->setPassword(m_mainUi->passwordEdit->text());
entry->setExpires(m_mainUi->expireCheck->isChecked());
diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h
index aea3c894b..39b5fc5d9 100644
--- a/src/gui/entry/EditEntryWidget.h
+++ b/src/gui/entry/EditEntryWidget.h
@@ -20,6 +20,7 @@
#define KEEPASSX_EDITENTRYWIDGET_H
#include <QButtonGroup>
+#include <QCompleter>
#include <QModelIndex>
#include <QPointer>
#include <QScopedPointer>
@@ -40,15 +41,20 @@ class EntryHistoryModel;
class QButtonGroup;
class QMenu;
class QSortFilterProxyModel;
+class QStringListModel;
#ifdef WITH_XC_SSHAGENT
#include "sshagent/KeeAgentSettings.h"
class OpenSSHKey;
#endif
+#ifdef WITH_XC_BROWSER
+class EntryURLModel;
+#endif
namespace Ui
{
class EditEntryWidgetAdvanced;
class EditEntryWidgetAutoType;
+ class EditEntryWidgetBrowser;
class EditEntryWidgetSSHAgent;
class EditEntryWidgetMain;
class EditEntryWidgetHistory;
@@ -66,7 +72,7 @@ public:
void
loadEntry(Entry* entry, bool create, bool history, const QString& parentName, QSharedPointer<Database> database);
- QString entryTitle() const;
+ Entry* currentEntry() const;
void clear();
signals:
@@ -116,12 +122,23 @@ private slots:
void decryptPrivateKey();
void copyPublicKey();
#endif
+#ifdef WITH_XC_BROWSER
+ void updateBrowserModified();
+ void updateBrowser();
+ void insertURL();
+ void removeCurrentURL();
+ void editCurrentURL();
+ void updateCurrentURL();
+#endif
private:
void setupMain();
void setupAdvanced();
void setupIcon();
void setupAutoType();
+#ifdef WITH_XC_BROWSER
+ void setupBrowser();
+#endif
#ifdef WITH_XC_SSHAGENT
void setupSSHAgent();
#endif
@@ -155,6 +172,7 @@ private:
const QScopedPointer<Ui::EditEntryWidgetAutoType> m_autoTypeUi;
const QScopedPointer<Ui::EditEntryWidgetSSHAgent> m_sshAgentUi;
const QScopedPointer<Ui::EditEntryWidgetHistory> m_historyUi;
+ const QScopedPointer<Ui::EditEntryWidgetBrowser> m_browserUi;
const QScopedPointer<CustomData> m_customData;
QWidget* const m_mainWidget;
@@ -164,6 +182,11 @@ private:
#ifdef WITH_XC_SSHAGENT
QWidget* const m_sshAgentWidget;
#endif
+#ifdef WITH_XC_BROWSER
+ bool m_browserSettingsChanged;
+ QWidget* const m_browserWidget;
+ EntryURLModel* const m_additionalURLsDataModel;
+#endif
EditWidgetProperties* const m_editWidgetProperties;
QWidget* const m_historyWidget;
EntryAttributes* const m_entryAttributes;
@@ -175,6 +198,8 @@ private:
AutoTypeAssociationsModel* const m_autoTypeAssocModel;
QButtonGroup* const m_autoTypeDefaultSequenceGroup;
QButtonGroup* const m_autoTypeWindowSequenceGroup;
+ QCompleter* const m_usernameCompleter;
+ QStringListModel* const m_usernameCompleterModel;
Q_DISABLE_COPY(EditEntryWidget)
};
diff --git a/src/gui/entry/EditEntryWidgetAdvanced.ui b/src/gui/entry/EditEntryWidgetAdvanced.ui
index 9556eee19..7b079b676 100644
--- a/src/gui/entry/EditEntryWidgetAdvanced.ui
+++ b/src/gui/entry/EditEntryWidgetAdvanced.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>532</width>
- <height>364</height>
+ <height>374</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
@@ -32,6 +32,9 @@
<height>0</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Attribute selection</string>
+ </property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
@@ -55,6 +58,9 @@
<height>0</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Attribute value</string>
+ </property>
</widget>
</widget>
</item>
@@ -62,6 +68,9 @@
<layout class="QVBoxLayout" name="attributesButtonLayout">
<item>
<widget class="QPushButton" name="addAttributeButton">
+ <property name="accessibleName">
+ <string>Add a new attribute</string>
+ </property>
<property name="text">
<string>Add</string>
</property>
@@ -72,6 +81,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Remove selected attribute</string>
+ </property>
<property name="text">
<string>Remove</string>
</property>
@@ -82,6 +94,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Edit attribute name</string>
+ </property>
<property name="text">
<string>Edit Name</string>
</property>
@@ -105,6 +120,9 @@
<property name="enabled">
<bool>true</bool>
</property>
+ <property name="accessibleName">
+ <string>Toggle attribute protection</string>
+ </property>
<property name="styleSheet">
<string notr="true">margin-left:50%;margin-right:50%</string>
</property>
@@ -121,6 +139,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Show a protected attribute</string>
+ </property>
<property name="text">
<string>Reveal</string>
</property>
@@ -177,6 +198,9 @@
<height>25</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Foreground color selection</string>
+ </property>
<property name="text">
<string/>
</property>
@@ -219,6 +243,9 @@
<height>25</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Background color selection</string>
+ </property>
<property name="text">
<string/>
</property>
@@ -264,6 +291,12 @@
<tabstop>addAttributeButton</tabstop>
<tabstop>removeAttributeButton</tabstop>
<tabstop>editAttributeButton</tabstop>
+ <tabstop>protectAttributeButton</tabstop>
+ <tabstop>revealAttributeButton</tabstop>
+ <tabstop>fgColorCheckBox</tabstop>
+ <tabstop>fgColorButton</tabstop>
+ <tabstop>bgColorCheckBox</tabstop>
+ <tabstop>bgColorButton</tabstop>
</tabstops>
<resources/>
<connections/>
diff --git a/src/gui/entry/EditEntryWidgetAutoType.ui b/src/gui/entry/EditEntryWidgetAutoType.ui
index 81261394d..d987e8047 100644
--- a/src/gui/entry/EditEntryWidgetAutoType.ui
+++ b/src/gui/entry/EditEntryWidgetAutoType.ui
@@ -83,6 +83,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Custom Auto-Type sequence</string>
+ </property>
</widget>
</item>
<item>
@@ -91,10 +94,10 @@
<bool>false</bool>
</property>
<property name="toolTip">
- <string>Open AutoType help webpage</string>
+ <string>Open Auto-Type help webpage</string>
</property>
<property name="accessibleName">
- <string>AutoType help button</string>
+ <string>Open Auto-Type help webpage</string>
</property>
<property name="text">
<string/>
@@ -113,6 +116,9 @@
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTreeView" name="assocView">
+ <property name="accessibleName">
+ <string>Existing window associations</string>
+ </property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
@@ -159,6 +165,12 @@
<height>25</height>
</size>
</property>
+ <property name="toolTip">
+ <string>Add new window association</string>
+ </property>
+ <property name="accessibleName">
+ <string>Add new window association</string>
+ </property>
<property name="text">
<string>+</string>
</property>
@@ -181,6 +193,12 @@
<height>25</height>
</size>
</property>
+ <property name="toolTip">
+ <string>Remove selected window association</string>
+ </property>
+ <property name="accessibleName">
+ <string>Remove selected window association</string>
+ </property>
<property name="text">
<string>-</string>
</property>
@@ -200,7 +218,17 @@
</widget>
</item>
<item>
- <widget class="WindowSelectComboBox" name="windowTitleCombo"/>
+ <widget class="WindowSelectComboBox" name="windowTitleCombo">
+ <property name="toolTip">
+ <string>You can use an asterisk (*) to match everything</string>
+ </property>
+ <property name="accessibleName">
+ <string>Set the window association title</string>
+ </property>
+ <property name="accessibleDescription">
+ <string>You can use an asterisk to match everything</string>
+ </property>
+ </widget>
</item>
<item>
<spacer name="verticalSpacer_3">
@@ -248,6 +276,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Custom Auto-Type sequence for this window</string>
+ </property>
</widget>
</item>
</layout>
diff --git a/src/gui/entry/EditEntryWidgetBrowser.ui b/src/gui/entry/EditEntryWidgetBrowser.ui
new file mode 100644
index 000000000..4d0d29cf7
--- /dev/null
+++ b/src/gui/entry/EditEntryWidgetBrowser.ui
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EditEntryWidgetBrowser</class>
+ <widget class="QWidget" name="EditEntryWidgetBrowser">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>348</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_1">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>These settings affect to the entry's behaviour with the browser extension.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>General</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="skipAutoSubmitCheckbox">
+ <property name="text">
+ <string>Skip Auto-Submit for this entry</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="hideEntryCheckbox">
+ <property name="text">
+ <string>Hide this entry from the browser extension</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>Additional URL's</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_1">
+ <item>
+ <widget class="QListView" name="additionalURLsView">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>QListView::Adjust</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="additionalURLsButtonLayout">
+ <item>
+ <widget class="QPushButton" name="addURLButton">
+ <property name="text">
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="removeURLButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="editURLButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Edit</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>skipAutoSubmitCheckbox</tabstop>
+ <tabstop>hideEntryCheckbox</tabstop>
+ <tabstop>additionalURLsView</tabstop>
+ <tabstop>addURLButton</tabstop>
+ <tabstop>removeURLButton</tabstop>
+ <tabstop>editURLButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/gui/entry/EditEntryWidgetHistory.ui b/src/gui/entry/EditEntryWidgetHistory.ui
index 8390f22fa..b85d3f0c1 100644
--- a/src/gui/entry/EditEntryWidgetHistory.ui
+++ b/src/gui/entry/EditEntryWidgetHistory.ui
@@ -25,6 +25,9 @@
</property>
<item>
<widget class="QTreeView" name="historyView">
+ <property name="accessibleName">
+ <string>Entry history selection</string>
+ </property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
@@ -43,6 +46,12 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string>Show entry at selected history state</string>
+ </property>
+ <property name="accessibleName">
+ <string>Show entry at selected history state</string>
+ </property>
<property name="text">
<string>Show</string>
</property>
@@ -53,6 +62,12 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string>Restore entry to selected history state</string>
+ </property>
+ <property name="accessibleName">
+ <string>Restore entry to selected history state</string>
+ </property>
<property name="text">
<string>Restore</string>
</property>
@@ -63,6 +78,12 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string>Delete selected history state</string>
+ </property>
+ <property name="accessibleName">
+ <string>Delete selected history state</string>
+ </property>
<property name="text">
<string>Delete</string>
</property>
@@ -73,6 +94,12 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string>Delete all history</string>
+ </property>
+ <property name="accessibleName">
+ <string>Delete all history</string>
+ </property>
<property name="text">
<string>Delete all</string>
</property>
diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui
index 3e759fec7..255cd0ab2 100644
--- a/src/gui/entry/EditEntryWidgetMain.ui
+++ b/src/gui/entry/EditEntryWidgetMain.ui
@@ -2,6 +2,14 @@
<ui version="4.0">
<class>EditEntryWidgetMain</class>
<widget class="QWidget" name="EditEntryWidgetMain">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>329</width>
+ <height>381</height>
+ </rect>
+ </property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>0</number>
@@ -22,10 +30,20 @@
<item row="5" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
- <widget class="QLineEdit" name="urlEdit"/>
+ <widget class="QLineEdit" name="urlEdit">
+ <property name="accessibleName">
+ <string>Url field</string>
+ </property>
+ </widget>
</item>
<item>
<widget class="QToolButton" name="fetchFaviconButton">
+ <property name="toolTip">
+ <string>Download favicon for URL</string>
+ </property>
+ <property name="accessibleName">
+ <string>Download favicon for URL</string>
+ </property>
</widget>
</item>
</layout>
@@ -44,6 +62,9 @@
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="PasswordEdit" name="passwordRepeatEdit">
+ <property name="accessibleName">
+ <string>Repeat password field</string>
+ </property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@@ -51,6 +72,12 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordGeneratorButton">
+ <property name="toolTip">
+ <string>Toggle password generator</string>
+ </property>
+ <property name="accessibleName">
+ <string>Toggle password generator</string>
+ </property>
<property name="checkable">
<bool>true</bool>
</property>
@@ -62,6 +89,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="PasswordEdit" name="passwordEdit">
+ <property name="accessibleName">
+ <string>Password field</string>
+ </property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@@ -69,6 +99,12 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordButton">
+ <property name="toolTip">
+ <string>Toggle password visibility</string>
+ </property>
+ <property name="accessibleName">
+ <string>Toggle password visibility</string>
+ </property>
<property name="checkable">
<bool>true</bool>
</property>
@@ -92,6 +128,12 @@
</item>
<item row="9" column="0" alignment="Qt::AlignLeft|Qt::AlignTop">
<widget class="QCheckBox" name="notesEnabled">
+ <property name="toolTip">
+ <string>Toggle notes visible</string>
+ </property>
+ <property name="accessibleName">
+ <string>Toggle notes visible</string>
+ </property>
<property name="text">
<string>Notes</string>
</property>
@@ -104,6 +146,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Expiration field</string>
+ </property>
<property name="calendarPopup">
<bool>true</bool>
</property>
@@ -117,6 +162,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="toolTip">
+ <string>Expiration Presets</string>
+ </property>
+ <property name="accessibleName">
+ <string>Expiration presets</string>
+ </property>
<property name="text">
<string>Presets</string>
</property>
@@ -138,6 +189,9 @@
<height>100</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Notes field</string>
+ </property>
</widget>
</item>
<item row="9" column="1">
@@ -161,13 +215,27 @@
</widget>
</item>
<item row="0" column="1">
- <widget class="QLineEdit" name="titleEdit"/>
+ <widget class="QLineEdit" name="titleEdit">
+ <property name="accessibleName">
+ <string>Title field</string>
+ </property>
+ </widget>
</item>
<item row="1" column="1">
- <widget class="QLineEdit" name="usernameEdit"/>
+ <widget class="QComboBox" name="usernameComboBox">
+ <property name="accessibleName">
+ <string>Username field</string>
+ </property>
+ </widget>
</item>
<item row="7" column="0" alignment="Qt::AlignRight">
<widget class="QCheckBox" name="expireCheck">
+ <property name="toolTip">
+ <string>Toggle expiration</string>
+ </property>
+ <property name="accessibleName">
+ <string>Toggle expiration</string>
+ </property>
<property name="text">
<string>Expires</string>
</property>
@@ -191,14 +259,17 @@
</customwidgets>
<tabstops>
<tabstop>titleEdit</tabstop>
- <tabstop>usernameEdit</tabstop>
+ <tabstop>usernameComboBox</tabstop>
<tabstop>passwordEdit</tabstop>
- <tabstop>passwordRepeatEdit</tabstop>
<tabstop>togglePasswordButton</tabstop>
+ <tabstop>passwordRepeatEdit</tabstop>
<tabstop>togglePasswordGeneratorButton</tabstop>
<tabstop>urlEdit</tabstop>
+ <tabstop>fetchFaviconButton</tabstop>
+ <tabstop>expireCheck</tabstop>
<tabstop>expireDatePicker</tabstop>
<tabstop>expirePresets</tabstop>
+ <tabstop>notesEnabled</tabstop>
<tabstop>notesEdit</tabstop>
</tabstops>
<resources/>
diff --git a/src/gui/entry/EditEntryWidgetSSHAgent.ui b/src/gui/entry/EditEntryWidgetSSHAgent.ui
index 5957f6572..2e9d94b65 100644
--- a/src/gui/entry/EditEntryWidgetSSHAgent.ui
+++ b/src/gui/entry/EditEntryWidgetSSHAgent.ui
@@ -37,6 +37,9 @@
</item>
<item>
<widget class="QSpinBox" name="lifetimeSpinBox">
+ <property name="accessibleName">
+ <string>Remove key from agent after specified seconds</string>
+ </property>
<property name="suffix">
<string> seconds</string>
</property>
@@ -165,6 +168,9 @@
</item>
<item row="3" column="2">
<widget class="QPushButton" name="browseButton">
+ <property name="accessibleName">
+ <string>Browser for key file</string>
+ </property>
<property name="text">
<string extracomment="Button for opening file dialog">Browse...</string>
</property>
@@ -181,7 +187,14 @@
</widget>
</item>
<item row="3" column="1">
- <widget class="QLineEdit" name="externalFileEdit"/>
+ <widget class="QLineEdit" name="externalFileEdit">
+ <property name="focusPolicy">
+ <enum>Qt::ClickFocus</enum>
+ </property>
+ <property name="accessibleName">
+ <string>External key file</string>
+ </property>
+ </widget>
</item>
<item row="4" column="1">
<layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0">
@@ -209,6 +222,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Select attachment file</string>
+ </property>
<property name="editable">
<bool>false</bool>
</property>
@@ -270,6 +286,22 @@
</item>
</layout>
</widget>
+ <tabstops>
+ <tabstop>addKeyToAgentCheckBox</tabstop>
+ <tabstop>removeKeyFromAgentCheckBox</tabstop>
+ <tabstop>requireUserConfirmationCheckBox</tabstop>
+ <tabstop>lifetimeCheckBox</tabstop>
+ <tabstop>lifetimeSpinBox</tabstop>
+ <tabstop>attachmentRadioButton</tabstop>
+ <tabstop>attachmentComboBox</tabstop>
+ <tabstop>externalFileRadioButton</tabstop>
+ <tabstop>browseButton</tabstop>
+ <tabstop>addToAgentButton</tabstop>
+ <tabstop>removeFromAgentButton</tabstop>
+ <tabstop>decryptButton</tabstop>
+ <tabstop>publicKeyEdit</tabstop>
+ <tabstop>copyToClipboardButton</tabstop>
+ </tabstops>
<resources/>
<connections/>
</ui>
diff --git a/src/gui/entry/EntryAttachmentsWidget.ui b/src/gui/entry/EntryAttachmentsWidget.ui
index 60292309f..bd6e15538 100644
--- a/src/gui/entry/EntryAttachmentsWidget.ui
+++ b/src/gui/entry/EntryAttachmentsWidget.ui
@@ -2,6 +2,14 @@
<ui version="4.0">
<class>EntryAttachmentsWidget</class>
<widget class="QWidget" name="EntryAttachmentsWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>337</width>
+ <height>289</height>
+ </rect>
+ </property>
<property name="windowTitle">
<string>Form</string>
</property>
@@ -19,7 +27,11 @@
<number>0</number>
</property>
<item>
- <widget class="QTableView" name="attachmentsView"/>
+ <widget class="QTableView" name="attachmentsView">
+ <property name="accessibleName">
+ <string>Attachments</string>
+ </property>
+ </widget>
</item>
<item>
<widget class="QWidget" name="actionsWidget" native="true">
@@ -41,6 +53,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Add new attachment</string>
+ </property>
<property name="text">
<string>Add</string>
</property>
@@ -51,6 +66,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Remove selected attachment</string>
+ </property>
<property name="text">
<string>Remove</string>
</property>
@@ -61,6 +79,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Open selected attachment</string>
+ </property>
<property name="text">
<string>Open</string>
</property>
@@ -71,6 +92,9 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Save selected attachment to disk</string>
+ </property>
<property name="text">
<string>Save</string>
</property>
diff --git a/src/gui/entry/EntryURLModel.cpp b/src/gui/entry/EntryURLModel.cpp
new file mode 100644
index 000000000..3667c78f0
--- /dev/null
+++ b/src/gui/entry/EntryURLModel.cpp
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2012 Felix Geyer <debfx@fobos.de>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "EntryURLModel.h"
+
+#include "core/Entry.h"
+#include "core/Tools.h"
+
+#include <algorithm>
+
+EntryURLModel::EntryURLModel(QObject* parent)
+ : QStandardItemModel(parent)
+ , m_entryAttributes(nullptr)
+{
+}
+
+void EntryURLModel::setEntryAttributes(EntryAttributes* entryAttributes)
+{
+ beginResetModel();
+
+ if (m_entryAttributes) {
+ m_entryAttributes->disconnect(this);
+ }
+
+ m_entryAttributes = entryAttributes;
+
+ if (m_entryAttributes) {
+ updateAttributes();
+ // clang-format off
+ connect(m_entryAttributes, SIGNAL(added(QString)), SLOT(updateAttributes()));
+ connect(m_entryAttributes, SIGNAL(customKeyModified(QString)), SLOT(updateAttributes()));
+ connect(m_entryAttributes, SIGNAL(removed(QString)), SLOT(updateAttributes()));
+ connect(m_entryAttributes, SIGNAL(renamed(QString,QString)), SLOT(updateAttributes()));
+ connect(m_entryAttributes, SIGNAL(reset()), SLOT(updateAttributes()));
+ // clang-format on
+ }
+
+ endResetModel();
+}
+
+bool EntryURLModel::setData(const QModelIndex& index, const QVariant& value, int role)
+{
+ if (!index.isValid() || role != Qt::EditRole || value.type() != QVariant::String || value.toString().isEmpty()) {
+ return false;
+ }
+
+ const int row = index.row();
+ const QString key = m_urls.at(row).first;
+ const QString oldValue = m_urls.at(row).second;
+
+ if (EntryAttributes::isDefaultAttribute(key) || m_entryAttributes->containsValue(value.toString())) {
+ return false;
+ }
+
+ m_entryAttributes->set(key, value.toString());
+
+ emit dataChanged(this->index(row, 0), this->index(row, columnCount() - 1));
+ return true;
+}
+
+QModelIndex EntryURLModel::indexByKey(const QString& key) const
+{
+ int row = -1;
+ for (int i = 0; i < m_urls.size(); ++i) {
+ if (m_urls.at(i).first == key) {
+ row = i;
+ break;
+ }
+ }
+
+ if (row == -1) {
+ return QModelIndex();
+ } else {
+ return index(row, 0);
+ }
+}
+
+QString EntryURLModel::keyByIndex(const QModelIndex& index) const
+{
+ if (!index.isValid()) {
+ return QString();
+ } else {
+ return m_urls.at(index.row()).first;
+ }
+}
+
+void EntryURLModel::updateAttributes()
+{
+ clear();
+ m_urls.clear();
+
+ const QList<QString> attributesKeyList = m_entryAttributes->keys();
+ for (const QString& key : attributesKeyList) {
+ if (!EntryAttributes::isDefaultAttribute(key) && key.contains("KP2A_URL")) {
+ const auto value = m_entryAttributes->value(key);
+ m_urls.append(qMakePair(key, value));
+
+ auto* item = new QStandardItem(value);
+ if (m_entryAttributes->isProtected(key)) {
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ }
+ appendRow(item);
+ }
+ }
+}
diff --git a/src/gui/entry/EntryURLModel.h b/src/gui/entry/EntryURLModel.h
new file mode 100644
index 000000000..09344d92a
--- /dev/null
+++ b/src/gui/entry/EntryURLModel.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2012 Felix Geyer <debfx@fobos.de>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_ENTRYURLMODEL_H
+#define KEEPASSXC_ENTRYURLMODEL_H
+
+#include <QStandardItemModel>
+
+class EntryAttributes;
+
+class EntryURLModel : public QStandardItemModel
+{
+ Q_OBJECT
+
+public:
+ explicit EntryURLModel(QObject* parent = nullptr);
+ void setEntryAttributes(EntryAttributes* entryAttributes);
+ void insertRow(const QString& key, const QString& value);
+ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
+ QModelIndex indexByKey(const QString& key) const;
+ QString keyByIndex(const QModelIndex& index) const;
+
+private slots:
+ void updateAttributes();
+
+private:
+ QList<QPair<QString, QString>> m_urls;
+ EntryAttributes* m_entryAttributes;
+};
+
+#endif // KEEPASSXC_ENTRYURLMODEL_H
diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp
index cd7896b06..bff11e124 100644
--- a/src/gui/entry/EntryView.cpp
+++ b/src/gui/entry/EntryView.cpp
@@ -18,9 +18,11 @@
#include "EntryView.h"
+#include <QAccessible>
#include <QHeaderView>
#include <QKeyEvent>
#include <QMenu>
+#include <QShortcut>
#include "core/FilePath.h"
#include "gui/SortFilterHideProxyModel.h"
@@ -56,6 +58,8 @@ EntryView::EntryView(QWidget* parent)
connect(m_model, SIGNAL(passwordsHiddenChanged()), SIGNAL(viewStateChanged()));
// clang-format on
+ new QShortcut(Qt::CTRL + Qt::Key_F10, this, SLOT(contextMenuShortcutPressed()), nullptr, Qt::WidgetShortcut);
+
m_headerMenu = new QMenu(this);
m_headerMenu->setTitle(tr("Customize View"));
m_headerMenu->addSection(tr("Customize View"));
@@ -128,6 +132,14 @@ EntryView::EntryView(QWidget* parent)
m_model->setPaperClipPixmap(filePath()->icon("actions", "paperclip").pixmap(16));
}
+void EntryView::contextMenuShortcutPressed()
+{
+ auto index = currentIndex();
+ if (hasFocus() && index.isValid()) {
+ emit customContextMenuRequested(visualRect(index).bottomLeft());
+ }
+}
+
void EntryView::keyPressEvent(QKeyEvent* event)
{
if ((event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) && currentIndex().isValid()) {
@@ -140,15 +152,18 @@ void EntryView::keyPressEvent(QKeyEvent* event)
int last = m_model->rowCount() - 1;
if (last > 0) {
+ QAccessibleEvent accessibleEvent(this, QAccessible::PageChanged);
if (event->key() == Qt::Key_Up && currentIndex().row() == 0) {
QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(last, 0));
setCurrentEntry(m_model->entryFromIndex(index));
+ QAccessible::updateAccessibility(&accessibleEvent);
return;
}
if (event->key() == Qt::Key_Down && currentIndex().row() == last) {
QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0));
setCurrentEntry(m_model->entryFromIndex(index));
+ QAccessible::updateAccessibility(&accessibleEvent);
return;
}
}
diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h
index 09dfd8dde..53de7aff5 100644
--- a/src/gui/entry/EntryView.h
+++ b/src/gui/entry/EntryView.h
@@ -72,6 +72,7 @@ private slots:
void fitColumnsToWindow();
void fitColumnsToContents();
void resetViewToDefaults();
+ void contextMenuShortcutPressed();
private:
void fillRemainingWidth(bool lastColumnOnly);
diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp
index 051f23d4b..30d8fb913 100644
--- a/src/gui/group/EditGroupWidget.cpp
+++ b/src/gui/group/EditGroupWidget.cpp
@@ -16,8 +16,10 @@
*/
#include "EditGroupWidget.h"
+#include "gui/Font.h"
#include "ui_EditGroupWidgetMain.h"
+#include "core/Config.h"
#include "core/FilePath.h"
#include "core/Metadata.h"
#include "gui/EditWidgetIcons.h"
@@ -151,6 +153,12 @@ void EditGroupWidget::loadGroup(Group* group, bool create, const QSharedPointer<
}
m_mainUi->autoTypeSequenceCustomEdit->setText(group->effectiveAutoTypeSequence());
+ if (config()->get("GUI/MonospaceNotes", false).toBool()) {
+ m_mainUi->editNotes->setFont(Font::fixedFont());
+ } else {
+ m_mainUi->editNotes->setFont(Font::defaultFont());
+ }
+
IconStruct iconStruct;
iconStruct.uuid = m_temporaryGroup->iconUuid();
iconStruct.number = m_temporaryGroup->iconNumber();
@@ -212,6 +220,17 @@ void EditGroupWidget::apply()
// Icons add/remove are applied globally outside the transaction!
m_group->copyDataFrom(m_temporaryGroup.data());
+ // Assign the icon to children if selected
+ if (iconStruct.applyTo == ApplyIconToOptions::CHILD_GROUPS
+ || iconStruct.applyTo == ApplyIconToOptions::ALL_CHILDREN) {
+ m_group->applyGroupIconToChildGroups();
+ }
+
+ if (iconStruct.applyTo == ApplyIconToOptions::CHILD_ENTRIES
+ || iconStruct.applyTo == ApplyIconToOptions::ALL_CHILDREN) {
+ m_group->applyGroupIconToChildEntries();
+ }
+
setModified(false);
}
diff --git a/src/gui/group/EditGroupWidgetMain.ui b/src/gui/group/EditGroupWidgetMain.ui
index 20ce2f414..486e408b6 100644
--- a/src/gui/group/EditGroupWidgetMain.ui
+++ b/src/gui/group/EditGroupWidgetMain.ui
@@ -31,7 +31,11 @@
</widget>
</item>
<item row="0" column="1">
- <widget class="QLineEdit" name="editName"/>
+ <widget class="QLineEdit" name="editName">
+ <property name="accessibleName">
+ <string>Name field</string>
+ </property>
+ </widget>
</item>
<item row="1" column="0" alignment="Qt::AlignRight|Qt::AlignTop">
<widget class="QLabel" name="labelNotes">
@@ -54,23 +58,36 @@
<height>120</height>
</size>
</property>
+ <property name="accessibleName">
+ <string>Notes field</string>
+ </property>
</widget>
</item>
<item row="2" column="0" alignment="Qt::AlignRight">
<widget class="QCheckBox" name="expireCheck">
+ <property name="accessibleName">
+ <string>Toggle expiration</string>
+ </property>
<property name="text">
<string>Expires</string>
</property>
</widget>
</item>
<item row="4" column="1">
- <widget class="QComboBox" name="autotypeComboBox"/>
+ <widget class="QComboBox" name="autotypeComboBox">
+ <property name="accessibleName">
+ <string>Auto-Type toggle for this and sub groups</string>
+ </property>
+ </widget>
</item>
<item row="2" column="1">
<widget class="QDateTimeEdit" name="expireDatePicker">
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Expiration field</string>
+ </property>
<property name="calendarPopup">
<bool>true</bool>
</property>
@@ -84,7 +101,11 @@
</widget>
</item>
<item row="3" column="1">
- <widget class="QComboBox" name="searchComboBox"/>
+ <widget class="QComboBox" name="searchComboBox">
+ <property name="accessibleName">
+ <string>Search toggle for this and sub groups</string>
+ </property>
+ </widget>
</item>
<item row="4" column="0" alignment="Qt::AlignRight">
<widget class="QLabel" name="autotypeLabel">
@@ -130,6 +151,12 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="accessibleName">
+ <string>Default auto-type sequence field</string>
+ </property>
+ <property name="accessibleDescription">
+ <string/>
+ </property>
</widget>
</item>
</layout>
diff --git a/src/gui/group/GroupModel.cpp b/src/gui/group/GroupModel.cpp
index dae9f759a..d3f2f40f6 100644
--- a/src/gui/group/GroupModel.cpp
+++ b/src/gui/group/GroupModel.cpp
@@ -410,3 +410,30 @@ void GroupModel::groupMoved()
{
endMoveRows();
}
+
+void GroupModel::sortChildren(Group* rootGroup, bool reverse)
+{
+ emit layoutAboutToBeChanged();
+
+ QList<QModelIndex> oldIndexes;
+ collectIndexesRecursively(oldIndexes, rootGroup->children());
+
+ rootGroup->sortChildrenRecursively(reverse);
+
+ QList<QModelIndex> newIndexes;
+ collectIndexesRecursively(newIndexes, rootGroup->children());
+
+ for (int i = 0; i < oldIndexes.count(); i++) {
+ changePersistentIndex(oldIndexes[i], newIndexes[i]);
+ }
+
+ emit layoutChanged();
+}
+
+void GroupModel::collectIndexesRecursively(QList<QModelIndex>& indexes, QList<Group*> groups)
+{
+ for (auto group : groups) {
+ indexes.append(index(group));
+ collectIndexesRecursively(indexes, group->children());
+ }
+}
diff --git a/src/gui/group/GroupModel.h b/src/gui/group/GroupModel.h
index ca5370d78..dae2bb930 100644
--- a/src/gui/group/GroupModel.h
+++ b/src/gui/group/GroupModel.h
@@ -45,9 +45,11 @@ public:
dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) override;
QStringList mimeTypes() const override;
QMimeData* mimeData(const QModelIndexList& indexes) const override;
+ void sortChildren(Group* rootGroup, bool reverse = false);
private:
QModelIndex parent(Group* group) const;
+ void collectIndexesRecursively(QList<QModelIndex>& indexes, QList<Group*> groups);
private slots:
void groupDataChanged(Group* group);
diff --git a/src/gui/group/GroupView.cpp b/src/gui/group/GroupView.cpp
index fa7023351..33c591696 100644
--- a/src/gui/group/GroupView.cpp
+++ b/src/gui/group/GroupView.cpp
@@ -20,6 +20,7 @@
#include <QDragMoveEvent>
#include <QMetaObject>
#include <QMimeData>
+#include <QShortcut>
#include "core/Database.h"
#include "core/Group.h"
@@ -42,6 +43,8 @@ GroupView::GroupView(Database* db, QWidget* parent)
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(emitGroupChanged()));
// clang-format on
+ new QShortcut(Qt::CTRL + Qt::Key_F10, this, SLOT(contextMenuShortcutPressed()), nullptr, Qt::WidgetShortcut);
+
modelReset();
setDragEnabled(true);
@@ -50,6 +53,14 @@ GroupView::GroupView(Database* db, QWidget* parent)
setDefaultDropAction(Qt::MoveAction);
}
+void GroupView::contextMenuShortcutPressed()
+{
+ auto index = currentIndex();
+ if (hasFocus() && index.isValid()) {
+ emit customContextMenuRequested(visualRect(index).bottomLeft());
+ }
+}
+
void GroupView::changeDatabase(const QSharedPointer<Database>& newDb)
{
m_model->changeDatabase(newDb.data());
@@ -115,6 +126,14 @@ void GroupView::expandGroup(Group* group, bool expand)
setExpanded(index, expand);
}
+void GroupView::sortGroups(bool reverse)
+{
+ Group* group = currentGroup();
+ if (group) {
+ m_model->sortChildren(group, reverse);
+ }
+}
+
void GroupView::setModel(QAbstractItemModel* model)
{
Q_UNUSED(model);
diff --git a/src/gui/group/GroupView.h b/src/gui/group/GroupView.h
index 609ab0e03..00b5a28c0 100644
--- a/src/gui/group/GroupView.h
+++ b/src/gui/group/GroupView.h
@@ -35,6 +35,7 @@ public:
Group* currentGroup();
void setCurrentGroup(Group* group);
void expandGroup(Group* group, bool expand = true);
+ void sortGroups(bool reverse = false);
signals:
void groupSelectionChanged(Group* group);
@@ -44,6 +45,7 @@ private slots:
void emitGroupChanged();
void syncExpandedState(const QModelIndex& parent, int start, int end);
void modelReset();
+ void contextMenuShortcutPressed();
protected:
void dragMoveEvent(QDragMoveEvent* event) override;
diff --git a/src/gui/macutils/AppKit.h b/src/gui/macutils/AppKit.h
index da81f6913..d7a5ba16e 100644
--- a/src/gui/macutils/AppKit.h
+++ b/src/gui/macutils/AppKit.h
@@ -20,7 +20,7 @@
#define KEEPASSX_APPKIT_H
#include <QObject>
-#include <unistd.h>
+#include <CoreGraphics/CGEvent.h>
class AppKit : public QObject
{
@@ -37,12 +37,15 @@ public:
bool hideProcess(pid_t pid);
bool isHidden(pid_t pid);
bool isDarkMode();
+ void* addGlobalMonitor(CGKeyCode keycode, CGEventFlags modifier, void* userData, void (*handler)(void*));
+ void removeGlobalMonitor(void* monitor);
+ bool enableAccessibility();
signals:
void lockDatabases();
private:
- void *self;
+ void* self;
};
#endif // KEEPASSX_APPKIT_H
diff --git a/src/gui/macutils/AppKitImpl.h b/src/gui/macutils/AppKitImpl.h
index ca2506794..54f695919 100644
--- a/src/gui/macutils/AppKitImpl.h
+++ b/src/gui/macutils/AppKitImpl.h
@@ -19,13 +19,14 @@
#import "AppKit.h"
#import <Foundation/Foundation.h>
+#import <AppKit/NSEvent.h>
#import <AppKit/NSRunningApplication.h>
@interface AppKitImpl : NSObject
{
- AppKit *m_appkit;
+ AppKit* m_appkit;
}
-- (id) initWithObject:(AppKit *)appkit;
+- (id) initWithObject:(AppKit*)appkit;
@property (strong) NSRunningApplication *lastActiveApplication;
@@ -36,5 +37,8 @@
- (bool) isHidden:(pid_t) pid;
- (bool) isDarkMode;
- (void) userSwitchHandler:(NSNotification*) notification;
+- (id) addGlobalMonitor:(NSEventMask) mask handler:(void (^)(NSEvent*)) handler;
+- (void) removeGlobalMonitor:(id) monitor;
+- (bool) enableAccessibility;
@end
diff --git a/src/gui/macutils/AppKitImpl.mm b/src/gui/macutils/AppKitImpl.mm
index 4165e0d5e..fa0128569 100644
--- a/src/gui/macutils/AppKitImpl.mm
+++ b/src/gui/macutils/AppKitImpl.mm
@@ -19,10 +19,15 @@
#import "AppKitImpl.h"
#import <AppKit/NSWorkspace.h>
+#import <Availability.h>
+
+#if __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+static const NSEventMask NSEventMaskKeyDown = NSKeyDownMask;
+#endif
@implementation AppKitImpl
-- (id) initWithObject:(AppKit *)appkit
+- (id) initWithObject:(AppKit*)appkit
{
self = [super init];
if (self) {
@@ -43,10 +48,10 @@
//
// Update last active application property
//
-- (void) didDeactivateApplicationObserver:(NSNotification *) notification
+- (void) didDeactivateApplicationObserver:(NSNotification*) notification
{
- NSDictionary *userInfo = notification.userInfo;
- NSRunningApplication *app = userInfo[NSWorkspaceApplicationKey];
+ NSDictionary* userInfo = notification.userInfo;
+ NSRunningApplication* app = userInfo[NSWorkspaceApplicationKey];
if (app.processIdentifier != [self ownProcessId]) {
self.lastActiveApplication = app;
@@ -74,7 +79,7 @@
//
- (bool) activateProcess:(pid_t) pid
{
- NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
+ NSRunningApplication* app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
return [app activateWithOptions:NSApplicationActivateIgnoringOtherApps];
}
@@ -83,7 +88,7 @@
//
- (bool) hideProcess:(pid_t) pid
{
- NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
+ NSRunningApplication* app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
return [app hide];
}
@@ -92,7 +97,7 @@
//
- (bool) isHidden:(pid_t) pid
{
- NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
+ NSRunningApplication* app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
return [app isHidden];
}
@@ -101,7 +106,7 @@
//
- (bool) isDarkMode
{
- NSDictionary *dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain];
+ NSDictionary* dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain];
id style = [dict objectForKey:@"AppleInterfaceStyle"];
return ( style && [style isKindOfClass:[NSString class]]
&& NSOrderedSame == [style caseInsensitiveCompare:@"dark"] );
@@ -118,6 +123,42 @@
}
}
+//
+// Add global event monitor
+//
+- (id) addGlobalMonitor:(NSEventMask) mask handler:(void (^)(NSEvent*)) handler
+{
+ return [NSEvent addGlobalMonitorForEventsMatchingMask:mask handler:handler];
+}
+
+//
+// Remove global event monitor
+//
+- (void) removeGlobalMonitor:(id) monitor
+{
+ [NSEvent removeMonitor:monitor];
+}
+
+//
+// Check if accessibility is enabled, may show an popup asking for permissions
+//
+- (bool) enableAccessibility
+{
+ // Request a 1 pixel screenshot to trigger the permissions
+ // required for screen reader access. These are necessary
+ // for Auto-Type to find the window titles in macOS 10.15+
+ CGImageRef screenshot = CGWindowListCreateImage(
+ CGRectMake(0, 0, 1, 1),
+ kCGWindowListOptionOnScreenOnly,
+ kCGNullWindowID,
+ kCGWindowImageDefault);
+ CFRelease(screenshot);
+
+ // Request accessibility permissions for Auto-Type type on behalf of the user
+ NSDictionary* opts = @{static_cast<id>(kAXTrustedCheckOptionPrompt): @YES};
+ return AXIsProcessTrustedWithOptions(static_cast<CFDictionaryRef>(opts));
+}
+
@end
//
@@ -169,3 +210,22 @@ bool AppKit::isDarkMode()
{
return [static_cast<id>(self) isDarkMode];
}
+
+void* AppKit::addGlobalMonitor(CGKeyCode keycode, CGEventFlags modifier, void* userData, void (*handler)(void*))
+{
+ return [static_cast<id>(self) addGlobalMonitor:NSEventMaskKeyDown handler:^(NSEvent* event) {
+ if (event.keyCode == keycode && (event.modifierFlags & modifier) == modifier) {
+ handler(userData);
+ }
+ }];
+}
+
+void AppKit::removeGlobalMonitor(void* monitor)
+{
+ [static_cast<id>(self) removeGlobalMonitor:static_cast<id>(monitor)];
+}
+
+bool AppKit::enableAccessibility()
+{
+ return [static_cast<id>(self) enableAccessibility];
+}
diff --git a/src/gui/macutils/MacUtils.cpp b/src/gui/macutils/MacUtils.cpp
index 654923c31..653eb0832 100644
--- a/src/gui/macutils/MacUtils.cpp
+++ b/src/gui/macutils/MacUtils.cpp
@@ -75,3 +75,18 @@ bool MacUtils::isDarkMode()
{
return m_appkit->isDarkMode();
}
+
+void* MacUtils::addGlobalMonitor(CGKeyCode keycode, CGEventFlags modifier, void* userData, void (*handler)(void*))
+{
+ return m_appkit->addGlobalMonitor(keycode, modifier, userData, handler);
+}
+
+void MacUtils::removeGlobalMonitor(void* monitor)
+{
+ m_appkit->removeGlobalMonitor(monitor);
+}
+
+bool MacUtils::enableAccessibility()
+{
+ return m_appkit->enableAccessibility();
+}
diff --git a/src/gui/macutils/MacUtils.h b/src/gui/macutils/MacUtils.h
index 49644795e..ced612749 100644
--- a/src/gui/macutils/MacUtils.h
+++ b/src/gui/macutils/MacUtils.h
@@ -38,6 +38,9 @@ public:
bool hideOwnWindow();
bool isHidden();
bool isDarkMode();
+ void* addGlobalMonitor(CGKeyCode keycode, CGEventFlags modifier, void* userData, void (*handler)(void*));
+ void removeGlobalMonitor(void* monitor);
+ bool enableAccessibility();
signals:
void lockDatabases();
diff --git a/src/gui/masterkey/KeyComponentWidget.h b/src/gui/masterkey/KeyComponentWidget.h
index 63079863e..b73f881fc 100644
--- a/src/gui/masterkey/KeyComponentWidget.h
+++ b/src/gui/masterkey/KeyComponentWidget.h
@@ -18,9 +18,9 @@
#ifndef KEEPASSXC_KEYCOMPONENTWIDGET_H
#define KEEPASSXC_KEYCOMPONENTWIDGET_H
+#include <QPointer>
#include <QScopedPointer>
#include <QWidget>
-#include <QPointer>
namespace Ui
{
@@ -111,7 +111,7 @@ signals:
void componentRemovalRequested();
protected:
- void showEvent(QShowEvent* event) override ;
+ void showEvent(QShowEvent* event) override;
private slots:
void updateComponentName(const QString& name);
diff --git a/src/gui/masterkey/KeyFileEditWidget.cpp b/src/gui/masterkey/KeyFileEditWidget.cpp
index ff56f2cb4..e6b5bef49 100644
--- a/src/gui/masterkey/KeyFileEditWidget.cpp
+++ b/src/gui/masterkey/KeyFileEditWidget.cpp
@@ -17,6 +17,7 @@
#include "KeyFileEditWidget.h"
#include "ui_KeyFileEditWidget.h"
+#include <gui/dbsettings/DatabaseSettingsWidget.h>
#include "gui/FileDialog.h"
#include "gui/MainWindow.h"
@@ -24,9 +25,10 @@
#include "keys/CompositeKey.h"
#include "keys/FileKey.h"
-KeyFileEditWidget::KeyFileEditWidget(QWidget* parent)
+KeyFileEditWidget::KeyFileEditWidget(DatabaseSettingsWidget* parent)
: KeyComponentWidget(parent)
, m_compUi(new Ui::KeyFileEditWidget())
+ , m_parent(parent)
{
setComponentName(tr("Key File"));
setComponentDescription(tr("<p>You can add a key file containing random bytes for additional security.</p>"
@@ -120,6 +122,26 @@ void KeyFileEditWidget::browseKeyFile()
QString filters = QString("%1 (*.key);;%2 (*)").arg(tr("Key files"), tr("All files"));
QString fileName = fileDialog()->getOpenFileName(this, tr("Select a key file"), QString(), filters);
+ if (QFileInfo(fileName).canonicalFilePath() == m_parent->getDatabase()->canonicalFilePath()) {
+ MessageBox::critical(getMainWindow(),
+ tr("Invalid Key File"),
+ tr("You cannot use the current database as its own keyfile. Please choose a different "
+ "file or generate a new key file."));
+ return;
+ } else if (fileName.endsWith(".kdbx", Qt::CaseInsensitive)) {
+ auto response =
+ MessageBox::warning(getMainWindow(),
+ tr("Suspicious Key File"),
+ tr("The chosen key file looks like a password database file. A key file must be a "
+ "static file that never changes or you will lose access to your database "
+ "forever.\nAre you sure you want to continue with this file?"),
+ MessageBox::Continue | MessageBox::Cancel,
+ MessageBox::Cancel);
+ if (response != MessageBox::Continue) {
+ return;
+ }
+ }
+
if (!fileName.isEmpty()) {
m_compUi->keyFileCombo->setEditText(fileName);
}
diff --git a/src/gui/masterkey/KeyFileEditWidget.h b/src/gui/masterkey/KeyFileEditWidget.h
index 76cb31fa4..7d5868e88 100644
--- a/src/gui/masterkey/KeyFileEditWidget.h
+++ b/src/gui/masterkey/KeyFileEditWidget.h
@@ -26,12 +26,15 @@ namespace Ui
class KeyFileEditWidget;
}
+class DatabaseSettingsWidget;
+
class KeyFileEditWidget : public KeyComponentWidget
{
Q_OBJECT
+
public:
- explicit KeyFileEditWidget(QWidget* parent = nullptr);
+ explicit KeyFileEditWidget(DatabaseSettingsWidget* parent);
Q_DISABLE_COPY(KeyFileEditWidget);
~KeyFileEditWidget() override;
@@ -49,6 +52,7 @@ private slots:
private:
const QScopedPointer<Ui::KeyFileEditWidget> m_compUi;
QPointer<QWidget> m_compEditWidget;
+ const QPointer<DatabaseSettingsWidget> m_parent;
};
#endif // KEEPASSXC_KEYFILEEDITWIDGET_H
diff --git a/src/gui/masterkey/KeyFileEditWidget.ui b/src/gui/masterkey/KeyFileEditWidget.ui
index a267935b5..088995dc8 100644
--- a/src/gui/masterkey/KeyFileEditWidget.ui
+++ b/src/gui/masterkey/KeyFileEditWidget.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>364</width>
+ <width>370</width>
<height>76</height>
</rect>
</property>
@@ -31,6 +31,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Key file selection</string>
+ </property>
<property name="editable">
<bool>true</bool>
</property>
@@ -38,13 +41,19 @@
</item>
<item row="0" column="1">
<widget class="QPushButton" name="browseKeyFileButton">
+ <property name="accessibleName">
+ <string>Browse for key file</string>
+ </property>
<property name="text">
- <string>Browse</string>
+ <string>Browse...</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="createKeyFileButton">
+ <property name="accessibleName">
+ <string>Generate a new key file</string>
+ </property>
<property name="text">
<string>Generate</string>
</property>
@@ -63,6 +72,21 @@
</property>
</spacer>
</item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <italic>true</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>Note: Do not use a file that may change as that will prevent you from unlocking your database!</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<resources/>
diff --git a/src/gui/masterkey/PasswordEditWidget.cpp b/src/gui/masterkey/PasswordEditWidget.cpp
index de00199bb..b27248d34 100644
--- a/src/gui/masterkey/PasswordEditWidget.cpp
+++ b/src/gui/masterkey/PasswordEditWidget.cpp
@@ -43,8 +43,9 @@ bool PasswordEditWidget::addToCompositeKey(QSharedPointer<CompositeKey> key)
QString pw = m_compUi->enterPasswordEdit->text();
if (!pw.isEmpty()) {
key->addKey(QSharedPointer<PasswordKey>::create(pw));
+ return true;
}
- return true;
+ return false;
}
/**
diff --git a/src/gui/masterkey/PasswordEditWidget.ui b/src/gui/masterkey/PasswordEditWidget.ui
index e435e9901..d0a85eb59 100644
--- a/src/gui/masterkey/PasswordEditWidget.ui
+++ b/src/gui/masterkey/PasswordEditWidget.ui
@@ -34,6 +34,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="PasswordEdit" name="enterPasswordEdit">
+ <property name="accessibleName">
+ <string>Password field</string>
+ </property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@@ -41,6 +44,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordButton">
+ <property name="accessibleName">
+ <string>Toggle password visibility</string>
+ </property>
<property name="checkable">
<bool>true</bool>
</property>
@@ -52,13 +58,20 @@
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="PasswordEdit" name="repeatPasswordEdit">
+ <property name="accessibleName">
+ <string>Repeat password field</string>
+ </property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
- <widget class="QToolButton" name="passwordGeneratorButton"/>
+ <widget class="QToolButton" name="passwordGeneratorButton">
+ <property name="accessibleName">
+ <string>Toggle password generator</string>
+ </property>
+ </widget>
</item>
</layout>
</item>
diff --git a/src/gui/masterkey/YubiKeyEditWidget.ui b/src/gui/masterkey/YubiKeyEditWidget.ui
index 08508739a..fa150084b 100644
--- a/src/gui/masterkey/YubiKeyEditWidget.ui
+++ b/src/gui/masterkey/YubiKeyEditWidget.ui
@@ -30,6 +30,9 @@
</property>
<item row="0" column="1">
<widget class="QPushButton" name="buttonRedetectYubikey">
+ <property name="accessibleName">
+ <string>Refresh hardware tokens</string>
+ </property>
<property name="text">
<string>Refresh</string>
</property>
@@ -43,6 +46,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="accessibleName">
+ <string>Hardware key slot selection</string>
+ </property>
</widget>
</item>
<item row="1" column="0">
diff --git a/src/keeshare/CMakeLists.txt b/src/keeshare/CMakeLists.txt
index d791d3be6..333f273a3 100644
--- a/src/keeshare/CMakeLists.txt
+++ b/src/keeshare/CMakeLists.txt
@@ -12,6 +12,8 @@ if(WITH_XC_KEESHARE)
group/EditGroupPageKeeShare.cpp
KeeShare.cpp
KeeShareSettings.cpp
+ ShareImport.cpp
+ ShareExport.cpp
ShareObserver.cpp
Signature.cpp
)
diff --git a/src/keeshare/KeeShare.cpp b/src/keeshare/KeeShare.cpp
index d1cbde099..3199f355c 100644
--- a/src/keeshare/KeeShare.cpp
+++ b/src/keeshare/KeeShare.cpp
@@ -246,21 +246,38 @@ void KeeShare::connectDatabase(QSharedPointer<Database> newDb, QSharedPointer<Da
}
}
-const QString& KeeShare::signedContainerFileType()
+const QString KeeShare::signedContainerFileType()
{
static const QString filetype("kdbx.share");
return filetype;
}
-const QString& KeeShare::unsignedContainerFileType()
+const QString KeeShare::unsignedContainerFileType()
{
static const QString filetype("kdbx");
return filetype;
}
+bool KeeShare::isContainerType(const QFileInfo& fileInfo, const QString type)
+{
+ return fileInfo.fileName().endsWith(type, Qt::CaseInsensitive);
+}
+
void KeeShare::handleSettingsChanged(const QString& key)
{
if (key == KeeShare_Active) {
emit activeChanged();
}
}
+
+const QString KeeShare::signatureFileName()
+{
+ static const QString fileName("container.share.signature");
+ return fileName;
+}
+
+const QString KeeShare::containerFileName()
+{
+ static const QString fileName("container.share.kdbx");
+ return fileName;
+}
diff --git a/src/keeshare/KeeShare.h b/src/keeshare/KeeShare.h
index 86829ea1c..597ce73a6 100644
--- a/src/keeshare/KeeShare.h
+++ b/src/keeshare/KeeShare.h
@@ -59,9 +59,12 @@ public:
void connectDatabase(QSharedPointer<Database> newDb, QSharedPointer<Database> oldDb);
- static const QString& signedContainerFileType();
- static const QString& unsignedContainerFileType();
+ static const QString signedContainerFileType();
+ static const QString unsignedContainerFileType();
+ static bool isContainerType(const QFileInfo& fileInfo, const QString type);
+ static const QString signatureFileName();
+ static const QString containerFileName();
signals:
void activeChanged();
void sharingMessage(QString, MessageWidget::MessageType);
diff --git a/src/keeshare/SettingsWidgetKeeShare.cpp b/src/keeshare/SettingsWidgetKeeShare.cpp
index c58e6dc90..2ae8b0889 100644
--- a/src/keeshare/SettingsWidgetKeeShare.cpp
+++ b/src/keeshare/SettingsWidgetKeeShare.cpp
@@ -119,6 +119,8 @@ void SettingsWidgetKeeShare::saveSettings()
KeeShare::setOwn(m_own);
KeeShare::setForeign(m_foreign);
KeeShare::setActive(active);
+
+ config()->set("KeeShare/QuietSuccess", m_ui->quietSuccessCheckBox->isChecked());
}
void SettingsWidgetKeeShare::setVerificationExporter(const QString& signer)
@@ -185,7 +187,7 @@ void SettingsWidgetKeeShare::exportCertificate()
const auto filters = QString("%1 (*." + filetype + ");;%2 (*)").arg(tr("KeeShare key file"), tr("All files"));
QString filename = QString("%1.%2").arg(m_own.certificate.signer).arg(filetype);
filename = fileDialog()->getSaveFileName(
- this, tr("Select path"), defaultDirPath, filters, nullptr, QFileDialog::Options(0), filetype, filename);
+ this, tr("Select path"), defaultDirPath, filters, nullptr, QFileDialog::Options(0));
if (filename.isEmpty()) {
return;
}
diff --git a/src/keeshare/SettingsWidgetKeeShare.ui b/src/keeshare/SettingsWidgetKeeShare.ui
index 93bd0fa10..0840c9747 100644
--- a/src/keeshare/SettingsWidgetKeeShare.ui
+++ b/src/keeshare/SettingsWidgetKeeShare.ui
@@ -29,17 +29,39 @@
<string>Active</string>
</property>
<layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="enableImportCheckBox">
+ <property name="toolTip">
+ <string>Allow KeeShare imports</string>
+ </property>
+ <property name="accessibleName">
+ <string>Allow KeeShare imports</string>
+ </property>
+ <property name="text">
+ <string>Allow import</string>
+ </property>
+ </widget>
+ </item>
<item row="3" column="0">
<widget class="QCheckBox" name="enableExportCheckBox">
+ <property name="toolTip">
+ <string>Allow KeeShare exports</string>
+ </property>
+ <property name="accessibleName">
+ <string>Allow KeeShare exports</string>
+ </property>
<property name="text">
<string>Allow export</string>
</property>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="enableImportCheckBox">
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="quietSuccessCheckBox">
<property name="text">
- <string>Allow import</string>
+ <string>Only show warnings and errors</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
</property>
</widget>
</item>
@@ -67,6 +89,9 @@
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificatePrivateKeyEdit">
+ <property name="accessibleName">
+ <string>Key</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
@@ -95,16 +120,26 @@
</item>
<item row="4" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificatePublicKeyEdit">
+ <property name="accessibleName">
+ <string>Certificate</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
- <widget class="QLineEdit" name="ownCertificateSignerEdit"/>
+ <widget class="QLineEdit" name="ownCertificateSignerEdit">
+ <property name="accessibleName">
+ <string>Signer name field</string>
+ </property>
+ </widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificateFingerprintEdit">
+ <property name="accessibleName">
+ <string>Fingerprint</string>
+ </property>
<property name="readOnly">
<bool>true</bool>
</property>
@@ -127,6 +162,9 @@
</item>
<item>
<widget class="QPushButton" name="generateOwnCerticateButton">
+ <property name="accessibleName">
+ <string>Generate new certificate</string>
+ </property>
<property name="text">
<string>Generate</string>
</property>
@@ -134,6 +172,9 @@
</item>
<item>
<widget class="QPushButton" name="importOwnCertificateButton">
+ <property name="accessibleName">
+ <string>Import existing certificate</string>
+ </property>
<property name="text">
<string>Import</string>
</property>
@@ -141,6 +182,9 @@
</item>
<item>
<widget class="QPushButton" name="exportOwnCertificateButton">
+ <property name="accessibleName">
+ <string>Export own certificate</string>
+ </property>
<property name="text">
<string>Export</string>
</property>
@@ -159,6 +203,9 @@
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0" rowspan="2">
<widget class="QTableView" name="importedCertificateTableView">
+ <property name="accessibleName">
+ <string>Known shares</string>
+ </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@@ -205,6 +252,9 @@
</item>
<item>
<widget class="QPushButton" name="trustImportedCertificateButton">
+ <property name="accessibleName">
+ <string>Trust selected certificate</string>
+ </property>
<property name="text">
<string>Trust</string>
</property>
@@ -212,6 +262,9 @@
</item>
<item>
<widget class="QPushButton" name="askImportedCertificateButton">
+ <property name="accessibleName">
+ <string>Ask whether to trust the selected certificate every time</string>
+ </property>
<property name="text">
<string>Ask</string>
</property>
@@ -219,6 +272,9 @@
</item>
<item>
<widget class="QPushButton" name="untrustImportedCertificateButton">
+ <property name="accessibleName">
+ <string>Untrust selected certificate</string>
+ </property>
<property name="text">
<string>Untrust</string>
</property>
@@ -226,6 +282,9 @@
</item>
<item>
<widget class="QPushButton" name="removeImportedCertificateButton">
+ <property name="accessibleName">
+ <string>Remove selected certificate</string>
+ </property>
<property name="text">
<string>Remove</string>
</property>
diff --git a/src/keeshare/ShareExport.cpp b/src/keeshare/ShareExport.cpp
new file mode 100644
index 000000000..c17c5052c
--- /dev/null
+++ b/src/keeshare/ShareExport.cpp
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "ShareExport.h"
+#include "config-keepassx.h"
+#include "core/Group.h"
+#include "core/Metadata.h"
+#include "format/KeePass2Writer.h"
+#include "keeshare/KeeShare.h"
+#include "keeshare/Signature.h"
+#include "keys/PasswordKey.h"
+
+#if defined(WITH_XC_KEESHARE_SECURE)
+#include <quazip.h>
+#include <quazipfile.h>
+#endif
+
+namespace
+{
+ void resolveReferenceAttributes(Entry* targetEntry, const Database* sourceDb)
+ {
+ for (const auto& attribute : EntryAttributes::DefaultAttributes) {
+ const auto standardValue = targetEntry->attributes()->value(attribute);
+ const auto type = targetEntry->placeholderType(standardValue);
+ if (type != Entry::PlaceholderType::Reference) {
+ // No reference to resolve
+ continue;
+ }
+ const auto* referencedTargetEntry = targetEntry->resolveReference(standardValue);
+ if (referencedTargetEntry) {
+ // References is within scope, no resolving needed
+ continue;
+ }
+ // We could do more sophisticated **** trying to point the reference to the next in-scope reference
+ // but those cases with high propability constructed examples and very rare in real usage
+ const auto* sourceReference = sourceDb->rootGroup()->findEntryByUuid(targetEntry->uuid());
+ const auto resolvedValue = sourceReference->resolveMultiplePlaceholders(standardValue);
+ targetEntry->setUpdateTimeinfo(false);
+ targetEntry->attributes()->set(attribute, resolvedValue, targetEntry->attributes()->isProtected(attribute));
+ targetEntry->setUpdateTimeinfo(true);
+ }
+ }
+
+ Database* extractIntoDatabase(const KeeShareSettings::Reference& reference, const Group* sourceRoot)
+ {
+ const auto* sourceDb = sourceRoot->database();
+ auto* targetDb = new Database();
+ auto* targetMetadata = targetDb->metadata();
+ targetMetadata->setRecycleBinEnabled(false);
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create(reference.password));
+
+ // Copy the source root as the root of the export database, memory manage the old root node
+ auto* targetRoot = sourceRoot->clone(Entry::CloneNoFlags, Group::CloneNoFlags);
+ const bool updateTimeinfo = targetRoot->canUpdateTimeinfo();
+ targetRoot->setUpdateTimeinfo(false);
+ KeeShare::setReferenceTo(targetRoot, KeeShareSettings::Reference());
+ targetRoot->setUpdateTimeinfo(updateTimeinfo);
+ const auto sourceEntries = sourceRoot->entriesRecursive(false);
+ for (const Entry* sourceEntry : sourceEntries) {
+ auto* targetEntry = sourceEntry->clone(Entry::CloneIncludeHistory);
+ const bool updateTimeinfo = targetEntry->canUpdateTimeinfo();
+ targetEntry->setUpdateTimeinfo(false);
+ targetEntry->setGroup(targetRoot);
+ targetEntry->setUpdateTimeinfo(updateTimeinfo);
+ const auto iconUuid = targetEntry->iconUuid();
+ if (!iconUuid.isNull() && !targetMetadata->containsCustomIcon(iconUuid)) {
+ targetMetadata->addCustomIcon(iconUuid, sourceEntry->icon());
+ }
+ }
+
+ targetDb->setKey(key);
+ auto* obsoleteRoot = targetDb->rootGroup();
+ targetDb->setRootGroup(targetRoot);
+ delete obsoleteRoot;
+
+ targetDb->metadata()->setName(sourceRoot->name());
+
+ // Push all deletions of the source database to the target
+ // simple moving out of a share group will not trigger a deletion in the
+ // target - a more elaborate mechanism may need the use of another custom
+ // attribute to share unshared entries from the target db
+ for (const auto& object : sourceDb->deletedObjects()) {
+ targetDb->addDeletedObject(object);
+ }
+ for (auto* targetEntry : targetRoot->entriesRecursive(false)) {
+ if (targetEntry->hasReferences()) {
+ resolveReferenceAttributes(targetEntry, sourceDb);
+ }
+ }
+ return targetDb;
+ }
+
+ ShareObserver::Result
+ intoSignedContainer(const QString& resolvedPath, const KeeShareSettings::Reference& reference, Database* targetDb)
+ {
+#if !defined(WITH_XC_KEESHARE_SECURE)
+ Q_UNUSED(targetDb);
+ Q_UNUSED(resolvedPath);
+ return {reference.path,
+ ShareObserver::Result::Warning,
+ ShareExport::tr("Overwriting signed share container is not supported - export prevented")};
+#else
+ QByteArray bytes;
+ {
+ QBuffer buffer(&bytes);
+ buffer.open(QIODevice::WriteOnly);
+ KeePass2Writer writer;
+ writer.writeDatabase(&buffer, targetDb);
+ if (writer.hasError()) {
+ qWarning("Serializing export dabase failed: %s.", writer.errorString().toLatin1().data());
+ return {reference.path, ShareObserver::Result::Error, writer.errorString()};
+ }
+ }
+ const auto own = KeeShare::own();
+ QuaZip zip(resolvedPath);
+ zip.setFileNameCodec("UTF-8");
+ const bool zipOpened = zip.open(QuaZip::mdCreate);
+ if (!zipOpened) {
+ ::qWarning("Opening export file failed: %d", zip.getZipError());
+ return {reference.path,
+ ShareObserver::Result::Error,
+ ShareExport::tr("Could not write export container (%1)").arg(zip.getZipError())};
+ }
+ {
+ QuaZipFile file(&zip);
+ const auto signatureOpened = file.open(QIODevice::WriteOnly, QuaZipNewInfo(KeeShare::signatureFileName()));
+ if (!signatureOpened) {
+ ::qWarning("Embedding signature failed: Could not open file to write (%d)", zip.getZipError());
+ return {reference.path,
+ ShareObserver::Result::Error,
+ ShareExport::tr("Could not embed signature: Could not open file to write (%1)")
+ .arg(file.getZipError())};
+ }
+ QTextStream stream(&file);
+ KeeShareSettings::Sign sign;
+ auto sshKey = own.key.sshKey();
+ sshKey.openKey(QString());
+ sign.signature = Signature::create(bytes, sshKey);
+ sign.certificate = own.certificate;
+ stream << KeeShareSettings::Sign::serialize(sign);
+ stream.flush();
+ if (file.getZipError() != ZIP_OK) {
+ ::qWarning("Embedding signature failed: Could not write file (%d)", zip.getZipError());
+ return {
+ reference.path,
+ ShareObserver::Result::Error,
+ ShareExport::tr("Could not embed signature: Could not write file (%1)").arg(file.getZipError())};
+ }
+ file.close();
+ }
+ {
+ QuaZipFile file(&zip);
+ const auto dbOpened = file.open(QIODevice::WriteOnly, QuaZipNewInfo(KeeShare::containerFileName()));
+ if (!dbOpened) {
+ ::qWarning("Embedding database failed: Could not open file to write (%d)", zip.getZipError());
+ return {reference.path,
+ ShareObserver::Result::Error,
+ ShareExport::tr("Could not embed database: Could not open file to write (%1)")
+ .arg(file.getZipError())};
+ }
+ file.write(bytes);
+ if (file.getZipError() != ZIP_OK) {
+ ::qWarning("Embedding database failed: Could not write file (%d)", zip.getZipError());
+ return {reference.path,
+ ShareObserver::Result::Error,
+ ShareExport::tr("Could not embed database: Could not write file (%1)").arg(file.getZipError())};
+ }
+ file.close();
+ }
+ zip.close();
+ return {reference.path};
+#endif
+ }
+
+ ShareObserver::Result
+ intoUnsignedContainer(const QString& resolvedPath, const KeeShareSettings::Reference& reference, Database* targetDb)
+ {
+#if !defined(WITH_XC_KEESHARE_INSECURE)
+ Q_UNUSED(targetDb);
+ Q_UNUSED(resolvedPath);
+ return {reference.path,
+ ShareObserver::Result::Warning,
+ ShareExport::tr("Overwriting unsigned share container is not supported - export prevented")};
+#else
+ QFile file(resolvedPath);
+ const bool fileOpened = file.open(QIODevice::WriteOnly);
+ if (!fileOpened) {
+ ::qWarning("Opening export file failed");
+ return {reference.path, ShareObserver::Result::Error, ShareExport::tr("Could not write export container")};
+ }
+ KeePass2Writer writer;
+ writer.writeDatabase(&file, targetDb);
+ if (writer.hasError()) {
+ qWarning("Exporting dabase failed: %s.", writer.errorString().toLatin1().data());
+ return {reference.path, ShareObserver::Result::Error, writer.errorString()};
+ }
+ file.close();
+#endif
+ return {reference.path};
+ }
+
+} // namespace
+
+ShareObserver::Result ShareExport::intoContainer(const QString& resolvedPath,
+ const KeeShareSettings::Reference& reference,
+ const Group* group)
+{
+ QScopedPointer<Database> targetDb(extractIntoDatabase(reference, group));
+ const QFileInfo info(resolvedPath);
+ if (KeeShare::isContainerType(info, KeeShare::signedContainerFileType())) {
+ return intoSignedContainer(resolvedPath, reference, targetDb.data());
+ }
+ if (KeeShare::isContainerType(info, KeeShare::unsignedContainerFileType())) {
+ return intoUnsignedContainer(resolvedPath, reference, targetDb.data());
+ }
+ Q_ASSERT(false);
+ return {reference.path, ShareObserver::Result::Error, tr("Unexpected export error occurred")};
+}
diff --git a/src/keeshare/ShareExport.h b/src/keeshare/ShareExport.h
new file mode 100644
index 000000000..ff2abdc81
--- /dev/null
+++ b/src/keeshare/ShareExport.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_SHAREEXPORT_H
+#define KEEPASSXC_SHAREEXPORT_H
+
+#include "keeshare/KeeShareSettings.h"
+#include "keeshare/ShareObserver.h"
+
+class Database;
+
+class ShareExport
+{
+ Q_DECLARE_TR_FUNCTIONS(ShareExport)
+public:
+ static ShareObserver::Result
+ intoContainer(const QString& resolvedPath, const KeeShareSettings::Reference& reference, const Group* group);
+
+private:
+ ShareExport() = delete;
+};
+
+#endif // KEEPASSXC_SHAREEXPORT_H
diff --git a/src/keeshare/ShareImport.cpp b/src/keeshare/ShareImport.cpp
new file mode 100644
index 000000000..9b05465f9
--- /dev/null
+++ b/src/keeshare/ShareImport.cpp
@@ -0,0 +1,351 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "ShareImport.h"
+#include "config-keepassx.h"
+#include "core/Merger.h"
+#include "format/KeePass2Reader.h"
+#include "keeshare/KeeShare.h"
+#include "keeshare/Signature.h"
+#include "keys/PasswordKey.h"
+
+#include <QMessageBox>
+#include <QPushButton>
+
+#if defined(WITH_XC_KEESHARE_SECURE)
+#include <quazip.h>
+#include <quazipfile.h>
+#endif
+
+namespace
+{
+ enum Trust
+ {
+ Invalid,
+ Own,
+ UntrustedForever,
+ UntrustedOnce,
+ TrustedOnce,
+ TrustedForever,
+ };
+
+ QPair<Trust, KeeShareSettings::Certificate>
+ check(QByteArray& data,
+ const KeeShareSettings::Reference& reference,
+ const KeeShareSettings::Certificate& ownCertificate,
+ const QList<KeeShareSettings::ScopedCertificate>& knownCertificates,
+ const KeeShareSettings::Sign& sign)
+ {
+ KeeShareSettings::Certificate certificate;
+ if (!sign.signature.isEmpty()) {
+ certificate = sign.certificate;
+ auto key = sign.certificate.sshKey();
+ key.openKey(QString());
+ const auto signer = Signature();
+ if (!signer.verify(data, sign.signature, key)) {
+ qCritical("Invalid signature for shared container %s.", qPrintable(reference.path));
+ return {Invalid, KeeShareSettings::Certificate()};
+ }
+
+ if (ownCertificate.key == sign.certificate.key) {
+ return {Own, ownCertificate};
+ }
+ }
+ enum Scope
+ {
+ Invalid,
+ Global,
+ Local
+ };
+ Scope scope = Invalid;
+ KeeShareSettings::Trust trusted = KeeShareSettings::Trust::Ask;
+ for (const auto& scopedCertificate : knownCertificates) {
+ if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) {
+ // Global scope is overwritten by local scope
+ scope = Global;
+ trusted = scopedCertificate.trust;
+ }
+ if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) {
+ scope = Local;
+ trusted = scopedCertificate.trust;
+ break;
+ }
+ }
+ if (scope != Invalid && trusted != KeeShareSettings::Trust::Ask) {
+ // we introduce now scopes if there is a global
+ return {trusted == KeeShareSettings::Trust::Trusted ? TrustedForever : UntrustedForever, certificate};
+ }
+
+ QMessageBox warning;
+ if (sign.signature.isEmpty()) {
+ warning.setIcon(QMessageBox::Warning);
+ warning.setWindowTitle(ShareImport::tr("Import from container without signature"));
+ warning.setText(ShareImport::tr("We cannot verify the source of the shared container because it is not "
+ "signed. Do you really want to import from %1?")
+ .arg(reference.path));
+ } else {
+ warning.setIcon(QMessageBox::Question);
+ warning.setWindowTitle(ShareImport::tr("Import from container with certificate"));
+ warning.setText(ShareImport::tr("Do you want to trust %1 with the fingerprint of %2 from %3?")
+ .arg(certificate.signer, certificate.fingerprint(), reference.path));
+ }
+ auto untrustedOnce = warning.addButton(ShareImport::tr("Not this time"), QMessageBox::ButtonRole::NoRole);
+ auto untrustedForever = warning.addButton(ShareImport::tr("Never"), QMessageBox::ButtonRole::NoRole);
+ auto trustedForever = warning.addButton(ShareImport::tr("Always"), QMessageBox::ButtonRole::YesRole);
+ auto trustedOnce = warning.addButton(ShareImport::tr("Just this time"), QMessageBox::ButtonRole::YesRole);
+ warning.setDefaultButton(untrustedOnce);
+ warning.exec();
+ if (warning.clickedButton() == trustedForever) {
+ return {TrustedForever, certificate};
+ }
+ if (warning.clickedButton() == trustedOnce) {
+ return {TrustedOnce, certificate};
+ }
+ if (warning.clickedButton() == untrustedOnce) {
+ return {UntrustedOnce, certificate};
+ }
+ if (warning.clickedButton() == untrustedForever) {
+ return {UntrustedForever, certificate};
+ }
+ return {UntrustedOnce, certificate};
+ }
+
+ ShareObserver::Result
+ signedContainerInto(const QString& resolvedPath, const KeeShareSettings::Reference& reference, Group* targetGroup)
+ {
+#if !defined(WITH_XC_KEESHARE_SECURE)
+ Q_UNUSED(targetGroup);
+ Q_UNUSED(resolvedPath);
+ return {reference.path,
+ ShareObserver::Result::Warning,
+ ShareImport::tr("Signed share container are not supported - import prevented")};
+#else
+ QuaZip zip(resolvedPath);
+ if (!zip.open(QuaZip::mdUnzip)) {
+ qCritical("Unable to open file %s.", qPrintable(reference.path));
+ return {reference.path, ShareObserver::Result::Error, ShareImport::tr("File is not readable")};
+ }
+ const auto expected = QSet<QString>() << KeeShare::signatureFileName() << KeeShare::containerFileName();
+ const auto files = zip.getFileInfoList();
+ QSet<QString> actual;
+ for (const auto& file : files) {
+ actual << file.name;
+ }
+ if (expected != actual) {
+ qCritical("Invalid sharing container %s.", qPrintable(reference.path));
+ return {reference.path, ShareObserver::Result::Error, ShareImport::tr("Invalid sharing container")};
+ }
+
+ zip.setCurrentFile(KeeShare::signatureFileName());
+ QuaZipFile signatureFile(&zip);
+ signatureFile.open(QuaZipFile::ReadOnly);
+ QTextStream stream(&signatureFile);
+
+ const auto sign = KeeShareSettings::Sign::deserialize(stream.readAll());
+ signatureFile.close();
+
+ zip.setCurrentFile(KeeShare::containerFileName());
+ QuaZipFile databaseFile(&zip);
+ databaseFile.open(QuaZipFile::ReadOnly);
+ auto payload = databaseFile.readAll();
+ databaseFile.close();
+ QBuffer buffer(&payload);
+ buffer.open(QIODevice::ReadOnly);
+
+ KeePass2Reader reader;
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create(reference.password));
+ auto sourceDb = QSharedPointer<Database>::create();
+ if (!reader.readDatabase(&buffer, key, sourceDb.data())) {
+ qCritical("Error while parsing the database: %s", qPrintable(reader.errorString()));
+ return {reference.path, ShareObserver::Result::Error, reader.errorString()};
+ }
+
+ auto foreign = KeeShare::foreign();
+ auto own = KeeShare::own();
+ auto trust = check(payload, reference, own.certificate, foreign.certificates, sign);
+ switch (trust.first) {
+ case Invalid:
+ qWarning("Prevent untrusted import");
+ return {reference.path, ShareObserver::Result::Error, ShareImport::tr("Untrusted import prevented")};
+
+ case UntrustedForever:
+ case TrustedForever: {
+ bool found = false;
+ const auto trusted =
+ trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted;
+ for (KeeShareSettings::ScopedCertificate& scopedCertificate : foreign.certificates) {
+ if (scopedCertificate.certificate.key == trust.second.key && scopedCertificate.path == reference.path) {
+ scopedCertificate.certificate.signer = trust.second.signer;
+ scopedCertificate.path = reference.path;
+ scopedCertificate.trust = trusted;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ foreign.certificates << KeeShareSettings::ScopedCertificate{reference.path, trust.second, trusted};
+ }
+ // update foreign certificates with new settings
+ KeeShare::setForeign(foreign);
+
+ if (trust.first == TrustedForever) {
+ qDebug("Synchronize %s %s with %s",
+ qPrintable(reference.path),
+ qPrintable(targetGroup->name()),
+ qPrintable(sourceDb->rootGroup()->name()));
+ Merger merger(sourceDb->rootGroup(), targetGroup);
+ merger.setForcedMergeMode(Group::Synchronize);
+ auto changelist = merger.merge();
+ if (!changelist.isEmpty()) {
+ return {
+ reference.path, ShareObserver::Result::Success, ShareImport::tr("Successful signed import")};
+ }
+ }
+ // Silent ignore of untrusted import or unchanging import
+ return {};
+ }
+ case TrustedOnce:
+ case Own: {
+ qDebug("Synchronize %s %s with %s",
+ qPrintable(reference.path),
+ qPrintable(targetGroup->name()),
+ qPrintable(sourceDb->rootGroup()->name()));
+ Merger merger(sourceDb->rootGroup(), targetGroup);
+ merger.setForcedMergeMode(Group::Synchronize);
+ auto changelist = merger.merge();
+ if (!changelist.isEmpty()) {
+ return {reference.path, ShareObserver::Result::Success, ShareImport::tr("Successful signed import")};
+ }
+ return {};
+ }
+ default:
+ Q_ASSERT(false);
+ return {reference.path, ShareObserver::Result::Error, ShareImport::tr("Unexpected error")};
+ }
+#endif
+ }
+
+ ShareObserver::Result
+ unsignedContainerInto(const QString& resolvedPath, const KeeShareSettings::Reference& reference, Group* targetGroup)
+ {
+#if !defined(WITH_XC_KEESHARE_INSECURE)
+ Q_UNUSED(targetGroup);
+ Q_UNUSED(resolvedPath);
+ return {reference.path,
+ ShareObserver::Result::Warning,
+ ShareImport::tr("Unsigned share container are not supported - import prevented")};
+#else
+ QFile file(resolvedPath);
+ if (!file.open(QIODevice::ReadOnly)) {
+ qCritical("Unable to open file %s.", qPrintable(reference.path));
+ return {reference.path, ShareObserver::Result::Error, ShareImport::tr("File is not readable")};
+ }
+ auto payload = file.readAll();
+ file.close();
+ QBuffer buffer(&payload);
+ buffer.open(QIODevice::ReadOnly);
+
+ KeePass2Reader reader;
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create(reference.password));
+ auto sourceDb = QSharedPointer<Database>::create();
+ if (!reader.readDatabase(&buffer, key, sourceDb.data())) {
+ qCritical("Error while parsing the database: %s", qPrintable(reader.errorString()));
+ return {reference.path, ShareObserver::Result::Error, reader.errorString()};
+ }
+
+ auto foreign = KeeShare::foreign();
+ const auto own = KeeShare::own();
+ const auto sign = KeeShareSettings::Sign(); // invalid sign
+ auto trust = check(payload, reference, own.certificate, foreign.certificates, sign);
+ switch (trust.first) {
+ case UntrustedForever:
+ case TrustedForever: {
+ bool found = false;
+ const auto trusted =
+ trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted;
+ for (KeeShareSettings::ScopedCertificate& scopedCertificate : foreign.certificates) {
+ if (scopedCertificate.certificate.key == trust.second.key && scopedCertificate.path == reference.path) {
+ scopedCertificate.certificate.signer = trust.second.signer;
+ scopedCertificate.path = reference.path;
+ scopedCertificate.trust = trusted;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ foreign.certificates << KeeShareSettings::ScopedCertificate{reference.path, trust.second, trusted};
+ }
+ // update foreign certificates with new settings
+ KeeShare::setForeign(foreign);
+
+ if (trust.first == TrustedForever) {
+ qDebug("Synchronize %s %s with %s",
+ qPrintable(reference.path),
+ qPrintable(targetGroup->name()),
+ qPrintable(sourceDb->rootGroup()->name()));
+ Merger merger(sourceDb->rootGroup(), targetGroup);
+ merger.setForcedMergeMode(Group::Synchronize);
+ auto changelist = merger.merge();
+ if (!changelist.isEmpty()) {
+ return {
+ reference.path, ShareObserver::Result::Success, ShareImport::tr("Successful signed import")};
+ }
+ }
+ return {};
+ }
+
+ case TrustedOnce: {
+ qDebug("Synchronize %s %s with %s",
+ qPrintable(reference.path),
+ qPrintable(targetGroup->name()),
+ qPrintable(sourceDb->rootGroup()->name()));
+ Merger merger(sourceDb->rootGroup(), targetGroup);
+ merger.setForcedMergeMode(Group::Synchronize);
+ auto changelist = merger.merge();
+ if (!changelist.isEmpty()) {
+ return {reference.path, ShareObserver::Result::Success, ShareImport::tr("Successful unsigned import")};
+ }
+ return {};
+ }
+ default:
+ qWarning("Prevent untrusted import");
+ return {reference.path, ShareObserver::Result::Warning, ShareImport::tr("Untrusted import prevented")};
+ }
+#endif
+ }
+
+} // namespace
+
+ShareObserver::Result ShareImport::containerInto(const QString& resolvedPath,
+ const KeeShareSettings::Reference& reference,
+ Group* targetGroup)
+{
+ const QFileInfo info(resolvedPath);
+ if (!info.exists()) {
+ qCritical("File %s does not exist.", qPrintable(info.absoluteFilePath()));
+ return {reference.path, ShareObserver::Result::Warning, tr("File does not exist")};
+ }
+
+ if (KeeShare::isContainerType(info, KeeShare::signedContainerFileType())) {
+ return signedContainerInto(resolvedPath, reference, targetGroup);
+ }
+ if (KeeShare::isContainerType(info, KeeShare::unsignedContainerFileType())) {
+ return unsignedContainerInto(resolvedPath, reference, targetGroup);
+ }
+ return {reference.path, ShareObserver::Result::Error, tr("Unknown share container type")};
+}
diff --git a/src/keeshare/ShareImport.h b/src/keeshare/ShareImport.h
new file mode 100644
index 000000000..96cb67c69
--- /dev/null
+++ b/src/keeshare/ShareImport.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_SHAREIMPORT_H
+#define KEEPASSXC_SHAREIMPORT_H
+
+#include "keeshare/ShareObserver.h"
+
+class ShareImport
+{
+ Q_DECLARE_TR_FUNCTIONS(ShareImport)
+public:
+ static ShareObserver::Result
+ containerInto(const QString& resolvedPath, const KeeShareSettings::Reference& reference, Group* targetGroup);
+
+public:
+ ShareImport() = delete;
+};
+
+#endif // KEEPASSXC_SHAREIMPORT_H
diff --git a/src/keeshare/ShareObserver.cpp b/src/keeshare/ShareObserver.cpp
index 644f1c157..80033bf3a 100644
--- a/src/keeshare/ShareObserver.cpp
+++ b/src/keeshare/ShareObserver.cpp
@@ -16,141 +16,22 @@
*/
#include "ShareObserver.h"
-#include "config-keepassx.h"
-#include "core/Clock.h"
#include "core/Config.h"
-#include "core/CustomData.h"
#include "core/Database.h"
-#include "core/DatabaseIcons.h"
-#include "core/Entry.h"
-#include "core/FilePath.h"
#include "core/FileWatcher.h"
#include "core/Global.h"
#include "core/Group.h"
-#include "core/Merger.h"
-#include "core/Metadata.h"
-#include "format/KeePass2Reader.h"
-#include "format/KeePass2Writer.h"
#include "keeshare/KeeShare.h"
-#include "keeshare/KeeShareSettings.h"
-#include "keeshare/Signature.h"
-#include "keys/PasswordKey.h"
-
-#include <QBuffer>
-#include <QDebug>
-#include <QFileInfo>
-#include <QIcon>
-#include <QMessageBox>
-#include <QPainter>
-#include <QPushButton>
-#include <QStringBuilder>
-
-#if defined(WITH_XC_KEESHARE_SECURE)
-#include <quazip.h>
-#include <quazipfile.h>
-#endif
+#include "keeshare/ShareExport.h"
+#include "keeshare/ShareImport.h"
namespace
{
- static const QString KeeShare_Signature("container.share.signature");
- static const QString KeeShare_Container("container.share.kdbx");
-
- enum Trust
- {
- Invalid,
- Own,
- UntrustedForever,
- UntrustedOnce,
- TrustedOnce,
- TrustedForever,
- };
-
- bool isOfExportType(const QFileInfo& fileInfo, const QString type)
+ QString resolvePath(const QString& path, QSharedPointer<Database> database)
{
- return fileInfo.fileName().endsWith(type, Qt::CaseInsensitive);
- }
-
- QPair<Trust, KeeShareSettings::Certificate>
- check(QByteArray& data,
- const KeeShareSettings::Reference& reference,
- const KeeShareSettings::Certificate& ownCertificate,
- const QList<KeeShareSettings::ScopedCertificate>& knownCertificates,
- const KeeShareSettings::Sign& sign)
- {
- KeeShareSettings::Certificate certificate;
- if (!sign.signature.isEmpty()) {
- certificate = sign.certificate;
- auto key = sign.certificate.sshKey();
- key.openKey(QString());
- const auto signer = Signature();
- if (!signer.verify(data, sign.signature, key)) {
- qCritical("Invalid signature for shared container %s.", qPrintable(reference.path));
- return {Invalid, KeeShareSettings::Certificate()};
- }
-
- if (ownCertificate.key == sign.certificate.key) {
- return {Own, ownCertificate};
- }
- }
- enum Scope
- {
- Invalid,
- Global,
- Local
- };
- Scope scope = Invalid;
- KeeShareSettings::Trust trusted = KeeShareSettings::Trust::Ask;
- for (const auto& scopedCertificate : knownCertificates) {
- if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) {
- // Global scope is overwritten by local scope
- scope = Global;
- trusted = scopedCertificate.trust;
- }
- if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) {
- scope = Local;
- trusted = scopedCertificate.trust;
- break;
- }
- }
- if (scope != Invalid && trusted != KeeShareSettings::Trust::Ask) {
- // we introduce now scopes if there is a global
- return {trusted == KeeShareSettings::Trust::Trusted ? TrustedForever : UntrustedForever, certificate};
- }
-
- QMessageBox warning;
- if (sign.signature.isEmpty()) {
- warning.setIcon(QMessageBox::Warning);
- warning.setWindowTitle(ShareObserver::tr("Import from container without signature"));
- warning.setText(ShareObserver::tr("We cannot verify the source of the shared container because it is not "
- "signed. Do you really want to import from %1?")
- .arg(reference.path));
- } else {
- warning.setIcon(QMessageBox::Question);
- warning.setWindowTitle(ShareObserver::tr("Import from container with certificate"));
- warning.setText(ShareObserver::tr("Do you want to trust %1 with the fingerprint of %2 from %3?")
- .arg(certificate.signer, certificate.fingerprint(), reference.path));
- }
- auto untrustedOnce = warning.addButton(ShareObserver::tr("Not this time"), QMessageBox::ButtonRole::NoRole);
- auto untrustedForever = warning.addButton(ShareObserver::tr("Never"), QMessageBox::ButtonRole::NoRole);
- auto trustedForever = warning.addButton(ShareObserver::tr("Always"), QMessageBox::ButtonRole::YesRole);
- auto trustedOnce = warning.addButton(ShareObserver::tr("Just this time"), QMessageBox::ButtonRole::YesRole);
- warning.setDefaultButton(untrustedOnce);
- warning.exec();
- if (warning.clickedButton() == trustedForever) {
- return {TrustedForever, certificate};
- }
- if (warning.clickedButton() == trustedOnce) {
- return {TrustedOnce, certificate};
- }
- if (warning.clickedButton() == untrustedOnce) {
- return {UntrustedOnce, certificate};
- }
- if (warning.clickedButton() == untrustedForever) {
- return {UntrustedForever, certificate};
- }
- return {UntrustedOnce, certificate};
+ const QFileInfo info(database->filePath());
+ return info.absoluteDir().absoluteFilePath(path);
}
-
} // End Namespace
ShareObserver::ShareObserver(QSharedPointer<Database> db, QObject* parent)
@@ -160,6 +41,10 @@ ShareObserver::ShareObserver(QSharedPointer<Database> db, QObject* parent)
{
connect(KeeShare::instance(), SIGNAL(activeChanged()), SLOT(handleDatabaseChanged()));
+ connect(m_db.data(), SIGNAL(groupDataChanged(Group*)), SLOT(handleDatabaseChanged()));
+ connect(m_db.data(), SIGNAL(groupAdded()), SLOT(handleDatabaseChanged()));
+ connect(m_db.data(), SIGNAL(groupRemoved()), SLOT(handleDatabaseChanged()));
+
connect(m_db.data(), SIGNAL(databaseModified()), SLOT(handleDatabaseChanged()));
connect(m_db.data(), SIGNAL(databaseSaved()), SLOT(handleDatabaseSaved()));
@@ -193,18 +78,20 @@ void ShareObserver::reinitialize()
QList<Update> updated;
const QList<Group*> groups = m_db->rootGroup()->groupsRecursive(true);
for (Group* group : groups) {
- Update couple{group, m_groupToReference.value(group), KeeShare::referenceOf(group)};
+ const Update couple{group, m_groupToReference.value(group), KeeShare::referenceOf(group)};
if (couple.oldReference == couple.newReference) {
continue;
}
m_groupToReference.remove(couple.group);
m_referenceToGroup.remove(couple.oldReference);
- m_shareToGroup.remove(couple.oldReference.path);
+ const auto oldResolvedPath = resolvePath(couple.oldReference.path, m_db);
+ m_shareToGroup.remove(oldResolvedPath);
if (couple.newReference.isValid()) {
m_groupToReference[couple.group] = couple.newReference;
m_referenceToGroup[couple.newReference] = couple.group;
- m_shareToGroup[couple.newReference.path] = couple.group;
+ const auto newResolvedPath = resolvePath(couple.newReference.path, m_db);
+ m_shareToGroup[newResolvedPath] = couple.group;
}
updated << couple;
}
@@ -216,19 +103,23 @@ void ShareObserver::reinitialize()
QMap<QString, QStringList> exported;
for (const auto& update : asConst(updated)) {
if (!update.oldReference.path.isEmpty()) {
- m_fileWatcher->removePath(update.oldReference.path);
+ const auto oldResolvedPath = resolvePath(update.oldReference.path, m_db);
+ m_fileWatcher->removePath(oldResolvedPath);
}
if (!update.newReference.path.isEmpty() && update.newReference.type != KeeShareSettings::Inactive) {
- m_fileWatcher->addPath(update.newReference.path);
+ const auto newResolvedPath = resolvePath(update.newReference.path, m_db);
+ m_fileWatcher->addPath(newResolvedPath);
}
if (update.newReference.isExporting()) {
exported[update.newReference.path] << update.group->name();
+ // export is only on save
}
if (update.newReference.isImporting()) {
imported[update.newReference.path] << update.group->name();
- const auto result = this->importFromReferenceContainer(update.newReference.path);
+ // import has to occur immediately
+ const auto result = this->importShare(update.newReference.path);
if (!result.isValid()) {
// tolerable result - blocked import or missing source
continue;
@@ -261,18 +152,22 @@ void ShareObserver::reinitialize()
void ShareObserver::notifyAbout(const QStringList& success, const QStringList& warning, const QStringList& error)
{
- if (error.isEmpty() && warning.isEmpty() && success.isEmpty()) {
- return;
- }
-
+ QStringList messages;
MessageWidget::MessageType type = MessageWidget::Positive;
+ if (!(success.isEmpty() || config()->get("KeeShare/QuietSuccess", true).toBool())) {
+ messages += success;
+ }
if (!warning.isEmpty()) {
type = MessageWidget::Warning;
+ messages += warning;
}
if (!error.isEmpty()) {
type = MessageWidget::Error;
+ messages += error;
+ }
+ if (!messages.isEmpty()) {
+ emit sharingMessage(messages.join("\n"), type);
}
- emit sharingMessage((success + warning + error).join("\n"), type);
}
void ShareObserver::handleDatabaseChanged()
@@ -303,7 +198,7 @@ void ShareObserver::handleFileDeleted(const QString& path)
void ShareObserver::handleFileUpdated(const QString& path)
{
- const Result result = this->importFromReferenceContainer(path);
+ const Result result = this->importShare(path);
if (!result.isValid()) {
return;
}
@@ -322,231 +217,15 @@ void ShareObserver::handleFileUpdated(const QString& path)
notifyAbout(success, warning, error);
}
-ShareObserver::Result ShareObserver::importSingedContainerInto(const KeeShareSettings::Reference& reference,
- Group* targetGroup)
-{
-#if !defined(WITH_XC_KEESHARE_SECURE)
- Q_UNUSED(targetGroup);
- return {reference.path, Result::Warning, tr("Signed share container are not supported - import prevented")};
-#else
- QuaZip zip(reference.path);
- if (!zip.open(QuaZip::mdUnzip)) {
- qCritical("Unable to open file %s.", qPrintable(reference.path));
- return {reference.path, Result::Error, tr("File is not readable")};
- }
- const auto expected = QSet<QString>() << KeeShare_Signature << KeeShare_Container;
- const auto files = zip.getFileInfoList();
- QSet<QString> actual;
- for (const auto& file : files) {
- actual << file.name;
- }
- if (expected != actual) {
- qCritical("Invalid sharing container %s.", qPrintable(reference.path));
- return {reference.path, Result::Error, tr("Invalid sharing container")};
- }
-
- zip.setCurrentFile(KeeShare_Signature);
- QuaZipFile signatureFile(&zip);
- signatureFile.open(QuaZipFile::ReadOnly);
- QTextStream stream(&signatureFile);
-
- const auto sign = KeeShareSettings::Sign::deserialize(stream.readAll());
- signatureFile.close();
-
- zip.setCurrentFile(KeeShare_Container);
- QuaZipFile databaseFile(&zip);
- databaseFile.open(QuaZipFile::ReadOnly);
- auto payload = databaseFile.readAll();
- databaseFile.close();
- QBuffer buffer(&payload);
- buffer.open(QIODevice::ReadOnly);
-
- KeePass2Reader reader;
- auto key = QSharedPointer<CompositeKey>::create();
- key->addKey(QSharedPointer<PasswordKey>::create(reference.password));
- auto sourceDb = QSharedPointer<Database>::create();
- if (!reader.readDatabase(&buffer, key, sourceDb.data())) {
- qCritical("Error while parsing the database: %s", qPrintable(reader.errorString()));
- return {reference.path, Result::Error, reader.errorString()};
- }
-
- auto foreign = KeeShare::foreign();
- auto own = KeeShare::own();
- auto trust = check(payload, reference, own.certificate, foreign.certificates, sign);
- switch (trust.first) {
- case Invalid:
- qWarning("Prevent untrusted import");
- return {reference.path, Result::Error, tr("Untrusted import prevented")};
-
- case UntrustedForever:
- case TrustedForever: {
- bool found = false;
- const auto trusted =
- trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted;
- for (KeeShareSettings::ScopedCertificate& scopedCertificate : foreign.certificates) {
- if (scopedCertificate.certificate.key == trust.second.key && scopedCertificate.path == reference.path) {
- scopedCertificate.certificate.signer = trust.second.signer;
- scopedCertificate.path = reference.path;
- scopedCertificate.trust = trusted;
- found = true;
- break;
- }
- }
- if (!found) {
- foreign.certificates << KeeShareSettings::ScopedCertificate{reference.path, trust.second, trusted};
- }
- // update foreign certificates with new settings
- KeeShare::setForeign(foreign);
-
- if (trust.first == TrustedForever) {
- qDebug("Synchronize %s %s with %s",
- qPrintable(reference.path),
- qPrintable(targetGroup->name()),
- qPrintable(sourceDb->rootGroup()->name()));
- Merger merger(sourceDb->rootGroup(), targetGroup);
- merger.setForcedMergeMode(Group::Synchronize);
- const bool changed = merger.merge();
- if (changed) {
- return {reference.path, Result::Success, tr("Successful signed import")};
- }
- }
- // Silent ignore of untrusted import or unchanging import
- return {};
- }
- case TrustedOnce:
- case Own: {
- qDebug("Synchronize %s %s with %s",
- qPrintable(reference.path),
- qPrintable(targetGroup->name()),
- qPrintable(sourceDb->rootGroup()->name()));
- Merger merger(sourceDb->rootGroup(), targetGroup);
- merger.setForcedMergeMode(Group::Synchronize);
- const bool changed = merger.merge();
- if (changed) {
- return {reference.path, Result::Success, tr("Successful signed import")};
- }
- return {};
- }
- default:
- Q_ASSERT(false);
- return {reference.path, Result::Error, tr("Unexpected error")};
- }
-#endif
-}
-
-ShareObserver::Result ShareObserver::importUnsignedContainerInto(const KeeShareSettings::Reference& reference,
- Group* targetGroup)
-{
-#if !defined(WITH_XC_KEESHARE_INSECURE)
- Q_UNUSED(targetGroup);
- return {reference.path, Result::Warning, tr("Unsigned share container are not supported - import prevented")};
-#else
- QFile file(reference.path);
- if (!file.open(QIODevice::ReadOnly)) {
- qCritical("Unable to open file %s.", qPrintable(reference.path));
- return {reference.path, Result::Error, tr("File is not readable")};
- }
- auto payload = file.readAll();
- file.close();
- QBuffer buffer(&payload);
- buffer.open(QIODevice::ReadOnly);
-
- KeePass2Reader reader;
- auto key = QSharedPointer<CompositeKey>::create();
- key->addKey(QSharedPointer<PasswordKey>::create(reference.password));
- auto sourceDb = QSharedPointer<Database>::create();
- if (!reader.readDatabase(&buffer, key, sourceDb.data())) {
- qCritical("Error while parsing the database: %s", qPrintable(reader.errorString()));
- return {reference.path, Result::Error, reader.errorString()};
- }
-
- auto foreign = KeeShare::foreign();
- const auto own = KeeShare::own();
- const auto sign = KeeShareSettings::Sign(); // invalid sign
- auto trust = check(payload, reference, own.certificate, foreign.certificates, sign);
- switch (trust.first) {
- case UntrustedForever:
- case TrustedForever: {
- bool found = false;
- const auto trusted =
- trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted;
- for (KeeShareSettings::ScopedCertificate& scopedCertificate : foreign.certificates) {
- if (scopedCertificate.certificate.key == trust.second.key && scopedCertificate.path == reference.path) {
- scopedCertificate.certificate.signer = trust.second.signer;
- scopedCertificate.path = reference.path;
- scopedCertificate.trust = trusted;
- found = true;
- break;
- }
- }
- if (!found) {
- foreign.certificates << KeeShareSettings::ScopedCertificate{reference.path, trust.second, trusted};
- }
- // update foreign certificates with new settings
- KeeShare::setForeign(foreign);
-
- if (trust.first == TrustedForever) {
- qDebug("Synchronize %s %s with %s",
- qPrintable(reference.path),
- qPrintable(targetGroup->name()),
- qPrintable(sourceDb->rootGroup()->name()));
- Merger merger(sourceDb->rootGroup(), targetGroup);
- merger.setForcedMergeMode(Group::Synchronize);
- const bool changed = merger.merge();
- if (changed) {
- return {reference.path, Result::Success, tr("Successful signed import")};
- }
- }
- return {};
- }
-
- case TrustedOnce: {
- qDebug("Synchronize %s %s with %s",
- qPrintable(reference.path),
- qPrintable(targetGroup->name()),
- qPrintable(sourceDb->rootGroup()->name()));
- Merger merger(sourceDb->rootGroup(), targetGroup);
- merger.setForcedMergeMode(Group::Synchronize);
- const bool changed = merger.merge();
- if (changed) {
- return {reference.path, Result::Success, tr("Successful unsigned import")};
- }
- return {};
- }
- default:
- qWarning("Prevent untrusted import");
- return {reference.path, Result::Warning, tr("Untrusted import prevented")};
- }
-#endif
-}
-
-ShareObserver::Result ShareObserver::importContainerInto(const KeeShareSettings::Reference& reference,
- Group* targetGroup)
-{
- const QFileInfo info(reference.path);
- if (!info.exists()) {
- qCritical("File %s does not exist.", qPrintable(info.absoluteFilePath()));
- return {reference.path, Result::Warning, tr("File does not exist")};
- }
-
- if (isOfExportType(info, KeeShare::signedContainerFileType())) {
- return importSingedContainerInto(reference, targetGroup);
- }
- if (isOfExportType(info, KeeShare::unsignedContainerFileType())) {
- return importUnsignedContainerInto(reference, targetGroup);
- }
- return {reference.path, Result::Error, tr("Unknown share container type")};
-}
-
-ShareObserver::Result ShareObserver::importFromReferenceContainer(const QString& path)
+ShareObserver::Result ShareObserver::importShare(const QString& path)
{
if (!KeeShare::active().in) {
return {};
}
- auto shareGroup = m_shareToGroup.value(path);
+ const auto changePath = resolvePath(path, m_db);
+ auto shareGroup = m_shareToGroup.value(changePath);
if (!shareGroup) {
- qWarning("Source for %s does not exist", qPrintable(path));
- Q_ASSERT(shareGroup);
+ qWarning("Group for %s does not exist", qPrintable(path));
return {};
}
const auto reference = KeeShare::referenceOf(shareGroup);
@@ -561,81 +240,8 @@ ShareObserver::Result ShareObserver::importFromReferenceContainer(const QString&
Q_ASSERT(shareGroup->database() == m_db);
Q_ASSERT(shareGroup == m_db->rootGroup()->findGroupByUuid(shareGroup->uuid()));
- return importContainerInto(reference, shareGroup);
-}
-
-void ShareObserver::resolveReferenceAttributes(Entry* targetEntry, const Database* sourceDb)
-{
- for (const auto& attribute : EntryAttributes::DefaultAttributes) {
- const auto standardValue = targetEntry->attributes()->value(attribute);
- const auto type = targetEntry->placeholderType(standardValue);
- if (type != Entry::PlaceholderType::Reference) {
- // No reference to resolve
- continue;
- }
- const auto* referencedTargetEntry = targetEntry->resolveReference(standardValue);
- if (referencedTargetEntry) {
- // References is within scope, no resolving needed
- continue;
- }
- // We could do more sophisticated **** trying to point the reference to the next in-scope reference
- // but those cases with high propability constructed examples and very rare in real usage
- const auto* sourceReference = sourceDb->rootGroup()->findEntryByUuid(targetEntry->uuid());
- const auto resolvedValue = sourceReference->resolveMultiplePlaceholders(standardValue);
- targetEntry->setUpdateTimeinfo(false);
- targetEntry->attributes()->set(attribute, resolvedValue, targetEntry->attributes()->isProtected(attribute));
- targetEntry->setUpdateTimeinfo(true);
- }
-}
-
-Database* ShareObserver::exportIntoContainer(const KeeShareSettings::Reference& reference, const Group* sourceRoot)
-{
- const auto* sourceDb = sourceRoot->database();
- auto* targetDb = new Database();
- auto* targetMetadata = targetDb->metadata();
- targetMetadata->setRecycleBinEnabled(false);
- auto key = QSharedPointer<CompositeKey>::create();
- key->addKey(QSharedPointer<PasswordKey>::create(reference.password));
-
- // Copy the source root as the root of the export database, memory manage the old root node
- auto* targetRoot = sourceRoot->clone(Entry::CloneNoFlags, Group::CloneNoFlags);
- const bool updateTimeinfo = targetRoot->canUpdateTimeinfo();
- targetRoot->setUpdateTimeinfo(false);
- KeeShare::setReferenceTo(targetRoot, KeeShareSettings::Reference());
- targetRoot->setUpdateTimeinfo(updateTimeinfo);
- const auto sourceEntries = sourceRoot->entriesRecursive(false);
- for (const Entry* sourceEntry : sourceEntries) {
- auto* targetEntry = sourceEntry->clone(Entry::CloneIncludeHistory);
- const bool updateTimeinfo = targetEntry->canUpdateTimeinfo();
- targetEntry->setUpdateTimeinfo(false);
- targetEntry->setGroup(targetRoot);
- targetEntry->setUpdateTimeinfo(updateTimeinfo);
- const auto iconUuid = targetEntry->iconUuid();
- if (!iconUuid.isNull() && !targetMetadata->containsCustomIcon(iconUuid)) {
- targetMetadata->addCustomIcon(iconUuid, sourceEntry->icon());
- }
- }
-
- targetDb->setKey(key);
- auto* obsoleteRoot = targetDb->rootGroup();
- targetDb->setRootGroup(targetRoot);
- delete obsoleteRoot;
-
- targetDb->metadata()->setName(sourceRoot->name());
-
- // Push all deletions of the source database to the target
- // simple moving out of a share group will not trigger a deletion in the
- // target - a more elaborate mechanism may need the use of another custom
- // attribute to share unshared entries from the target db
- for (const auto& object : sourceDb->deletedObjects()) {
- targetDb->addDeletedObject(object);
- }
- for (auto* targetEntry : targetRoot->entriesRecursive(false)) {
- if (targetEntry->hasReferences()) {
- resolveReferenceAttributes(targetEntry, sourceDb);
- }
- }
- return targetDb;
+ const auto resolvedPath = resolvePath(reference.path, m_db);
+ return ShareImport::containerInto(resolvedPath, reference, shareGroup);
}
QSharedPointer<Database> ShareObserver::database()
@@ -643,109 +249,7 @@ QSharedPointer<Database> ShareObserver::database()
return m_db;
}
-ShareObserver::Result ShareObserver::exportIntoReferenceSignedContainer(const KeeShareSettings::Reference& reference,
- Database* targetDb)
-{
-#if !defined(WITH_XC_KEESHARE_SECURE)
- Q_UNUSED(targetDb);
- return {
- reference.path, Result::Warning, tr("Overwriting signed share container is not supported - export prevented")};
-#else
- QByteArray bytes;
- {
- QBuffer buffer(&bytes);
- buffer.open(QIODevice::WriteOnly);
- KeePass2Writer writer;
- writer.writeDatabase(&buffer, targetDb);
- if (writer.hasError()) {
- qWarning("Serializing export dabase failed: %s.", writer.errorString().toLatin1().data());
- return {reference.path, Result::Error, writer.errorString()};
- }
- }
- const auto own = KeeShare::own();
- QuaZip zip(reference.path);
- zip.setFileNameCodec("UTF-8");
- const bool zipOpened = zip.open(QuaZip::mdCreate);
- if (!zipOpened) {
- ::qWarning("Opening export file failed: %d", zip.getZipError());
- return {reference.path, Result::Error, tr("Could not write export container (%1)").arg(zip.getZipError())};
- }
- {
- QuaZipFile file(&zip);
- const auto signatureOpened = file.open(QIODevice::WriteOnly, QuaZipNewInfo(KeeShare_Signature));
- if (!signatureOpened) {
- ::qWarning("Embedding signature failed: Could not open file to write (%d)", zip.getZipError());
- return {reference.path,
- Result::Error,
- tr("Could not embed signature: Could not open file to write (%1)").arg(file.getZipError())};
- }
- QTextStream stream(&file);
- KeeShareSettings::Sign sign;
- auto sshKey = own.key.sshKey();
- sshKey.openKey(QString());
- const Signature signer;
- sign.signature = signer.create(bytes, sshKey);
- sign.certificate = own.certificate;
- stream << KeeShareSettings::Sign::serialize(sign);
- stream.flush();
- if (file.getZipError() != ZIP_OK) {
- ::qWarning("Embedding signature failed: Could not write file (%d)", zip.getZipError());
- return {reference.path,
- Result::Error,
- tr("Could not embed signature: Could not write file (%1)").arg(file.getZipError())};
- }
- file.close();
- }
- {
- QuaZipFile file(&zip);
- const auto dbOpened = file.open(QIODevice::WriteOnly, QuaZipNewInfo(KeeShare_Container));
- if (!dbOpened) {
- ::qWarning("Embedding database failed: Could not open file to write (%d)", zip.getZipError());
- return {reference.path,
- Result::Error,
- tr("Could not embed database: Could not open file to write (%1)").arg(file.getZipError())};
- }
- file.write(bytes);
- if (file.getZipError() != ZIP_OK) {
- ::qWarning("Embedding database failed: Could not write file (%d)", zip.getZipError());
- return {reference.path,
- Result::Error,
- tr("Could not embed database: Could not write file (%1)").arg(file.getZipError())};
- }
- file.close();
- }
- zip.close();
- return {reference.path};
-#endif
-}
-
-ShareObserver::Result ShareObserver::exportIntoReferenceUnsignedContainer(const KeeShareSettings::Reference& reference,
- Database* targetDb)
-{
-#if !defined(WITH_XC_KEESHARE_INSECURE)
- Q_UNUSED(targetDb);
- return {reference.path,
- Result::Warning,
- tr("Overwriting unsigned share container is not supported - export prevented")};
-#else
- QFile file(reference.path);
- const bool fileOpened = file.open(QIODevice::WriteOnly);
- if (!fileOpened) {
- ::qWarning("Opening export file failed");
- return {reference.path, Result::Error, tr("Could not write export container")};
- }
- KeePass2Writer writer;
- writer.writeDatabase(&file, targetDb);
- if (writer.hasError()) {
- qWarning("Exporting dabase failed: %s.", writer.errorString().toLatin1().data());
- return {reference.path, Result::Error, writer.errorString()};
- }
- file.close();
-#endif
- return {reference.path};
-}
-
-QList<ShareObserver::Result> ShareObserver::exportIntoReferenceContainers()
+QList<ShareObserver::Result> ShareObserver::exportShares()
{
QList<Result> results;
struct Reference
@@ -767,12 +271,12 @@ QList<ShareObserver::Result> ShareObserver::exportIntoReferenceContainers()
for (auto it = references.cbegin(); it != references.cend(); ++it) {
if (it.value().count() != 1) {
const auto path = it.value().first().config.path;
- QStringList groups;
+ QStringList groupnames;
for (const auto& reference : it.value()) {
- groups << reference.group->name();
+ groupnames << reference.group->name();
}
results << Result{
- path, Result::Error, tr("Conflicting export target path %1 in %2").arg(path, groups.join(", "))};
+ path, Result::Error, tr("Conflicting export target path %1 in %2").arg(path, groupnames.join(", "))};
}
}
if (!results.isEmpty()) {
@@ -782,21 +286,10 @@ QList<ShareObserver::Result> ShareObserver::exportIntoReferenceContainers()
for (auto it = references.cbegin(); it != references.cend(); ++it) {
const auto& reference = it.value().first();
- m_fileWatcher->ignoreFileChanges(reference.config.path);
- QScopedPointer<Database> targetDb(exportIntoContainer(reference.config, reference.group));
- QFileInfo info(reference.config.path);
- if (isOfExportType(info, KeeShare::signedContainerFileType())) {
- results << exportIntoReferenceSignedContainer(reference.config, targetDb.data());
- m_fileWatcher->observeFileChanges(true);
- continue;
- }
- if (isOfExportType(info, KeeShare::unsignedContainerFileType())) {
- results << exportIntoReferenceUnsignedContainer(reference.config, targetDb.data());
- m_fileWatcher->observeFileChanges(true);
- continue;
- }
- Q_ASSERT(false);
- results << Result{reference.config.path, Result::Error, tr("Unexpected export error occurred")};
+ const QString resolvedPath = resolvePath(reference.config.path, m_db);
+ m_fileWatcher->ignoreFileChanges(resolvedPath);
+ results << ShareExport::intoContainer(resolvedPath, reference.config, reference.group);
+ m_fileWatcher->observeFileChanges(true);
}
return results;
}
@@ -810,7 +303,7 @@ void ShareObserver::handleDatabaseSaved()
QStringList warning;
QStringList success;
- const auto results = exportIntoReferenceContainers();
+ const auto results = exportShares();
for (const Result& result : results) {
if (!result.isValid()) {
Q_ASSERT(result.isValid());
diff --git a/src/keeshare/ShareObserver.h b/src/keeshare/ShareObserver.h
index 95c088006..df81fb395 100644
--- a/src/keeshare/ShareObserver.h
+++ b/src/keeshare/ShareObserver.h
@@ -20,17 +20,13 @@
#include <QMap>
#include <QObject>
-#include <QSet>
#include <QStringList>
-#include <QTimer>
#include "gui/MessageWidget.h"
#include "keeshare/KeeShareSettings.h"
class BulkFileWatcher;
-class Entry;
class Group;
-class CustomData;
class Database;
class ShareObserver : public QObject
@@ -43,17 +39,6 @@ public:
QSharedPointer<Database> database();
-signals:
- void sharingMessage(QString, MessageWidget::MessageType);
-
-private slots:
- void handleDatabaseChanged();
- void handleDatabaseSaved();
- void handleFileCreated(const QString& path);
- void handleFileUpdated(const QString& path);
- void handleFileDeleted(const QString& path);
-
-private:
struct Result
{
enum Type
@@ -76,19 +61,19 @@ private:
bool isInfo() const;
};
- static void resolveReferenceAttributes(Entry* targetEntry, const Database* sourceDb);
+signals:
+ void sharingMessage(QString, MessageWidget::MessageType);
- static Database* exportIntoContainer(const KeeShareSettings::Reference& reference, const Group* sourceRoot);
- static Result exportIntoReferenceUnsignedContainer(const KeeShareSettings::Reference& reference,
- Database* targetDb);
- static Result exportIntoReferenceSignedContainer(const KeeShareSettings::Reference& reference, Database* targetDb);
- static Result importSingedContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup);
- static Result importUnsignedContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup);
- static Result importContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup);
- static Result importDatabaseInto();
+private slots:
+ void handleDatabaseChanged();
+ void handleDatabaseSaved();
+ void handleFileCreated(const QString& path);
+ void handleFileUpdated(const QString& path);
+ void handleFileDeleted(const QString& path);
- Result importFromReferenceContainer(const QString& path);
- QList<Result> exportIntoReferenceContainers();
+private:
+ Result importShare(const QString& path);
+ QList<Result> exportShares();
void deinitialize();
void reinitialize();
diff --git a/src/keeshare/group/EditGroupWidgetKeeShare.cpp b/src/keeshare/group/EditGroupWidgetKeeShare.cpp
index 0170a82af..5df9f13ee 100644
--- a/src/keeshare/group/EditGroupWidgetKeeShare.cpp
+++ b/src/keeshare/group/EditGroupWidgetKeeShare.cpp
@@ -284,35 +284,17 @@ void EditGroupWidgetKeeShare::launchPathSelectionDialog()
}
switch (reference.type) {
case KeeShareSettings::ImportFrom:
- filename = fileDialog()->getFileName(this,
- tr("Select import source"),
- defaultDirPath,
- filters,
- nullptr,
- QFileDialog::DontConfirmOverwrite,
- defaultFiletype,
- filename);
+ filename = fileDialog()->getFileName(
+ this, tr("Select import source"), defaultDirPath, filters, nullptr, QFileDialog::DontConfirmOverwrite);
break;
case KeeShareSettings::ExportTo:
- filename = fileDialog()->getFileName(this,
- tr("Select export target"),
- defaultDirPath,
- filters,
- nullptr,
- QFileDialog::Option(0),
- defaultFiletype,
- filename);
+ filename = fileDialog()->getFileName(
+ this, tr("Select export target"), defaultDirPath, filters, nullptr, QFileDialog::Option(0));
break;
case KeeShareSettings::SynchronizeWith:
case KeeShareSettings::Inactive:
- filename = fileDialog()->getFileName(this,
- tr("Select import/export file"),
- defaultDirPath,
- filters,
- nullptr,
- QFileDialog::Option(0),
- defaultFiletype,
- filename);
+ filename = fileDialog()->getFileName(
+ this, tr("Select import/export file"), defaultDirPath, filters, nullptr, QFileDialog::Option(0));
break;
}
diff --git a/src/keeshare/group/EditGroupWidgetKeeShare.ui b/src/keeshare/group/EditGroupWidgetKeeShare.ui
index 30e34962f..b64195c64 100644
--- a/src/keeshare/group/EditGroupWidgetKeeShare.ui
+++ b/src/keeshare/group/EditGroupWidgetKeeShare.ui
@@ -39,7 +39,11 @@
</widget>
</item>
<item row="2" column="1">
- <widget class="QComboBox" name="typeComboBox"/>
+ <widget class="QComboBox" name="typeComboBox">
+ <property name="accessibleName">
+ <string>Sharing mode field</string>
+ </property>
+ </widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="pathLabel">
@@ -51,10 +55,17 @@
<item row="3" column="1">
<layout class="QHBoxLayout" name="pathLayout">
<item>
- <widget class="QLineEdit" name="pathEdit"/>
+ <widget class="QLineEdit" name="pathEdit">
+ <property name="accessibleName">
+ <string>Path to share file field</string>
+ </property>
+ </widget>
</item>
<item>
<widget class="QToolButton" name="pathSelectionButton">
+ <property name="accessibleName">
+ <string>Browser for share file</string>
+ </property>
<property name="text">
<string>...</string>
</property>
@@ -73,6 +84,9 @@
<layout class="QHBoxLayout" name="passwordLayout">
<item>
<widget class="PasswordEdit" name="passwordEdit">
+ <property name="accessibleName">
+ <string>Password field</string>
+ </property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@@ -80,6 +94,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordButton">
+ <property name="accessibleName">
+ <string>Toggle password visibility</string>
+ </property>
<property name="checkable">
<bool>true</bool>
</property>
@@ -87,6 +104,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordGeneratorButton">
+ <property name="accessibleName">
+ <string>Toggle password generator</string>
+ </property>
<property name="checkable">
<bool>true</bool>
</property>
@@ -99,6 +119,9 @@
</item>
<item row="6" column="1">
<widget class="QPushButton" name="clearButton">
+ <property name="accessibleName">
+ <string>Clear fields</string>
+ </property>
<property name="text">
<string>Clear</string>
</property>
diff --git a/src/keys/FileKey.cpp b/src/keys/FileKey.cpp
index da25ef4ae..9c3d41c1d 100644
--- a/src/keys/FileKey.cpp
+++ b/src/keys/FileKey.cpp
@@ -24,10 +24,10 @@
#include <QFile>
-#include <sodium.h>
-#include <gcrypt.h>
#include <algorithm>
#include <cstring>
+#include <gcrypt.h>
+#include <sodium.h>
QUuid FileKey::UUID("a584cbc4-c9b4-437e-81bb-362ca9709273");
diff --git a/src/keys/PasswordKey.cpp b/src/keys/PasswordKey.cpp
index 2d0416af8..77d2f276e 100644
--- a/src/keys/PasswordKey.cpp
+++ b/src/keys/PasswordKey.cpp
@@ -19,9 +19,9 @@
#include "core/Tools.h"
#include "crypto/CryptoHash.h"
-#include <gcrypt.h>
#include <algorithm>
#include <cstring>
+#include <gcrypt.h>
QUuid PasswordKey::UUID("77e90411-303a-43f2-b773-853b05635ead");
diff --git a/src/keys/YkChallengeResponseKey.cpp b/src/keys/YkChallengeResponseKey.cpp
index 759d8d1bc..ecf11fe1c 100644
--- a/src/keys/YkChallengeResponseKey.cpp
+++ b/src/keys/YkChallengeResponseKey.cpp
@@ -32,9 +32,9 @@
#include <QXmlStreamReader>
#include <QtConcurrent>
+#include <cstring>
#include <gcrypt.h>
#include <sodium.h>
-#include <cstring>
QUuid YkChallengeResponseKey::UUID("e092495c-e77d-498b-84a1-05ae0d955508");
@@ -66,9 +66,9 @@ QByteArray YkChallengeResponseKey::rawKey() const
/**
* Assumes yubikey()->init() was called
*/
-bool YkChallengeResponseKey::challenge(const QByteArray& challenge)
+bool YkChallengeResponseKey::challenge(const QByteArray& c)
{
- return this->challenge(challenge, 2);
+ return challenge(c, 2);
}
bool YkChallengeResponseKey::challenge(const QByteArray& challenge, unsigned int retries)
@@ -106,12 +106,14 @@ bool YkChallengeResponseKey::challenge(const QByteArray& challenge, unsigned int
QString YkChallengeResponseKey::getName() const
{
unsigned int serial;
- QString fmt(QObject::tr("YubiKey[%1] Challenge Response - Slot %2 - %3"));
+ QString fmt(QObject::tr("%1[%2] Challenge Response - Slot %3 - %4"));
YubiKey::instance()->getSerial(serial);
- return fmt.arg(
- QString::number(serial), QString::number(m_slot), (m_blocking) ? QObject::tr("Press") : QObject::tr("Passive"));
+ return fmt.arg(YubiKey::instance()->getVendorName(),
+ QString::number(serial),
+ QString::number(m_slot),
+ (m_blocking) ? QObject::tr("Press") : QObject::tr("Passive"));
}
bool YkChallengeResponseKey::isBlocking() const
diff --git a/src/keys/YkChallengeResponseKeyCLI.cpp b/src/keys/YkChallengeResponseKeyCLI.cpp
new file mode 100644
index 000000000..c218f1f55
--- /dev/null
+++ b/src/keys/YkChallengeResponseKeyCLI.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "keys/YkChallengeResponseKeyCLI.h"
+#include "keys/drivers/YubiKey.h"
+
+#include "core/Tools.h"
+#include "crypto/CryptoHash.h"
+#include "crypto/Random.h"
+
+#include <QFile>
+#include <QtCore/qglobal.h>
+
+QUuid YkChallengeResponseKeyCLI::UUID("e2be77c0-c810-417a-8437-32f41d00bd1d");
+
+YkChallengeResponseKeyCLI::YkChallengeResponseKeyCLI(int slot,
+ bool blocking,
+ QString messageInteraction,
+ FILE* outputDescriptor)
+ : ChallengeResponseKey(UUID)
+ , m_slot(slot)
+ , m_blocking(blocking)
+ , m_messageInteraction(messageInteraction)
+ , m_out(outputDescriptor)
+{
+}
+
+QByteArray YkChallengeResponseKeyCLI::rawKey() const
+{
+ return m_key;
+}
+
+/**
+ * Assumes yubikey()->init() was called
+ */
+bool YkChallengeResponseKeyCLI::challenge(const QByteArray& c)
+{
+ return challenge(c, 2);
+}
+
+bool YkChallengeResponseKeyCLI::challenge(const QByteArray& challenge, unsigned int retries)
+{
+ QTextStream out(m_out, QIODevice::WriteOnly);
+ do {
+ --retries;
+
+ if (m_blocking) {
+ out << m_messageInteraction << endl;
+ }
+ YubiKey::ChallengeResult result = YubiKey::instance()->challenge(m_slot, m_blocking, challenge, m_key);
+ if (result == YubiKey::SUCCESS) {
+ return true;
+ }
+ } while (retries > 0);
+
+ return false;
+}
diff --git a/src/keys/YkChallengeResponseKeyCLI.h b/src/keys/YkChallengeResponseKeyCLI.h
new file mode 100644
index 000000000..ed2d62b2a
--- /dev/null
+++ b/src/keys/YkChallengeResponseKeyCLI.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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_YK_CHALLENGERESPONSEKEYCLI_H
+#define KEEPASSX_YK_CHALLENGERESPONSEKEYCLI_H
+
+#include "core/Global.h"
+#include "keys/ChallengeResponseKey.h"
+#include "keys/drivers/YubiKey.h"
+
+#include <QObject>
+#include <QTextStream>
+
+class YkChallengeResponseKeyCLI : public QObject, public ChallengeResponseKey
+{
+ Q_OBJECT
+
+public:
+ static QUuid UUID;
+
+ explicit YkChallengeResponseKeyCLI(int slot, bool blocking, QString messageInteraction, FILE* outputDescriptor);
+
+ QByteArray rawKey() const override;
+ bool challenge(const QByteArray& challenge) override;
+ bool challenge(const QByteArray& challenge, unsigned int retries);
+
+private:
+ QByteArray m_key;
+ int m_slot;
+ bool m_blocking;
+ QString m_messageInteraction;
+ FILE* m_out;
+};
+
+#endif // KEEPASSX_YK_CHALLENGERESPONSEKEYCLI_H
diff --git a/src/keys/drivers/YubiKey.cpp b/src/keys/drivers/YubiKey.cpp
index b4aa82205..18cf8323a 100644
--- a/src/keys/drivers/YubiKey.cpp
+++ b/src/keys/drivers/YubiKey.cpp
@@ -20,6 +20,7 @@
#include <ykcore.h>
#include <ykdef.h>
+#include <ykpers-version.h>
#include <ykstatus.h>
#include <yubikey.h>
@@ -37,6 +38,7 @@
YubiKey::YubiKey()
: m_yk_void(nullptr)
, m_ykds_void(nullptr)
+ , m_onlyKey(false)
, m_mutex(QMutex::Recursive)
{
}
@@ -75,7 +77,17 @@ bool YubiKey::init()
}
// TODO: handle multiple attached hardware devices
+ m_onlyKey = false;
m_yk_void = static_cast<void*>(yk_open_first_key());
+#if YKPERS_VERSION_NUMBER >= 0x011400
+ // New fuction available in yubikey-personalization version >= 1.20.0 that allows
+ // selecting device VID/PID (yk_open_key_vid_pid)
+ if (m_yk == nullptr) {
+ static const int device_pids[] = {0x60fc}; // OnlyKey PID
+ m_yk_void = static_cast<void*>(yk_open_key_vid_pid(0x1d50, device_pids, 1, 0));
+ m_onlyKey = true;
+ }
+#endif
if (m_yk == nullptr) {
yk_release();
m_mutex.unlock();
@@ -120,27 +132,17 @@ void YubiKey::detect()
{
bool found = false;
- if (init()) {
- YubiKey::ChallengeResult result;
- QByteArray rand = randomGen()->randomArray(1);
- QByteArray resp;
-
- // Check slot 1 and 2 for Challenge-Response HMAC capability
- for (int i = 1; i <= 2; ++i) {
- result = challenge(i, false, rand, resp);
- if (result == ALREADY_RUNNING) {
- // Try this slot again after waiting
- Tools::sleep(300);
- result = challenge(i, false, rand, resp);
- }
-
- if (result != ALREADY_RUNNING && result != ERROR) {
- emit detected(i, result == WOULDBLOCK);
- found = true;
- }
- // Wait between slots to let the yubikey settle
- Tools::sleep(150);
+ // Check slot 1 and 2 for Challenge-Response HMAC capability
+ for (int i = 1; i <= 2; ++i) {
+ QString errorMsg;
+ bool isBlocking = checkSlotIsBlocking(i, errorMsg);
+ if (errorMsg.isEmpty()) {
+ found = true;
+ emit detected(i, isBlocking);
}
+
+ // Wait between slots to let the yubikey settle.
+ Tools::sleep(150);
}
if (!found) {
@@ -150,6 +152,38 @@ void YubiKey::detect()
}
}
+bool YubiKey::checkSlotIsBlocking(int slot, QString& errorMessage)
+{
+ if (!init()) {
+ errorMessage = QString("Could not initialize YubiKey.");
+ return false;
+ }
+
+ YubiKey::ChallengeResult result;
+ QByteArray rand = randomGen()->randomArray(1);
+ QByteArray resp;
+
+ result = challenge(slot, false, rand, resp);
+ if (result == ALREADY_RUNNING) {
+ // Try this slot again after waiting
+ Tools::sleep(300);
+ result = challenge(slot, false, rand, resp);
+ }
+
+ if (result == SUCCESS || result == WOULDBLOCK) {
+ return result == WOULDBLOCK;
+ } else if (result == ALREADY_RUNNING) {
+ errorMessage = QString("YubiKey busy");
+ return false;
+ } else if (result == ERROR) {
+ errorMessage = QString("YubiKey error");
+ return false;
+ }
+
+ errorMessage = QString("Error while polling YubiKey");
+ return false;
+}
+
bool YubiKey::getSerial(unsigned int& serial)
{
m_mutex.lock();
@@ -163,6 +197,11 @@ bool YubiKey::getSerial(unsigned int& serial)
return true;
}
+QString YubiKey::getVendorName()
+{
+ return m_onlyKey ? "OnlyKey" : "YubiKey";
+}
+
YubiKey::ChallengeResult YubiKey::challenge(int slot, bool mayBlock, const QByteArray& challenge, QByteArray& response)
{
// ensure that YubiKey::init() succeeded
@@ -173,14 +212,14 @@ YubiKey::ChallengeResult YubiKey::challenge(int slot, bool mayBlock, const QByte
int yk_cmd = (slot == 1) ? SLOT_CHAL_HMAC1 : SLOT_CHAL_HMAC2;
QByteArray paddedChallenge = challenge;
- // yk_challenge_response() insists on 64 byte response buffer */
+ // yk_challenge_response() insists on 64 bytes response buffer */
response.clear();
response.resize(64);
/* The challenge sent to the yubikey should always be 64 bytes for
* compatibility with all configurations. Follow PKCS7 padding.
*
- * There is some question whether or not 64 byte fixed length
+ * There is some question whether or not 64 bytes fixed length
* configurations even work, some docs say avoid it.
*/
const int padLen = 64 - paddedChallenge.size();
diff --git a/src/keys/drivers/YubiKey.h b/src/keys/drivers/YubiKey.h
index 420e650b5..7bb527a28 100644
--- a/src/keys/drivers/YubiKey.h
+++ b/src/keys/drivers/YubiKey.h
@@ -80,10 +80,23 @@ public:
bool getSerial(unsigned int& serial);
/**
+ * @brief YubiKey::getVendorName - vendor name of token
+ * @return vendor name
+ */
+ QString getVendorName();
+
+ /**
* @brief YubiKey::detect - probe for attached YubiKeys
*/
void detect();
+ /**
+ * @param slot the yubikey slot.
+ * @param errorMessage populated if an error occured.
+ *
+ * @return whether the key is blocking or not.
+ */
+ bool checkSlotIsBlocking(int slot, QString& errorMessage);
signals:
/** Emitted in response to detect() when a device is found
*
@@ -110,6 +123,7 @@ private:
// Create void ptr here to avoid ifdef header include mess
void* m_yk_void;
void* m_ykds_void;
+ bool m_onlyKey;
QMutex m_mutex;
diff --git a/src/keys/drivers/YubiKeyStub.cpp b/src/keys/drivers/YubiKeyStub.cpp
index f0647ab8a..81e913b0e 100644
--- a/src/keys/drivers/YubiKeyStub.cpp
+++ b/src/keys/drivers/YubiKeyStub.cpp
@@ -61,6 +61,11 @@ bool YubiKey::getSerial(unsigned int& serial)
return false;
}
+QString YubiKey::getVendorName()
+{
+ return "YubiKeyStub";
+}
+
YubiKey::ChallengeResult YubiKey::challenge(int slot, bool mayBlock, const QByteArray& chal, QByteArray& resp)
{
Q_UNUSED(slot);
diff --git a/src/main.cpp b/src/main.cpp
index e975a6b9c..91eb1b73e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -50,13 +50,9 @@ int main(int argc, char** argv)
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
-#endif
#ifdef Q_OS_LINUX
- if (qgetenv("XDG_SESSION_TYPE") == QByteArrayLiteral("wayland")) {
- qWarning() << "Warning: disregarding XDG_SESSION_TYPE=wayland";
- qWarning() << "To use wayland anyway, please set QT_QPA_PLATFORM=wayland";
- qunsetenv("XDG_SESSION_TYPE");
- }
+ QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
+#endif
#endif
Application app(argc, argv);
@@ -82,8 +78,7 @@ int main(int argc, char** argv)
QCommandLineOption helpOption = parser.addHelpOption();
QCommandLineOption versionOption = parser.addVersionOption();
- QCommandLineOption debugInfoOption(QStringList() << "debug-info",
- QObject::tr("Displays debugging information."));
+ QCommandLineOption debugInfoOption(QStringList() << "debug-info", QObject::tr("Displays debugging information."));
parser.addOption(configOption);
parser.addOption(keyfileOption);
parser.addOption(pwstdinOption);
@@ -144,8 +139,7 @@ int main(int argc, char** argv)
if (pwstdin) {
// we always need consume a line of STDIN if --pw-stdin is set to clear out the
// buffer for native messaging, even if the specified file does not exist
- static QTextStream in(stdin, QIODevice::ReadOnly);
- static QTextStream out(stdout, QIODevice::WriteOnly);
+ QTextStream out(stdout, QIODevice::WriteOnly);
out << QObject::tr("Database password: ") << flush;
password = Utils::getPassword();
}
diff --git a/src/proxy/NativeMessagingHost.cpp b/src/proxy/NativeMessagingHost.cpp
index 3c401e4c9..44b3ab7ef 100644
--- a/src/proxy/NativeMessagingHost.cpp
+++ b/src/proxy/NativeMessagingHost.cpp
@@ -35,7 +35,7 @@ NativeMessagingHost::NativeMessagingHost()
setsockopt(socketDesc, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<char*>(&max), sizeof(max));
}
#ifdef Q_OS_WIN
- m_running.store(true);
+ m_running.store(1);
m_future = QtConcurrent::run(this, &NativeMessagingHost::readNativeMessages);
#endif
connect(m_localSocket, SIGNAL(readyRead()), this, SLOT(newLocalMessage()));
@@ -56,7 +56,7 @@ void NativeMessagingHost::readNativeMessages()
{
#ifdef Q_OS_WIN
quint32 length = 0;
- while (m_running.load() && !std::cin.eof()) {
+ while (m_running.load() == 1 && !std::cin.eof()) {
length = 0;
std::cin.read(reinterpret_cast<char*>(&length), 4);
if (!readStdIn(length)) {
@@ -128,6 +128,6 @@ void NativeMessagingHost::deleteSocket()
void NativeMessagingHost::socketStateChanged(QLocalSocket::LocalSocketState socketState)
{
if (socketState == QLocalSocket::UnconnectedState || socketState == QLocalSocket::ClosingState) {
- m_running.testAndSetOrdered(true, false);
+ m_running.testAndSetOrdered(1, 0);
}
}
diff --git a/src/totp/totp.cpp b/src/totp/totp.cpp
index ceb163c04..c6bad0156 100644
--- a/src/totp/totp.cpp
+++ b/src/totp/totp.cpp
@@ -23,18 +23,40 @@
#include <QCryptographicHash>
#include <QMessageAuthenticationCode>
#include <QRegularExpression>
-#include <QRegularExpressionMatch>
#include <QUrl>
#include <QUrlQuery>
#include <QVariant>
#include <QtEndian>
#include <cmath>
-static QList<Totp::Encoder> encoders{
+static QList<Totp::Encoder> totpEncoders{
{"", "", "0123456789", Totp::DEFAULT_DIGITS, Totp::DEFAULT_STEP, false},
{"steam", Totp::STEAM_SHORTNAME, "23456789BCDFGHJKMNPQRTVWXY", Totp::STEAM_DIGITS, Totp::DEFAULT_STEP, true},
};
+static Totp::Algorithm getHashTypeByName(const QString& name)
+{
+ if (name.compare(QString("SHA512"), Qt::CaseInsensitive) == 0) {
+ return Totp::Algorithm::Sha512;
+ }
+ if (name.compare(QString("SHA256"), Qt::CaseInsensitive) == 0) {
+ return Totp::Algorithm::Sha256;
+ }
+ return Totp::Algorithm::Sha1;
+}
+
+static QString getNameForHashType(const Totp::Algorithm hashType)
+{
+ switch (hashType) {
+ case Totp::Algorithm::Sha512:
+ return QString("SHA512");
+ case Totp::Algorithm::Sha256:
+ return QString("SHA256");
+ default:
+ return QString("SHA1");
+ }
+}
+
QSharedPointer<Totp::Settings> Totp::parseSettings(const QString& rawSettings, const QString& key)
{
// Create default settings
@@ -44,29 +66,38 @@ QSharedPointer<Totp::Settings> Totp::parseSettings(const QString& rawSettings, c
if (url.isValid() && url.scheme() == "otpauth") {
// Default OTP url format
QUrlQuery query(url);
- settings->otpUrl = true;
+ settings->format = StorageFormat::OTPURL;
settings->key = query.queryItemValue("secret");
- settings->digits = query.queryItemValue("digits").toUInt();
- settings->step = query.queryItemValue("period").toUInt();
+ if (query.hasQueryItem("digits")) {
+ settings->digits = query.queryItemValue("digits").toUInt();
+ }
+ if (query.hasQueryItem("period")) {
+ settings->step = query.queryItemValue("period").toUInt();
+ }
if (query.hasQueryItem("encoder")) {
settings->encoder = getEncoderByName(query.queryItemValue("encoder"));
}
+ if (query.hasQueryItem("algorithm")) {
+ settings->algorithm = getHashTypeByName(query.queryItemValue("algorithm"));
+ }
} else {
QUrlQuery query(rawSettings);
if (query.hasQueryItem("key")) {
// Compatibility with "KeeOtp" plugin
- settings->keeOtp = true;
+ settings->format = StorageFormat::KEEOTP;
settings->key = query.queryItemValue("key");
- settings->digits = DEFAULT_DIGITS;
- settings->step = DEFAULT_STEP;
if (query.hasQueryItem("size")) {
settings->digits = query.queryItemValue("size").toUInt();
}
if (query.hasQueryItem("step")) {
settings->step = query.queryItemValue("step").toUInt();
}
+ if (query.hasQueryItem("otpHashMode")) {
+ settings->algorithm = getHashTypeByName(query.queryItemValue("otpHashMode"));
+ }
} else {
// Parse semi-colon separated values ([step];[digits|S])
+ settings->format = StorageFormat::LEGACY;
auto vars = rawSettings.split(";");
if (vars.size() >= 2) {
if (vars[1] == STEAM_SHORTNAME) {
@@ -87,7 +118,8 @@ QSharedPointer<Totp::Settings> Totp::parseSettings(const QString& rawSettings, c
// Detect custom settings, used by setup GUI
if (settings->encoder.shortName.isEmpty()
- && (settings->digits != DEFAULT_DIGITS || settings->step != DEFAULT_STEP)) {
+ && (settings->digits != DEFAULT_DIGITS || settings->step != DEFAULT_STEP
+ || settings->algorithm != DEFAULT_ALGORITHM)) {
settings->custom = true;
}
@@ -97,21 +129,13 @@ QSharedPointer<Totp::Settings> Totp::parseSettings(const QString& rawSettings, c
QSharedPointer<Totp::Settings> Totp::createSettings(const QString& key,
const uint digits,
const uint step,
+ const Totp::StorageFormat format,
const QString& encoderShortName,
- QSharedPointer<Totp::Settings> prevSettings)
+ const Totp::Algorithm algorithm)
{
- bool isCustom = digits != DEFAULT_DIGITS || step != DEFAULT_STEP;
- if (prevSettings) {
- prevSettings->key = key;
- prevSettings->digits = digits;
- prevSettings->step = step;
- prevSettings->encoder = Totp::getEncoderByShortName(encoderShortName);
- prevSettings->custom = isCustom;
- return prevSettings;
- } else {
- return QSharedPointer<Totp::Settings>(
- new Totp::Settings{getEncoderByShortName(encoderShortName), key, false, false, isCustom, digits, step});
- }
+ bool isCustom = digits != DEFAULT_DIGITS || step != DEFAULT_STEP || algorithm != DEFAULT_ALGORITHM;
+ return QSharedPointer<Totp::Settings>(
+ new Totp::Settings{format, getEncoderByShortName(encoderShortName), algorithm, key, isCustom, digits, step});
}
QString Totp::writeSettings(const QSharedPointer<Totp::Settings>& settings,
@@ -124,7 +148,7 @@ QString Totp::writeSettings(const QSharedPointer<Totp::Settings>& settings,
}
// OTP Url output
- if (settings->otpUrl || forceOtp) {
+ if (settings->format == StorageFormat::OTPURL || forceOtp) {
auto urlstring = QString("otpauth://totp/%1:%2?secret=%3&period=%4&digits=%5&issuer=%1")
.arg(title.isEmpty() ? "KeePassXC" : QString(QUrl::toPercentEncoding(title)),
username.isEmpty() ? "none" : QString(QUrl::toPercentEncoding(username)),
@@ -135,13 +159,20 @@ QString Totp::writeSettings(const QSharedPointer<Totp::Settings>& settings,
if (!settings->encoder.name.isEmpty()) {
urlstring.append("&encoder=").append(settings->encoder.name);
}
+ if (settings->algorithm != Totp::DEFAULT_ALGORITHM) {
+ urlstring.append("&algorithm=").append(getNameForHashType(settings->algorithm));
+ }
return urlstring;
- } else if (settings->keeOtp) {
+ } else if (settings->format == StorageFormat::KEEOTP) {
// KeeOtp output
- return QString("key=%1&size=%2&step=%3")
- .arg(QString(Base32::sanitizeInput(settings->key.toLatin1())))
- .arg(settings->digits)
- .arg(settings->step);
+ auto keyString = QString("key=%1&size=%2&step=%3")
+ .arg(QString(Base32::sanitizeInput(settings->key.toLatin1())))
+ .arg(settings->digits)
+ .arg(settings->step);
+ if (settings->algorithm != Totp::DEFAULT_ALGORITHM) {
+ keyString.append("&otpHashMode=").append(getNameForHashType(settings->algorithm));
+ }
+ return keyString;
} else if (!settings->encoder.shortName.isEmpty()) {
// Semicolon output [step];[encoder]
return QString("%1;%2").arg(settings->step).arg(settings->encoder.shortName);
@@ -174,7 +205,19 @@ QString Totp::generateTotp(const QSharedPointer<Totp::Settings>& settings, const
return QObject::tr("Invalid Key", "TOTP");
}
- QMessageAuthenticationCode code(QCryptographicHash::Sha1);
+ QCryptographicHash::Algorithm cryptoHash;
+ switch (settings->algorithm) {
+ case Totp::Algorithm::Sha512:
+ cryptoHash = QCryptographicHash::Sha512;
+ break;
+ case Totp::Algorithm::Sha256:
+ cryptoHash = QCryptographicHash::Sha256;
+ break;
+ default:
+ cryptoHash = QCryptographicHash::Sha1;
+ break;
+ }
+ QMessageAuthenticationCode code(cryptoHash);
code.setKey(secret.toByteArray());
code.addData(QByteArray(reinterpret_cast<char*>(&current), sizeof(current)));
QByteArray hmac = code.result();
@@ -206,11 +249,29 @@ QString Totp::generateTotp(const QSharedPointer<Totp::Settings>& settings, const
return retval;
}
+QList<QPair<QString, QString>> Totp::supportedEncoders()
+{
+ QList<QPair<QString, QString>> encoders;
+ for (auto& encoder : totpEncoders) {
+ encoders << QPair<QString, QString>(encoder.name, encoder.shortName);
+ }
+ return encoders;
+}
+
+QList<QPair<QString, Totp::Algorithm>> Totp::supportedAlgorithms()
+{
+ QList<QPair<QString, Algorithm>> algorithms;
+ algorithms << QPair<QString, Algorithm>(QStringLiteral("SHA-1"), Algorithm::Sha1);
+ algorithms << QPair<QString, Algorithm>(QStringLiteral("SHA-256"), Algorithm::Sha256);
+ algorithms << QPair<QString, Algorithm>(QStringLiteral("SHA-512"), Algorithm::Sha512);
+ return algorithms;
+}
+
Totp::Encoder& Totp::defaultEncoder()
{
// The first encoder is always the default
- Q_ASSERT(!encoders.empty());
- return encoders[0];
+ Q_ASSERT(!totpEncoders.empty());
+ return totpEncoders[0];
}
Totp::Encoder& Totp::steamEncoder()
@@ -220,7 +281,7 @@ Totp::Encoder& Totp::steamEncoder()
Totp::Encoder& Totp::getEncoderByShortName(const QString& shortName)
{
- for (auto& encoder : encoders) {
+ for (auto& encoder : totpEncoders) {
if (encoder.shortName == shortName) {
return encoder;
}
@@ -230,7 +291,7 @@ Totp::Encoder& Totp::getEncoderByShortName(const QString& shortName)
Totp::Encoder& Totp::getEncoderByName(const QString& name)
{
- for (auto& encoder : encoders) {
+ for (auto& encoder : totpEncoders) {
if (encoder.name == name) {
return encoder;
}
diff --git a/src/totp/totp.h b/src/totp/totp.h
index 499973bf9..e21f55571 100644
--- a/src/totp/totp.h
+++ b/src/totp/totp.h
@@ -28,7 +28,6 @@ class QUrl;
namespace Totp
{
-
struct Encoder
{
QString name;
@@ -39,12 +38,26 @@ namespace Totp
bool reverse;
};
+ enum Algorithm
+ {
+ Sha1,
+ Sha256,
+ Sha512,
+ };
+
+ enum StorageFormat
+ {
+ OTPURL,
+ KEEOTP,
+ LEGACY,
+ };
+
struct Settings
{
+ Totp::StorageFormat format;
Totp::Encoder encoder;
+ Totp::Algorithm algorithm;
QString key;
- bool otpUrl;
- bool keeOtp;
bool custom;
uint digits;
uint step;
@@ -53,6 +66,8 @@ namespace Totp
constexpr uint DEFAULT_STEP = 30u;
constexpr uint DEFAULT_DIGITS = 6u;
constexpr uint STEAM_DIGITS = 5u;
+ constexpr Totp::Algorithm DEFAULT_ALGORITHM = Sha1;
+ constexpr Totp::StorageFormat DEFAULT_FORMAT = OTPURL;
static const QString STEAM_SHORTNAME = "S";
static const QString ATTRIBUTE_OTP = "otp";
@@ -63,8 +78,9 @@ namespace Totp
QSharedPointer<Totp::Settings> createSettings(const QString& key,
const uint digits,
const uint step,
+ const Totp::StorageFormat format = DEFAULT_FORMAT,
const QString& encoderShortName = {},
- QSharedPointer<Totp::Settings> prevSettings = {});
+ const Totp::Algorithm algorithm = DEFAULT_ALGORITHM);
QString writeSettings(const QSharedPointer<Totp::Settings>& settings,
const QString& title = {},
const QString& username = {},
@@ -72,6 +88,9 @@ namespace Totp
QString generateTotp(const QSharedPointer<Totp::Settings>& settings, const quint64 time = 0ull);
+ QList<QPair<QString, QString>> supportedEncoders();
+ QList<QPair<QString, Algorithm>> supportedAlgorithms();
+
Encoder& defaultEncoder();
Encoder& steamEncoder();
Encoder& getEncoderByShortName(const QString& shortName);
diff --git a/src/updatecheck/UpdateChecker.cpp b/src/updatecheck/UpdateChecker.cpp
index 145312907..c36879707 100644
--- a/src/updatecheck/UpdateChecker.cpp
+++ b/src/updatecheck/UpdateChecker.cpp
@@ -16,18 +16,21 @@
*/
#include "UpdateChecker.h"
+
#include "config-keepassx.h"
#include "core/Clock.h"
#include "core/Config.h"
+#include "core/NetworkManager.h"
+
+#include <QJsonArray>
+#include <QJsonDocument>
#include <QJsonObject>
-#include <QNetworkAccessManager>
-#include <QtNetwork>
+#include <QRegularExpression>
UpdateChecker* UpdateChecker::m_instance(nullptr);
UpdateChecker::UpdateChecker(QObject* parent)
: QObject(parent)
- , m_netMgr(new QNetworkAccessManager(this))
, m_reply(nullptr)
, m_isManuallyRequested(false)
{
@@ -56,7 +59,7 @@ void UpdateChecker::checkForUpdates(bool manuallyRequested)
QNetworkRequest request(apiUrl);
request.setRawHeader("Accept", "application/json");
- m_reply = m_netMgr->get(request);
+ m_reply = getNetMgr()->get(request);
connect(m_reply, &QNetworkReply::finished, this, &UpdateChecker::fetchFinished);
connect(m_reply, &QIODevice::readyRead, this, &UpdateChecker::fetchReadyRead);
diff --git a/src/updatecheck/UpdateChecker.h b/src/updatecheck/UpdateChecker.h
index 64430bda3..9e804b274 100644
--- a/src/updatecheck/UpdateChecker.h
+++ b/src/updatecheck/UpdateChecker.h
@@ -20,7 +20,6 @@
#include <QObject>
#include <QString>
-class QNetworkAccessManager;
class QNetworkReply;
class UpdateChecker : public QObject
@@ -42,7 +41,6 @@ private slots:
void fetchReadyRead();
private:
- QNetworkAccessManager* m_netMgr;
QNetworkReply* m_reply;
QByteArray m_bytesReceived;
bool m_isManuallyRequested;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 54670f2ac..288f64470 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -89,7 +89,7 @@ endmacro(add_unit_test)
set(TEST_LIBRARIES
keepassx_core
- ${keepasshttp_LIB}
+ ${keepassxcbrowser_LIB}
${autotype_LIB}
Qt5::Core
Qt5::Concurrent
@@ -159,6 +159,9 @@ add_unit_test(NAME testdeletedobjects SOURCES TestDeletedObjects.cpp
add_unit_test(NAME testkeepass1reader SOURCES TestKeePass1Reader.cpp
LIBS ${TEST_LIBRARIES})
+add_unit_test(NAME testopvaultreader SOURCES TestOpVaultReader.cpp
+ LIBS ${TEST_LIBRARIES})
+
add_unit_test(NAME testwildcardmatcher SOURCES TestWildcardMatcher.cpp
LIBS ${TEST_LIBRARIES})
@@ -187,6 +190,12 @@ add_unit_test(NAME testmerge SOURCES TestMerge.cpp
add_unit_test(NAME testpasswordgenerator SOURCES TestPasswordGenerator.cpp
LIBS ${TEST_LIBRARIES})
+add_unit_test(NAME testpassphrasegenerator SOURCES TestPassphraseGenerator.cpp
+ LIBS ${TEST_LIBRARIES})
+
+add_unit_test(NAME testhibp SOURCES TestHibp.cpp
+ LIBS ${TEST_LIBRARIES})
+
add_unit_test(NAME testtotp SOURCES TestTotp.cpp
LIBS ${TEST_LIBRARIES})
@@ -215,13 +224,18 @@ if(WITH_XC_KEESHARE)
endif()
add_unit_test(NAME testdatabase SOURCES TestDatabase.cpp
- LIBS ${TEST_LIBRARIES})
+ LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testtools SOURCES TestTools.cpp
LIBS ${TEST_LIBRARIES})
+if(WITH_XC_FDOSECRETS)
+ add_unit_test(NAME testfdosecrets SOURCES TestFdoSecrets.cpp
+ LIBS testsupport ${TEST_LIBRARIES})
+endif()
+
if(WITH_XC_BROWSER)
-add_unit_test(NAME testbrowser SOURCES TestBrowser.cpp
+ add_unit_test(NAME testbrowser SOURCES TestBrowser.cpp
LIBS ${TEST_LIBRARIES})
endif()
diff --git a/tests/TestBrowser.cpp b/tests/TestBrowser.cpp
index b2ec6d6dd..576b72c18 100644
--- a/tests/TestBrowser.cpp
+++ b/tests/TestBrowser.cpp
@@ -17,9 +17,9 @@
#include "TestBrowser.h"
#include "TestGlobal.h"
+#include "browser/BrowserSettings.h"
#include "crypto/Crypto.h"
#include "sodium/crypto_box.h"
-#include "browser/BrowserSettings.h"
#include <QString>
QTEST_GUILESS_MAIN(TestBrowser)
@@ -40,7 +40,6 @@ void TestBrowser::initTestCase()
void TestBrowser::cleanupTestCase()
{
-
}
/**
@@ -87,7 +86,7 @@ void TestBrowser::testDecryptMessage()
void TestBrowser::testGetBase64FromKey()
{
unsigned char pk[crypto_box_PUBLICKEYBYTES];
-
+
for (unsigned int i = 0; i < crypto_box_PUBLICKEYBYTES; ++i) {
pk[i] = i;
}
@@ -202,7 +201,7 @@ void TestBrowser::testSearchEntries()
}
browserSettings()->setMatchUrlScheme(false);
- auto result = m_browserService->searchEntries(db, "github.com", "https://github.com"); // db, hostname, url
+ auto result = m_browserService->searchEntries(db, "github.com", "https://github.com"); // db, hostname, url
QCOMPARE(result.length(), 7);
QCOMPARE(result[0]->url(), QString("https://github.com/login_page"));
QCOMPARE(result[1]->url(), QString("https://github.com/login"));
@@ -210,11 +209,11 @@ void TestBrowser::testSearchEntries()
QCOMPARE(result[3]->url(), QString("http://github.com"));
QCOMPARE(result[4]->url(), QString("http://github.com/login"));
QCOMPARE(result[5]->url(), QString("github.com"));
- QCOMPARE(result[6]->url(), QString("github.com")) ;
+ QCOMPARE(result[6]->url(), QString("github.com"));
// With matching there should be only 5 results
browserSettings()->setMatchUrlScheme(true);
- result = m_browserService->searchEntries(db, "github.com", "https://github.com"); // db, hostname, url
+ result = m_browserService->searchEntries(db, "github.com", "https://github.com"); // db, hostname, url
QCOMPARE(result.length(), 5);
QCOMPARE(result[0]->url(), QString("https://github.com/login_page"));
QCOMPARE(result[1]->url(), QString("https://github.com/login"));
@@ -241,11 +240,45 @@ void TestBrowser::testSearchEntriesWithPort()
entry->endUpdate();
}
- auto result = m_browserService->searchEntries(db, "127.0.0.1", "http://127.0.0.1:443"); // db, hostname, url
+ auto result = m_browserService->searchEntries(db, "127.0.0.1", "http://127.0.0.1:443"); // db, hostname, url
QCOMPARE(result.length(), 1);
QCOMPARE(result[0]->url(), QString("http://127.0.0.1:443"));
}
+void TestBrowser::testSearchEntriesWithAdditionalURLs()
+{
+ auto db = QSharedPointer<Database>::create();
+ auto* root = db->rootGroup();
+
+ QList<Entry*> entries;
+ QList<QString> urls;
+ urls.push_back("https://github.com/");
+ urls.push_back("https://www.example.com");
+ urls.push_back("http://domain.com");
+
+ for (int i = 0; i < urls.length(); ++i) {
+ auto entry = new Entry();
+ entry->setGroup(root);
+ entry->beginUpdate();
+ entry->setUrl(urls[i]);
+ entry->setUsername(QString("User %1").arg(i));
+ entry->endUpdate();
+ entries.push_back(entry);
+ }
+
+ // Add an additional URL to the first entry
+ entries.first()->attributes()->set(BrowserService::ADDITIONAL_URL, "https://keepassxc.org");
+
+ auto result = m_browserService->searchEntries(db, "github.com", "https://github.com"); // db, hostname, url
+ QCOMPARE(result.length(), 1);
+ QCOMPARE(result[0]->url(), QString("https://github.com/"));
+
+ // Search the additional URL. It should return the same entry
+ auto additionalResult = m_browserService->searchEntries(db, "keepassxc.org", "https://keepassxc.org");
+ QCOMPARE(additionalResult.length(), 1);
+ QCOMPARE(additionalResult[0]->url(), QString("https://github.com/"));
+}
+
void TestBrowser::testSortEntries()
{
auto db = QSharedPointer<Database>::create();
@@ -275,7 +308,8 @@ void TestBrowser::testSortEntries()
}
browserSettings()->setBestMatchOnly(false);
- auto result = m_browserService->sortEntries(entries, "github.com", "https://github.com/session"); // entries, host, submitUrl
+ auto result =
+ m_browserService->sortEntries(entries, "github.com", "https://github.com/session"); // entries, host, submitUrl
QCOMPARE(result.size(), 10);
QCOMPARE(result[0]->username(), QString("User 2"));
QCOMPARE(result[0]->url(), QString("https://github.com/"));
@@ -318,7 +352,7 @@ void TestBrowser::testGetDatabaseGroups()
auto result = m_browserService->getDatabaseGroups(db);
QCOMPARE(result.length(), 1);
-
+
auto groups = result["groups"].toArray();
auto first = groups.at(0);
auto children = first.toObject()["children"].toArray();
@@ -341,4 +375,4 @@ void TestBrowser::testGetDatabaseGroups()
auto lastChildren = firstOfCOS.toObject()["children"].toArray();
auto lastChild = lastChildren.at(0);
QCOMPARE(lastChild.toObject()["name"].toString(), QString("group2_1_1"));
- }
+}
diff --git a/tests/TestBrowser.h b/tests/TestBrowser.h
index 0b939b077..0eed0d23f 100644
--- a/tests/TestBrowser.h
+++ b/tests/TestBrowser.h
@@ -42,6 +42,7 @@ private slots:
void testSortPriority();
void testSearchEntries();
void testSearchEntriesWithPort();
+ void testSearchEntriesWithAdditionalURLs();
void testSortEntries();
void testGetDatabaseGroups();
diff --git a/tests/TestCli.cpp b/tests/TestCli.cpp
index 9574f6d32..586c39be1 100644
--- a/tests/TestCli.cpp
+++ b/tests/TestCli.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -32,18 +32,25 @@
#include "format/KeePass2.h"
#include "cli/Add.h"
+#include "cli/AddGroup.h"
+#include "cli/Analyze.h"
#include "cli/Clip.h"
#include "cli/Command.h"
#include "cli/Create.h"
#include "cli/Diceware.h"
#include "cli/Edit.h"
#include "cli/Estimate.h"
-#include "cli/Extract.h"
+#include "cli/Export.h"
#include "cli/Generate.h"
+#include "cli/Help.h"
+#include "cli/Import.h"
#include "cli/List.h"
#include "cli/Locate.h"
#include "cli/Merge.h"
+#include "cli/Move.h"
+#include "cli/Open.h"
#include "cli/Remove.h"
+#include "cli/RemoveGroup.h"
#include "cli/Show.h"
#include "cli/Utils.h"
@@ -51,12 +58,15 @@
#include <QFile>
#include <QFuture>
#include <QSet>
+#include <QTextStream>
#include <QtConcurrent>
#include <cstdio>
QTEST_MAIN(TestCli)
+QSharedPointer<Database> globalCurrentDatabase;
+
void TestCli::initTestCase()
{
QVERIFY(Crypto::init());
@@ -87,6 +97,17 @@ void TestCli::initTestCase()
QVERIFY(sourceDbFile4.open(QIODevice::ReadOnly));
QVERIFY(Tools::readAllFromDevice(&sourceDbFile4, m_keyFileProtectedNoPasswordDbData));
sourceDbFile4.close();
+
+ QFile sourceDbFileYubiKeyProtected(QString(KEEPASSX_TEST_DATA_DIR).append("/YubiKeyProtectedPasswords.kdbx"));
+ QVERIFY(sourceDbFileYubiKeyProtected.open(QIODevice::ReadOnly));
+ QVERIFY(Tools::readAllFromDevice(&sourceDbFileYubiKeyProtected, m_yubiKeyProtectedDbData));
+ sourceDbFileYubiKeyProtected.close();
+
+ // Load the NewDatabase.xml file into temporary storage
+ QFile sourceXmlFile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"));
+ QVERIFY(sourceXmlFile.open(QIODevice::ReadOnly));
+ QVERIFY(Tools::readAllFromDevice(&sourceXmlFile, m_xmlData));
+ sourceXmlFile.close();
}
void TestCli::init()
@@ -101,6 +122,11 @@ void TestCli::init()
m_dbFile2->write(m_dbData2);
m_dbFile2->close();
+ m_xmlFile.reset(new TemporaryFile());
+ m_xmlFile->open();
+ m_xmlFile->write(m_xmlData);
+ m_xmlFile->close();
+
m_keyFileProtectedDbFile.reset(new TemporaryFile());
m_keyFileProtectedDbFile->open();
m_keyFileProtectedDbFile->write(m_keyFileProtectedDbData);
@@ -111,38 +137,39 @@ void TestCli::init()
m_keyFileProtectedNoPasswordDbFile->write(m_keyFileProtectedNoPasswordDbData);
m_keyFileProtectedNoPasswordDbFile->close();
+ m_yubiKeyProtectedDbFile.reset(new TemporaryFile());
+ m_yubiKeyProtectedDbFile->open();
+ m_yubiKeyProtectedDbFile->write(m_yubiKeyProtectedDbData);
+ m_yubiKeyProtectedDbFile->close();
+
m_stdinFile.reset(new TemporaryFile());
m_stdinFile->open();
- m_stdinHandle = fdopen(m_stdinFile->handle(), "r+");
- Utils::STDIN = m_stdinHandle;
+ Utils::STDIN = fdopen(m_stdinFile->handle(), "r+");
m_stdoutFile.reset(new TemporaryFile());
m_stdoutFile->open();
- m_stdoutHandle = fdopen(m_stdoutFile->handle(), "r+");
- Utils::STDOUT = m_stdoutHandle;
+ Utils::STDOUT = fdopen(m_stdoutFile->handle(), "r+");
m_stderrFile.reset(new TemporaryFile());
m_stderrFile->open();
- m_stderrHandle = fdopen(m_stderrFile->handle(), "r+");
- Utils::STDERR = m_stderrHandle;
+ Utils::STDERR = fdopen(m_stderrFile->handle(), "r+");
}
void TestCli::cleanup()
{
m_dbFile.reset();
-
m_dbFile2.reset();
+ m_keyFileProtectedDbFile.reset();
+ m_keyFileProtectedNoPasswordDbFile.reset();
+ m_yubiKeyProtectedDbFile.reset();
m_stdinFile.reset();
- m_stdinHandle = stdin;
Utils::STDIN = stdin;
m_stdoutFile.reset();
Utils::STDOUT = stdout;
- m_stdoutHandle = stdout;
m_stderrFile.reset();
- m_stderrHandle = stderr;
Utils::STDERR = stderr;
}
@@ -153,28 +180,65 @@ void TestCli::cleanupTestCase()
QSharedPointer<Database> TestCli::readTestDatabase() const
{
Utils::Test::setNextPassword("a");
- auto db = QSharedPointer<Database>(Utils::unlockDatabase(m_dbFile->fileName(), true, "", m_stdoutHandle));
- m_stdoutFile->seek(ftell(m_stdoutHandle)); // re-synchronize handles
+ auto db = QSharedPointer<Database>(Utils::unlockDatabase(m_dbFile->fileName(), true, "", "", Utils::STDOUT));
+ m_stdoutFile->seek(ftell(Utils::STDOUT)); // re-synchronize handles
return db;
}
-void TestCli::testCommand()
+void TestCli::testBatchCommands()
{
- QCOMPARE(Command::getCommands().size(), 13);
- QVERIFY(Command::getCommand("add"));
- QVERIFY(Command::getCommand("clip"));
- QVERIFY(Command::getCommand("create"));
- QVERIFY(Command::getCommand("diceware"));
- QVERIFY(Command::getCommand("edit"));
- QVERIFY(Command::getCommand("estimate"));
- QVERIFY(Command::getCommand("extract"));
- QVERIFY(Command::getCommand("generate"));
- QVERIFY(Command::getCommand("locate"));
- QVERIFY(Command::getCommand("ls"));
- QVERIFY(Command::getCommand("merge"));
- QVERIFY(Command::getCommand("rm"));
- QVERIFY(Command::getCommand("show"));
- QVERIFY(!Command::getCommand("doesnotexist"));
+ Commands::setupCommands(false);
+ QVERIFY(Commands::getCommand("add"));
+ QVERIFY(Commands::getCommand("analyze"));
+ QVERIFY(Commands::getCommand("clip"));
+ QVERIFY(Commands::getCommand("close"));
+ QVERIFY(Commands::getCommand("create"));
+ QVERIFY(Commands::getCommand("diceware"));
+ QVERIFY(Commands::getCommand("edit"));
+ QVERIFY(Commands::getCommand("estimate"));
+ QVERIFY(Commands::getCommand("export"));
+ QVERIFY(Commands::getCommand("generate"));
+ QVERIFY(Commands::getCommand("help"));
+ QVERIFY(Commands::getCommand("import"));
+ QVERIFY(Commands::getCommand("locate"));
+ QVERIFY(Commands::getCommand("ls"));
+ QVERIFY(Commands::getCommand("merge"));
+ QVERIFY(Commands::getCommand("mkdir"));
+ QVERIFY(Commands::getCommand("mv"));
+ QVERIFY(Commands::getCommand("open"));
+ QVERIFY(Commands::getCommand("rm"));
+ QVERIFY(Commands::getCommand("rmdir"));
+ QVERIFY(Commands::getCommand("show"));
+ QVERIFY(!Commands::getCommand("doesnotexist"));
+ QCOMPARE(Commands::getCommands().size(), 21);
+}
+
+void TestCli::testInteractiveCommands()
+{
+ Commands::setupCommands(true);
+ QVERIFY(Commands::getCommand("add"));
+ QVERIFY(Commands::getCommand("analyze"));
+ QVERIFY(Commands::getCommand("clip"));
+ QVERIFY(Commands::getCommand("close"));
+ QVERIFY(Commands::getCommand("create"));
+ QVERIFY(Commands::getCommand("diceware"));
+ QVERIFY(Commands::getCommand("edit"));
+ QVERIFY(Commands::getCommand("estimate"));
+ QVERIFY(Commands::getCommand("exit"));
+ QVERIFY(Commands::getCommand("generate"));
+ QVERIFY(Commands::getCommand("help"));
+ QVERIFY(Commands::getCommand("locate"));
+ QVERIFY(Commands::getCommand("ls"));
+ QVERIFY(Commands::getCommand("merge"));
+ QVERIFY(Commands::getCommand("mkdir"));
+ QVERIFY(Commands::getCommand("mv"));
+ QVERIFY(Commands::getCommand("open"));
+ QVERIFY(Commands::getCommand("quit"));
+ QVERIFY(Commands::getCommand("rm"));
+ QVERIFY(Commands::getCommand("rmdir"));
+ QVERIFY(Commands::getCommand("show"));
+ QVERIFY(!Commands::getCommand("doesnotexist"));
+ QCOMPARE(Commands::getCommands().size(), 21);
}
void TestCli::testAdd()
@@ -190,13 +254,14 @@ void TestCli::testAdd()
"--url",
"https://example.com/",
"-g",
- "-l",
+ "-L",
"20",
m_dbFile->fileName(),
"/newuser-entry"});
m_stderrFile->reset();
m_stdoutFile->reset();
m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully added entry newuser-entry.\n"));
auto db = readTestDatabase();
@@ -208,34 +273,154 @@ void TestCli::testAdd()
// Quiet option
qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
- addCmd.execute({"add", "-q", "-u", "newuser", "-g", "-l", "20", m_dbFile->fileName(), "/newentry-quiet"});
+ addCmd.execute({"add", "-q", "-u", "newuser", "-g", "-L", "20", m_dbFile->fileName(), "/newentry-quiet"});
m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
db = readTestDatabase();
entry = db->rootGroup()->findEntryByPath("/newentry-quiet");
QVERIFY(entry);
+ QCOMPARE(entry->password().size(), 20);
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
Utils::Test::setNextPassword("newpassword");
+ addCmd.execute(
+ {"add", "-u", "newuser2", "--url", "https://example.net/", "-p", m_dbFile->fileName(), "/newuser-entry2"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stdoutFile->readLine(); // skip password input
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully added entry newuser-entry2.\n"));
+
+ db = readTestDatabase();
+ entry = db->rootGroup()->findEntryByPath("/newuser-entry2");
+ QVERIFY(entry);
+ QCOMPARE(entry->username(), QString("newuser2"));
+ QCOMPARE(entry->url(), QString("https://example.net/"));
+ QCOMPARE(entry->password(), QString("newpassword"));
+
+ // Password generation options
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ addCmd.execute({"add", "-u", "newuser3", "-g", "-L", "34", m_dbFile->fileName(), "/newuser-entry3"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully added entry newuser-entry3.\n"));
+
+ db = readTestDatabase();
+ entry = db->rootGroup()->findEntryByPath("/newuser-entry3");
+ QVERIFY(entry);
+ QCOMPARE(entry->username(), QString("newuser3"));
+ QCOMPARE(entry->password().size(), 34);
+ QRegularExpression defaultPasswordClassesRegex("^[a-zA-Z0-9]+$");
+ QVERIFY(defaultPasswordClassesRegex.match(entry->password()).hasMatch());
+
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
addCmd.execute({"add",
"-u",
- "newuser2",
- "--url",
- "https://example.net/",
+ "newuser4",
"-g",
- "-l",
+ "-L",
"20",
- "-p",
+ "--every-group",
+ "-s",
+ "-n",
+ "-U",
+ "-l",
m_dbFile->fileName(),
- "/newuser-entry2"});
+ "/newuser-entry4"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully added entry newuser-entry4.\n"));
db = readTestDatabase();
- entry = db->rootGroup()->findEntryByPath("/newuser-entry2");
+ entry = db->rootGroup()->findEntryByPath("/newuser-entry4");
QVERIFY(entry);
- QCOMPARE(entry->username(), QString("newuser2"));
- QCOMPARE(entry->url(), QString("https://example.net/"));
- QCOMPARE(entry->password(), QString("newpassword"));
+ QCOMPARE(entry->username(), QString("newuser4"));
+ QCOMPARE(entry->password().size(), 20);
+ QVERIFY(!defaultPasswordClassesRegex.match(entry->password()).hasMatch());
+}
+
+void TestCli::testAddGroup()
+{
+ AddGroup addGroupCmd;
+ QVERIFY(!addGroupCmd.name.isEmpty());
+ QVERIFY(addGroupCmd.getDescriptionLine().contains(addGroupCmd.name));
+
+ Utils::Test::setNextPassword("a");
+ addGroupCmd.execute({"mkdir", m_dbFile->fileName(), "/new_group"});
+ m_stderrFile->reset();
+ m_stdoutFile->reset();
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully added group new_group.\n"));
+
+ auto db = readTestDatabase();
+ auto* group = db->rootGroup()->findGroupByPath("new_group");
+ QVERIFY(group);
+ QCOMPARE(group->name(), QString("new_group"));
+
+ // Trying to add the same group should fail.
+ qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ addGroupCmd.execute({"mkdir", m_dbFile->fileName(), "/new_group"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Group /new_group already exists!\n"));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+
+ // Should be able to add groups down the tree.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ addGroupCmd.execute({"mkdir", m_dbFile->fileName(), "/new_group/newer_group"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully added group newer_group.\n"));
+
+ db = readTestDatabase();
+ group = db->rootGroup()->findGroupByPath("new_group/newer_group");
+ QVERIFY(group);
+ QCOMPARE(group->name(), QString("newer_group"));
+
+ // Should fail if the path is invalid.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ addGroupCmd.execute({"mkdir", m_dbFile->fileName(), "/invalid_group/newer_group"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Group /invalid_group not found.\n"));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+
+ // Should fail to add the root group.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ addGroupCmd.execute({"mkdir", m_dbFile->fileName(), "/"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Group / already exists!\n"));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
}
bool isTOTP(const QString& value)
@@ -252,6 +437,22 @@ bool isTOTP(const QString& value)
return true;
}
+void TestCli::testAnalyze()
+{
+ Analyze analyzeCmd;
+ QVERIFY(!analyzeCmd.name.isEmpty());
+ QVERIFY(analyzeCmd.getDescriptionLine().contains(analyzeCmd.name));
+
+ const QString hibpPath = QString(KEEPASSX_TEST_DATA_DIR).append("/hibp.txt");
+
+ Utils::Test::setNextPassword("a");
+ analyzeCmd.execute({"analyze", "--hibp", hibpPath, m_dbFile->fileName()});
+ m_stdoutFile->reset();
+ m_stdoutFile->readLine(); // skip password prompt
+ auto output = m_stdoutFile->readAll();
+ QVERIFY(output.contains("Sample Entry") && output.contains("123"));
+}
+
void TestCli::testClip()
{
QClipboard* clipboard = QGuiApplication::clipboard();
@@ -296,7 +497,9 @@ void TestCli::testClip()
// Password with timeout
Utils::Test::setNextPassword("a");
// clang-format off
- QFuture<void> future = QtConcurrent::run(&clipCmd, &Clip::execute, QStringList{"clip", m_dbFile->fileName(), "/Sample Entry", "1"});
+ QFuture<void> future = QtConcurrent::run(&clipCmd,
+ static_cast<int(Clip::*)(const QStringList&)>(&DatabaseCommand::execute),
+ QStringList{"clip", m_dbFile->fileName(), "/Sample Entry", "1"});
// clang-format on
QTRY_COMPARE_WITH_TIMEOUT(clipboard->text(), QString("Password"), 500);
@@ -306,8 +509,9 @@ void TestCli::testClip()
// TOTP with timeout
Utils::Test::setNextPassword("a");
- future = QtConcurrent::run(
- &clipCmd, &Clip::execute, QStringList{"clip", m_dbFile->fileName(), "/Sample Entry", "1", "-t"});
+ future = QtConcurrent::run(&clipCmd,
+ static_cast<int (Clip::*)(const QStringList&)>(&DatabaseCommand::execute),
+ QStringList{"clip", m_dbFile->fileName(), "/Sample Entry", "1", "-t"});
QTRY_VERIFY_WITH_TIMEOUT(isTOTP(clipboard->text()), 500);
QTRY_COMPARE_WITH_TIMEOUT(clipboard->text(), QString(""), 1500);
@@ -316,6 +520,18 @@ void TestCli::testClip()
qint64 posErr = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
+ clipCmd.execute({"clip", m_dbFile->fileName(), "--totp", "/Sample Entry", "0"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Invalid timeout value 0.\n"));
+
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ clipCmd.execute({"clip", m_dbFile->fileName(), "--totp", "/Sample Entry", "bleuh"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Invalid timeout value bleuh.\n"));
+
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
clipCmd.execute({"clip", m_dbFile2->fileName(), "--totp", "/Sample Entry"});
m_stderrFile->seek(posErr);
QCOMPARE(m_stderrFile->readAll(), QByteArray("Entry with path /Sample Entry has no TOTP set up.\n"));
@@ -329,7 +545,7 @@ void TestCli::testCreate()
QScopedPointer<QTemporaryDir> testDir(new QTemporaryDir());
- QString databaseFilename = testDir->path() + "testCreate1.kdbx";
+ QString databaseFilename = testDir->path() + "/testCreate1.kdbx";
// Password
Utils::Test::setNextPassword("a");
createCmd.execute({"create", databaseFilename});
@@ -337,12 +553,11 @@ void TestCli::testCreate()
m_stderrFile->reset();
m_stdoutFile->reset();
- QCOMPARE(m_stdoutFile->readLine(),
- QByteArray("Insert password to encrypt database (Press enter to leave blank): \n"));
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray("Enter password to encrypt database (optional): \n"));
QCOMPARE(m_stdoutFile->readLine(), QByteArray("Successfully created new database.\n"));
Utils::Test::setNextPassword("a");
- auto db = QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename, true, "", Utils::DEVNULL));
+ auto db = QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename, true, "", "", Utils::DEVNULL));
QVERIFY(db);
// Should refuse to create the database if it already exists.
@@ -357,8 +572,8 @@ void TestCli::testCreate()
QCOMPARE(m_stderrFile->readAll(), errorMessage.toUtf8());
// Testing with keyfile creation
- QString databaseFilename2 = testDir->path() + "testCreate2.kdbx";
- QString keyfilePath = testDir->path() + "keyfile.txt";
+ QString databaseFilename2 = testDir->path() + "/testCreate2.kdbx";
+ QString keyfilePath = testDir->path() + "/keyfile.txt";
pos = m_stdoutFile->pos();
errPos = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
@@ -366,16 +581,16 @@ void TestCli::testCreate()
m_stdoutFile->seek(pos);
m_stderrFile->seek(errPos);
- QCOMPARE(m_stdoutFile->readLine(),
- QByteArray("Insert password to encrypt database (Press enter to leave blank): \n"));
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray("Enter password to encrypt database (optional): \n"));
QCOMPARE(m_stdoutFile->readLine(), QByteArray("Successfully created new database.\n"));
Utils::Test::setNextPassword("a");
- auto db2 = QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename2, true, keyfilePath, Utils::DEVNULL));
+ auto db2 =
+ QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename2, true, keyfilePath, "", Utils::DEVNULL));
QVERIFY(db2);
// Testing with existing keyfile
- QString databaseFilename3 = testDir->path() + "testCreate3.kdbx";
+ QString databaseFilename3 = testDir->path() + "/testCreate3.kdbx";
pos = m_stdoutFile->pos();
errPos = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
@@ -383,12 +598,12 @@ void TestCli::testCreate()
m_stdoutFile->seek(pos);
m_stderrFile->seek(errPos);
- QCOMPARE(m_stdoutFile->readLine(),
- QByteArray("Insert password to encrypt database (Press enter to leave blank): \n"));
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray("Enter password to encrypt database (optional): \n"));
QCOMPARE(m_stdoutFile->readLine(), QByteArray("Successfully created new database.\n"));
Utils::Test::setNextPassword("a");
- auto db3 = QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename3, true, keyfilePath, Utils::DEVNULL));
+ auto db3 =
+ QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename3, true, keyfilePath, "", Utils::DEVNULL));
QVERIFY(db3);
}
@@ -414,6 +629,18 @@ void TestCli::testDiceware()
passphrase = m_stdoutFile->readLine();
QCOMPARE(passphrase.split(" ").size(), 10);
+ // Testing with invalid word count
+ auto posErr = m_stderrFile->pos();
+ dicewareCmd.execute({"diceware", "-W", "-10"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Invalid word count -10\n"));
+
+ // Testing with invalid word count format
+ posErr = m_stderrFile->pos();
+ dicewareCmd.execute({"diceware", "-W", "bleuh"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Invalid word count bleuh\n"));
+
TemporaryFile wordFile;
wordFile.open();
for (int i = 0; i < 4500; ++i) {
@@ -431,6 +658,18 @@ void TestCli::testDiceware()
for (const auto& word : words) {
QVERIFY2(regex.match(word).hasMatch(), qPrintable("Word " + word + " was not on the word list"));
}
+
+ TemporaryFile smallWordFile;
+ smallWordFile.open();
+ for (int i = 0; i < 50; ++i) {
+ smallWordFile.write(QString("word" + QString::number(i) + "\n").toLatin1());
+ }
+ smallWordFile.close();
+
+ posErr = m_stderrFile->pos();
+ dicewareCmd.execute({"diceware", "-W", "11", "-w", smallWordFile.fileName()});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("The word list is too small (< 1000 items)\n"));
}
void TestCli::testEdit()
@@ -456,15 +695,18 @@ void TestCli::testEdit()
// Quiet option
qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
- editCmd.execute({"edit", m_dbFile->fileName(), "-q", "-t", "newtitle", "/Sample Entry"});
+ editCmd.execute({"edit", m_dbFile->fileName(), "-q", "-t", "newertitle", "/newtitle"});
m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
Utils::Test::setNextPassword("a");
- editCmd.execute({"edit", "-g", m_dbFile->fileName(), "/newtitle"});
+ editCmd.execute({"edit", "-g", m_dbFile->fileName(), "/newertitle"});
db = readTestDatabase();
- entry = db->rootGroup()->findEntryByPath("/newtitle");
+ entry = db->rootGroup()->findEntryByPath("/newertitle");
QVERIFY(entry);
QCOMPARE(entry->username(), QString("newuser"));
QCOMPARE(entry->url(), QString("https://otherurl.example.com/"));
@@ -472,20 +714,48 @@ void TestCli::testEdit()
QVERIFY(entry->password() != QString("Password"));
Utils::Test::setNextPassword("a");
- editCmd.execute({"edit", "-g", "-l", "34", "-t", "yet another title", m_dbFile->fileName(), "/newtitle"});
+ editCmd.execute({"edit", "-g", "-L", "34", "-t", "evennewertitle", m_dbFile->fileName(), "/newertitle"});
db = readTestDatabase();
- entry = db->rootGroup()->findEntryByPath("/yet another title");
+ entry = db->rootGroup()->findEntryByPath("/evennewertitle");
QVERIFY(entry);
QCOMPARE(entry->username(), QString("newuser"));
QCOMPARE(entry->url(), QString("https://otherurl.example.com/"));
QVERIFY(entry->password() != QString("Password"));
QCOMPARE(entry->password().size(), 34);
+ QRegularExpression defaultPasswordClassesRegex("^[a-zA-Z0-9]+$");
+ QVERIFY(defaultPasswordClassesRegex.match(entry->password()).hasMatch());
+
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ editCmd.execute({"edit",
+ "-g",
+ "-L",
+ "20",
+ "--every-group",
+ "-s",
+ "-n",
+ "--upper",
+ "-l",
+ m_dbFile->fileName(),
+ "/evennewertitle"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully edited entry evennewertitle.\n"));
+
+ db = readTestDatabase();
+ entry = db->rootGroup()->findEntryByPath("/evennewertitle");
+ QVERIFY(entry);
+ QCOMPARE(entry->password().size(), 20);
+ QVERIFY(!defaultPasswordClassesRegex.match(entry->password()).hasMatch());
Utils::Test::setNextPassword("a");
Utils::Test::setNextPassword("newpassword");
- editCmd.execute({"edit", "-p", m_dbFile->fileName(), "/yet another title"});
+ editCmd.execute({"edit", "-p", m_dbFile->fileName(), "/evennewertitle"});
db = readTestDatabase();
- entry = db->rootGroup()->findEntryByPath("/yet another title");
+ entry = db->rootGroup()->findEntryByPath("/evennewertitle");
QVERIFY(entry);
QCOMPARE(entry->password(), QString("newpassword"));
}
@@ -596,14 +866,14 @@ void TestCli::testEstimate()
}
}
-void TestCli::testExtract()
+void TestCli::testExport()
{
- Extract extractCmd;
- QVERIFY(!extractCmd.name.isEmpty());
- QVERIFY(extractCmd.getDescriptionLine().contains(extractCmd.name));
+ Export exportCmd;
+ QVERIFY(!exportCmd.name.isEmpty());
+ QVERIFY(exportCmd.getDescriptionLine().contains(exportCmd.name));
Utils::Test::setNextPassword("a");
- extractCmd.execute({"extract", m_dbFile->fileName()});
+ exportCmd.execute({"export", m_dbFile->fileName()});
m_stdoutFile->seek(0);
m_stdoutFile->readLine(); // skip prompt line
@@ -622,12 +892,41 @@ void TestCli::testExtract()
// Quiet option
QScopedPointer<Database> dbQuiet(new Database());
qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
- extractCmd.execute({"extract", "-q", m_dbFile->fileName()});
+ exportCmd.execute({"export", "-f", "xml", "-q", m_dbFile->fileName()});
m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
reader.readDatabase(m_stdoutFile.data(), dbQuiet.data());
QVERIFY(!reader.hasError());
QVERIFY(db.data());
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+
+ // CSV exporting
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ exportCmd.execute({"export", "-f", "csv", m_dbFile->fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip prompt line
+ m_stderrFile->seek(posErr);
+ QByteArray csvHeader = m_stdoutFile->readLine();
+ QCOMPARE(csvHeader, QByteArray("\"Group\",\"Title\",\"Username\",\"Password\",\"URL\",\"Notes\"\n"));
+ QByteArray csvData = m_stdoutFile->readAll();
+ QVERIFY(csvData.contains(QByteArray(
+ "\"NewDatabase\",\"Sample Entry\",\"User Name\",\"Password\",\"http://www.somesite.com/\",\"Notes\"\n")));
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+
+ // test invalid format
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ exportCmd.execute({"export", "-f", "yaml", m_dbFile->fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip prompt line
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Unsupported format yaml\n"));
}
void TestCli::testGenerate_data()
@@ -638,7 +937,7 @@ void TestCli::testGenerate_data()
QTest::newRow("default") << QStringList{"generate"} << "^[^\r\n]+$";
QTest::newRow("length") << QStringList{"generate", "-L", "13"} << "^.{13}$";
QTest::newRow("lowercase") << QStringList{"generate", "-L", "14", "-l"} << "^[a-z]{14}$";
- QTest::newRow("uppercase") << QStringList{"generate", "-L", "15", "-u"} << "^[A-Z]{15}$";
+ QTest::newRow("uppercase") << QStringList{"generate", "-L", "15", "--upper"} << "^[A-Z]{15}$";
QTest::newRow("numbers") << QStringList{"generate", "-L", "16", "-n"} << "^[0-9]{16}$";
QTest::newRow("special") << QStringList{"generate", "-L", "200", "-s"}
<< R"(^[\(\)\[\]\{\}\.\-*|\\,:;"'\/\_!+-<=>?#$%&^`@~]{200}$)";
@@ -647,13 +946,13 @@ void TestCli::testGenerate_data()
QTest::newRow("extended") << QStringList{"generate", "-L", "50", "-e"}
<< R"(^[^a-zA-Z0-9\(\)\[\]\{\}\.\-\*\|\\,:;"'\/\_!+-<=>?#$%&^`@~]{50}$)";
QTest::newRow("numbers + lowercase + uppercase")
- << QStringList{"generate", "-L", "16", "-n", "-u", "-l"} << "^[0-9a-zA-Z]{16}$";
+ << QStringList{"generate", "-L", "16", "-n", "--upper", "-l"} << "^[0-9a-zA-Z]{16}$";
QTest::newRow("numbers + lowercase + uppercase (exclude)")
- << QStringList{"generate", "-L", "500", "-n", "-u", "-l", "-x", "abcdefg0123@"} << "^[^abcdefg0123@]{500}$";
+ << QStringList{"generate", "-L", "500", "-n", "-U", "-l", "-x", "abcdefg0123@"} << "^[^abcdefg0123@]{500}$";
QTest::newRow("numbers + lowercase + uppercase (exclude similar)")
- << QStringList{"generate", "-L", "200", "-n", "-u", "-l", "--exclude-similar"} << "^[^l1IO0]{200}$";
+ << QStringList{"generate", "-L", "200", "-n", "-U", "-l", "--exclude-similar"} << "^[^l1IO0]{200}$";
QTest::newRow("uppercase + lowercase (every)")
- << QStringList{"generate", "-L", "2", "-u", "-l", "--every-group"} << "^[a-z][A-Z]|[A-Z][a-z]$";
+ << QStringList{"generate", "-L", "2", "--upper", "-l", "--every-group"} << "^[a-z][A-Z]|[A-Z][a-z]$";
QTest::newRow("numbers + lowercase (every)")
<< QStringList{"generate", "-L", "2", "-n", "-l", "--every-group"} << "^[a-z][0-9]|[0-9][a-z]$";
}
@@ -679,6 +978,75 @@ void TestCli::testGenerate()
QVERIFY2(regex.match(password).hasMatch(),
qPrintable("Password " + password + " does not match pattern " + pattern));
}
+
+ // Testing with invalid password length
+ auto posErr = m_stderrFile->pos();
+ generateCmd.execute({"generate", "-L", "-10"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Invalid password length -10\n"));
+
+ posErr = m_stderrFile->pos();
+ generateCmd.execute({"generate", "-L", "0"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Invalid password length 0\n"));
+
+ // Testing with invalid word count format
+ posErr = m_stderrFile->pos();
+ generateCmd.execute({"generate", "-L", "bleuh"});
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Invalid password length bleuh\n"));
+}
+
+void TestCli::testImport()
+{
+ Import importCmd;
+ QVERIFY(!importCmd.name.isEmpty());
+ QVERIFY(importCmd.getDescriptionLine().contains(importCmd.name));
+
+ QScopedPointer<QTemporaryDir> testDir(new QTemporaryDir());
+ QString databaseFilename = testDir->path() + "testImport1.kdbx";
+
+ Utils::Test::setNextPassword("a");
+ importCmd.execute({"import", m_xmlFile->fileName(), databaseFilename});
+
+ m_stderrFile->reset();
+ m_stdoutFile->reset();
+
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray("Enter password to encrypt database (optional): \n"));
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray("Successfully imported database.\n"));
+
+ Utils::Test::setNextPassword("a");
+ auto db = QSharedPointer<Database>(Utils::unlockDatabase(databaseFilename, true, "", "", Utils::DEVNULL));
+ QVERIFY(db);
+ auto* entry = db->rootGroup()->findEntryByPath("/Sample Entry 1");
+ QVERIFY(entry);
+ QCOMPARE(entry->username(), QString("User Name"));
+
+ // Should refuse to create the database if it already exists.
+ qint64 pos = m_stdoutFile->pos();
+ qint64 errPos = m_stderrFile->pos();
+ importCmd.execute({"import", m_xmlFile->fileName(), databaseFilename});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(errPos);
+ // Output should be empty when there is an error.
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+ QString errorMessage = QString("File " + databaseFilename + " already exists.\n");
+ QCOMPARE(m_stderrFile->readAll(), errorMessage.toUtf8());
+
+ // Quiet option
+ QScopedPointer<QTemporaryDir> testDirQuiet(new QTemporaryDir());
+ QString databaseFilenameQuiet = testDirQuiet->path() + "testImport2.kdbx";
+
+ pos = m_stdoutFile->pos();
+ Utils::Test::setNextPassword("a");
+ importCmd.execute({"import", "-q", m_xmlFile->fileName(), databaseFilenameQuiet});
+ m_stdoutFile->seek(pos);
+
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Enter password to encrypt database (optional): \n"));
+
+ Utils::Test::setNextPassword("a");
+ auto dbQuiet = QSharedPointer<Database>(Utils::unlockDatabase(databaseFilenameQuiet, true, "", "", Utils::DEVNULL));
+ QVERIFY(dbQuiet);
}
void TestCli::testKeyFileOption()
@@ -690,8 +1058,9 @@ void TestCli::testKeyFileOption()
listCmd.execute({"ls", "-k", keyFilePath, m_keyFileProtectedDbFile->fileName()});
m_stdoutFile->reset();
m_stdoutFile->readLine(); // skip password prompt
- QCOMPARE(m_stdoutFile->readAll(), QByteArray("entry1\n"
- "entry2\n"));
+ QCOMPARE(m_stdoutFile->readAll(),
+ QByteArray("entry1\n"
+ "entry2\n"));
// Should raise an error with no key file.
qint64 pos = m_stdoutFile->pos();
@@ -713,8 +1082,7 @@ void TestCli::testKeyFileOption()
m_stdoutFile->readLine(); // skip password prompt
m_stderrFile->seek(posErr);
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
- QCOMPARE(m_stderrFile->readAll().split(':').at(0),
- QByteArray("Failed to load key file invalidpath"));
+ QCOMPARE(m_stderrFile->readAll().split(':').at(0), QByteArray("Failed to load key file invalidpath"));
}
void TestCli::testNoPasswordOption()
@@ -724,8 +1092,9 @@ void TestCli::testNoPasswordOption()
QString keyFilePath(QString(KEEPASSX_TEST_DATA_DIR).append("/KeyFileProtectedNoPassword.key"));
listCmd.execute({"ls", "-k", keyFilePath, "--no-password", m_keyFileProtectedNoPasswordDbFile->fileName()});
m_stdoutFile->reset();
- QCOMPARE(m_stdoutFile->readAll(), QByteArray("entry1\n"
- "entry2\n"));
+ QCOMPARE(m_stdoutFile->readAll(),
+ QByteArray("entry1\n"
+ "entry2\n"));
// Should raise an error with no key file.
qint64 pos = m_stdoutFile->pos();
@@ -789,7 +1158,38 @@ void TestCli::testList()
"eMail/\n"
" [empty]\n"
"Homebanking/\n"
- " [empty]\n"));
+ " Subgroup/\n"
+ " Subgroup Entry\n"));
+
+ pos = m_stdoutFile->pos();
+ Utils::Test::setNextPassword("a");
+ listCmd.execute({"ls", "-R", "-f", m_dbFile->fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stdoutFile->readAll(),
+ QByteArray("Sample Entry\n"
+ "General/\n"
+ "General/[empty]\n"
+ "Windows/\n"
+ "Windows/[empty]\n"
+ "Network/\n"
+ "Network/[empty]\n"
+ "Internet/\n"
+ "Internet/[empty]\n"
+ "eMail/\n"
+ "eMail/[empty]\n"
+ "Homebanking/\n"
+ "Homebanking/Subgroup/\n"
+ "Homebanking/Subgroup/Subgroup Entry\n"));
+
+ pos = m_stdoutFile->pos();
+ Utils::Test::setNextPassword("a");
+ listCmd.execute({"ls", "-R", "-f", m_dbFile->fileName(), "/Homebanking"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stdoutFile->readAll(),
+ QByteArray("Subgroup/\n"
+ "Subgroup/Subgroup Entry\n"));
pos = m_stdoutFile->pos();
Utils::Test::setNextPassword("a");
@@ -863,7 +1263,8 @@ void TestCli::testLocate()
locateCmd.execute({"locate", tmpFile.fileName(), "Entry"});
m_stdoutFile->seek(pos);
m_stdoutFile->readLine(); // skip password prompt
- QCOMPARE(m_stdoutFile->readAll(), QByteArray("/Sample Entry\n/General/New Entry\n"));
+ QCOMPARE(m_stdoutFile->readAll(),
+ QByteArray("/Sample Entry\n/General/New Entry\n/Homebanking/Subgroup/Subgroup Entry\n"));
}
void TestCli::testMerge()
@@ -875,23 +1276,27 @@ void TestCli::testMerge()
Kdbx4Writer writer;
Kdbx4Reader reader;
- // load test database and save a copy
+ // load test database and save copies
auto db = readTestDatabase();
QVERIFY(db);
TemporaryFile targetFile1;
targetFile1.open();
writer.writeDatabase(&targetFile1, db.data());
targetFile1.close();
-
- // save another copy with a different password
TemporaryFile targetFile2;
targetFile2.open();
+ writer.writeDatabase(&targetFile2, db.data());
+ targetFile2.close();
+
+ // save another copy with a different password
+ TemporaryFile targetFile3;
+ targetFile3.open();
auto oldKey = db->key();
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("b"));
db->setKey(key);
- writer.writeDatabase(&targetFile2, db.data());
- targetFile2.close();
+ writer.writeDatabase(&targetFile3, db.data());
+ targetFile3.close();
db->setKey(oldKey);
// then add a new entry to the in-memory database and save another copy
@@ -913,7 +1318,11 @@ void TestCli::testMerge()
m_stdoutFile->seek(pos);
m_stdoutFile->readLine();
m_stderrFile->reset();
- QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully merged the database files.\n"));
+ QList<QByteArray> outLines1 = m_stdoutFile->readAll().split('\n');
+ QCOMPARE(outLines1.at(0).split('[').at(0), QByteArray("\tOverwriting Internet "));
+ QCOMPARE(outLines1.at(1).split('[').at(0), QByteArray("\tCreating missing Some Website "));
+ QCOMPARE(outLines1.at(2),
+ QString("Successfully merged %1 into %2.").arg(sourceFile.fileName(), targetFile1.fileName()).toUtf8());
QFile readBack(targetFile1.fileName());
readBack.open(QIODevice::ReadOnly);
@@ -926,17 +1335,58 @@ void TestCli::testMerge()
QCOMPARE(entry1->title(), QString("Some Website"));
QCOMPARE(entry1->password(), QString("secretsecretsecret"));
+ // the dry run option should not modify the target database.
+ pos = m_stdoutFile->pos();
+ Utils::Test::setNextPassword("a");
+ mergeCmd.execute({"merge", "--dry-run", "-s", targetFile2.fileName(), sourceFile.fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine();
+ m_stderrFile->reset();
+ QList<QByteArray> outLines2 = m_stdoutFile->readAll().split('\n');
+ QCOMPARE(outLines2.at(0).split('[').at(0), QByteArray("\tOverwriting Internet "));
+ QCOMPARE(outLines2.at(1).split('[').at(0), QByteArray("\tCreating missing Some Website "));
+ QCOMPARE(outLines2.at(2), QByteArray("Database was not modified by merge operation."));
+
+ QFile readBack2(targetFile2.fileName());
+ readBack2.open(QIODevice::ReadOnly);
+ mergedDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&readBack2, oldKey, mergedDb.data());
+ readBack2.close();
+ QVERIFY(mergedDb);
+ entry1 = mergedDb->rootGroup()->findEntryByPath("/Internet/Some Website");
+ QVERIFY(!entry1);
+
+ // the dry run option can be used with the quiet option
+ pos = m_stdoutFile->pos();
+ Utils::Test::setNextPassword("a");
+ mergeCmd.execute({"merge", "--dry-run", "-s", "-q", targetFile2.fileName(), sourceFile.fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine();
+ m_stderrFile->reset();
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+
+ readBack2.setFileName(targetFile2.fileName());
+ readBack2.open(QIODevice::ReadOnly);
+ mergedDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&readBack2, oldKey, mergedDb.data());
+ readBack2.close();
+ QVERIFY(mergedDb);
+ entry1 = mergedDb->rootGroup()->findEntryByPath("/Internet/Some Website");
+ QVERIFY(!entry1);
+
// try again with different passwords for both files
pos = m_stdoutFile->pos();
Utils::Test::setNextPassword("b");
Utils::Test::setNextPassword("a");
- mergeCmd.execute({"merge", targetFile2.fileName(), sourceFile.fileName()});
+ mergeCmd.execute({"merge", targetFile3.fileName(), sourceFile.fileName()});
m_stdoutFile->seek(pos);
m_stdoutFile->readLine();
m_stdoutFile->readLine();
- QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully merged the database files.\n"));
+ QList<QByteArray> outLines3 = m_stdoutFile->readAll().split('\n');
+ QCOMPARE(outLines3.at(2),
+ QString("Successfully merged %1 into %2.").arg(sourceFile.fileName(), targetFile3.fileName()).toUtf8());
- readBack.setFileName(targetFile2.fileName());
+ readBack.setFileName(targetFile3.fileName());
readBack.open(QIODevice::ReadOnly);
mergedDb = QSharedPointer<Database>::create();
reader.readDatabase(&readBack, key, mergedDb.data());
@@ -972,6 +1422,63 @@ void TestCli::testMerge()
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
}
+void TestCli::testMove()
+{
+ Move moveCmd;
+ QVERIFY(!moveCmd.name.isEmpty());
+ QVERIFY(moveCmd.getDescriptionLine().contains(moveCmd.name));
+
+ qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ moveCmd.execute({"mv", m_dbFile->fileName(), "invalid_entry_path", "invalid_group_path"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip prompt line
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Could not find entry with path invalid_entry_path.\n"));
+
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ moveCmd.execute({"mv", m_dbFile->fileName(), "Sample Entry", "invalid_group_path"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip prompt line
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Could not find group with path invalid_group_path.\n"));
+
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ moveCmd.execute({"mv", m_dbFile->fileName(), "Sample Entry", "General/"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip prompt line
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray("Successfully moved entry Sample Entry to group General/.\n"));
+ QCOMPARE(m_stderrFile->readLine(), QByteArray(""));
+
+ auto db = readTestDatabase();
+ auto* entry = db->rootGroup()->findEntryByPath("General/Sample Entry");
+ QVERIFY(entry);
+
+ // Test that not modified if the same group is destination.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ moveCmd.execute({"mv", m_dbFile->fileName(), "General/Sample Entry", "General/"});
+ m_stdoutFile->seek(pos);
+ m_stderrFile->seek(posErr);
+ m_stdoutFile->readLine(); // skip prompt line
+ QCOMPARE(m_stdoutFile->readLine(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readLine(), QByteArray("Entry is already in group General/.\n"));
+
+ // sanity check
+ db = readTestDatabase();
+ entry = db->rootGroup()->findEntryByPath("General/Sample Entry");
+ QVERIFY(entry);
+}
+
void TestCli::testRemove()
{
Remove removeCmd;
@@ -991,6 +1498,7 @@ void TestCli::testRemove()
fileCopy.close();
qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
// delete entry and verify
Utils::Test::setNextPassword("a");
@@ -998,6 +1506,7 @@ void TestCli::testRemove()
m_stdoutFile->seek(pos);
m_stdoutFile->readLine(); // skip password prompt
QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully recycled entry Sample Entry.\n"));
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
@@ -1011,6 +1520,7 @@ void TestCli::testRemove()
QVERIFY(readBackDb->rootGroup()->findEntryByPath(QString("/%1/Sample Entry").arg(Group::tr("Recycle Bin"))));
pos = m_stdoutFile->pos();
+ pos = m_stdoutFile->pos();
// try again, this time without recycle bin
Utils::Test::setNextPassword("a");
@@ -1028,16 +1538,89 @@ void TestCli::testRemove()
QVERIFY(!readBackDb->rootGroup()->findEntryByPath("/Sample Entry"));
QVERIFY(!readBackDb->rootGroup()->findEntryByPath(QString("/%1/Sample Entry").arg(Group::tr("Recycle Bin"))));
- pos = m_stdoutFile->pos();
-
// finally, try deleting a non-existent entry
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
Utils::Test::setNextPassword("a");
removeCmd.execute({"rm", fileCopy.fileName(), "/Sample Entry"});
m_stdoutFile->seek(pos);
m_stdoutFile->readLine(); // skip password prompt
- m_stderrFile->reset();
+ m_stderrFile->seek(posErr);
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
QCOMPARE(m_stderrFile->readAll(), QByteArray("Entry /Sample Entry not found.\n"));
+
+ // try deleting a directory, should fail
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ removeCmd.execute({"rm", fileCopy.fileName(), "/General"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Entry /General not found.\n"));
+}
+
+void TestCli::testRemoveGroup()
+{
+ RemoveGroup removeGroupCmd;
+ QVERIFY(!removeGroupCmd.name.isEmpty());
+ QVERIFY(removeGroupCmd.getDescriptionLine().contains(removeGroupCmd.name));
+
+ Kdbx3Reader reader;
+ Kdbx3Writer writer;
+
+ // try deleting a directory, should recycle it first.
+ qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ removeGroupCmd.execute({"rmdir", m_dbFile->fileName(), "/General"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully recycled group /General.\n"));
+
+ auto db = readTestDatabase();
+ auto* group = db->rootGroup()->findGroupByPath("General");
+ QVERIFY(!group);
+
+ // try deleting a directory again, should delete it permanently.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ removeGroupCmd.execute({"rmdir", m_dbFile->fileName(), "Recycle Bin/General"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray("Successfully deleted group Recycle Bin/General.\n"));
+ QCOMPARE(m_stderrFile->readAll(), QByteArray(""));
+
+ db = readTestDatabase();
+ group = db->rootGroup()->findGroupByPath("Recycle Bin/General");
+ QVERIFY(!group);
+
+ // try deleting an invalid group, should fail.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ removeGroupCmd.execute({"rmdir", m_dbFile->fileName(), "invalid"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Group invalid not found.\n"));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+
+ // Should fail to remove the root group.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ removeGroupCmd.execute({"rmdir", m_dbFile->fileName(), "/"});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stderrFile->readAll(), QByteArray("Cannot remove root group from database.\n"));
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
}
void TestCli::testRemoveQuiet()
@@ -1164,3 +1747,196 @@ void TestCli::testShow()
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
QCOMPARE(m_stderrFile->readAll(), QByteArray("Entry with path /Sample Entry has no TOTP set up.\n"));
}
+
+void TestCli::testInvalidDbFiles()
+{
+ Show showCmd;
+ QString nonExistentDbPath("/foo/bar/baz");
+ QString directoryName("/");
+
+ qint64 pos = m_stderrFile->pos();
+ showCmd.execute({"show", nonExistentDbPath, "-q", "/Sample Entry"});
+ m_stderrFile->seek(pos);
+ QCOMPARE(QString(m_stderrFile->readAll()),
+ QObject::tr("Failed to open database file %1: not found").arg(nonExistentDbPath) + "\n");
+
+ pos = m_stderrFile->pos();
+ showCmd.execute({"show", directoryName, "-q", "whatever"});
+ m_stderrFile->seek(pos);
+ QCOMPARE(QString(m_stderrFile->readAll()),
+ QObject::tr("Failed to open database file %1: not a plain file").arg(directoryName) + "\n");
+
+ // Create a write-only file and try to open it.
+ // QFileInfo.isReadable returns 'true' on Windows, even after the call to
+ // setPermissions(WriteOwner) and with NTFS permissions enabled, so this
+ // check doesn't work.
+#if !defined(Q_OS_WIN)
+ QTemporaryFile tempFile;
+ QVERIFY(tempFile.open());
+ QString path = QFileInfo(tempFile).absoluteFilePath();
+ QVERIFY(tempFile.setPermissions(QFileDevice::WriteOwner));
+ pos = m_stderrFile->pos();
+ showCmd.execute({"show", path, "some entry"});
+ m_stderrFile->seek(pos);
+ QCOMPARE(QString(m_stderrFile->readAll()),
+ QObject::tr("Failed to open database file %1: not readable").arg(path) + "\n");
+#endif // Q_OS_WIN
+}
+
+/**
+ * Secret key for the YubiKey slot used by the unit test is
+ * 1c e3 0f d7 8d 20 dc fa 40 b5 0c 18 77 9a fb 0f 02 28 8d b7
+ * This secret should be configured at slot 2, and the slot
+ * should be configured as passive.
+ */
+void TestCli::testYubiKeyOption()
+{
+ if (!YubiKey::instance()->init()) {
+ QSKIP("Unable to connect to YubiKey");
+ }
+
+ QString errorMessage;
+ bool isBlocking = YubiKey::instance()->checkSlotIsBlocking(2, errorMessage);
+ if (isBlocking && errorMessage.isEmpty()) {
+ QSKIP("Skipping YubiKey in press mode.");
+ }
+
+ QByteArray challenge("CLITest");
+ QByteArray response;
+ YubiKey::instance()->challenge(2, false, challenge, response);
+ QByteArray expected("\xA2\x3B\x94\x00\xBE\x47\x9A\x30\xA9\xEB\x50\x9B\x85\x56\x5B\x6B\x30\x25\xB4\x8E", 20);
+ QVERIFY2(response == expected, "YubiKey Slot 2 is not configured with correct secret key.");
+
+ List listCmd;
+ Add addCmd;
+
+ Utils::Test::setNextPassword("a");
+ listCmd.execute({"ls", "-y", "2", m_yubiKeyProtectedDbFile->fileName()});
+ m_stdoutFile->reset();
+ m_stderrFile->reset();
+ m_stdoutFile->readLine(); // skip password prompt
+ QCOMPARE(m_stdoutFile->readAll(),
+ QByteArray("entry1\n"
+ "entry2\n"));
+
+ // Should raise an error with no yubikey slot.
+ qint64 pos = m_stdoutFile->pos();
+ qint64 posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ listCmd.execute({"ls", m_yubiKeyProtectedDbFile->fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readLine(),
+ QByteArray("Error while reading the database: Invalid credentials were provided, please try again.\n"));
+ QCOMPARE(m_stderrFile->readLine(),
+ QByteArray("If this reoccurs, then your database file may be corrupt. (HMAC mismatch)\n"));
+
+ // Should raise an error if yubikey slot is not a string
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ listCmd.execute({"ls", "-y", "invalidslot", m_yubiKeyProtectedDbFile->fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readAll().split(':').at(0), QByteArray("Invalid YubiKey slot invalidslot\n"));
+
+ // Should raise an error if yubikey slot is invalid.
+ pos = m_stdoutFile->pos();
+ posErr = m_stderrFile->pos();
+ Utils::Test::setNextPassword("a");
+ listCmd.execute({"ls", "-y", "3", m_yubiKeyProtectedDbFile->fileName()});
+ m_stdoutFile->seek(pos);
+ m_stdoutFile->readLine(); // skip password prompt
+ m_stderrFile->seek(posErr);
+ QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
+ QCOMPARE(m_stderrFile->readAll().split(':').at(0), QByteArray("Invalid YubiKey slot 3\n"));
+}
+
+namespace
+{
+
+ void expectParseResult(const QString& input, const QStringList& expectedOutput)
+ {
+ QStringList result = Utils::splitCommandString(input);
+ QCOMPARE(result.size(), expectedOutput.size());
+ for (int i = 0; i < expectedOutput.size(); ++i) {
+ QCOMPARE(result[i], expectedOutput[i]);
+ }
+ }
+
+} // namespace
+
+void TestCli::testCommandParsing_data()
+{
+ QTest::addColumn<QString>("input");
+ QTest::addColumn<QStringList>("expectedOutput");
+
+ QTest::newRow("basic") << "hello world" << QStringList({"hello", "world"});
+ QTest::newRow("basic escaping") << "hello\\ world" << QStringList({"hello world"});
+ QTest::newRow("quoted string") << "\"hello world\"" << QStringList({"hello world"});
+ QTest::newRow("multiple params") << "show Passwords/Internet" << QStringList({"show", "Passwords/Internet"});
+ QTest::newRow("quoted string inside param")
+ << R"(ls foo\ bar\ baz"quoted")" << QStringList({"ls", "foo bar baz\"quoted\""});
+ QTest::newRow("multiple whitespace") << "hello world" << QStringList({"hello", "world"});
+ QTest::newRow("single slash char") << "\\" << QStringList({"\\"});
+ QTest::newRow("double backslash entry name") << "show foo\\\\\\\\bar" << QStringList({"show", "foo\\\\bar"});
+}
+
+void TestCli::testCommandParsing()
+{
+ QFETCH(QString, input);
+ QFETCH(QStringList, expectedOutput);
+
+ expectParseResult(input, expectedOutput);
+}
+
+void TestCli::testOpen()
+{
+ Open o;
+
+ Utils::Test::setNextPassword("a");
+ o.execute({"open", m_dbFile->fileName()});
+ m_stdoutFile->reset();
+ QVERIFY(o.currentDatabase);
+
+ List l;
+ // Set a current database, simulating interactive mode.
+ l.currentDatabase = o.currentDatabase;
+ l.execute({"ls"});
+ m_stdoutFile->reset();
+ QByteArray expectedOutput("Sample Entry\n"
+ "General/\n"
+ "Windows/\n"
+ "Network/\n"
+ "Internet/\n"
+ "eMail/\n"
+ "Homebanking/\n");
+ QByteArray actualOutput = m_stdoutFile->readAll();
+ actualOutput.truncate(expectedOutput.length());
+ QCOMPARE(actualOutput, expectedOutput);
+}
+
+void TestCli::testHelp()
+{
+ Help h;
+ Commands::setupCommands(false);
+
+ {
+ h.execute({"help"});
+ m_stderrFile->reset();
+ QString output(m_stderrFile->readAll());
+ QVERIFY(output.contains(QObject::tr("Available commands")));
+ }
+
+ {
+ List l;
+ h.execute({"help", "ls"});
+ m_stderrFile->reset();
+ QString output(m_stderrFile->readAll());
+ QVERIFY(output.contains(l.description));
+ }
+}
diff --git a/tests/TestCli.h b/tests/TestCli.h
index cd8ebacfb..bd0f9fc3f 100644
--- a/tests/TestCli.h
+++ b/tests/TestCli.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
*
* 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
@@ -21,11 +21,14 @@
#include "core/Database.h"
#include "util/TemporaryFile.h"
+#include <QByteArray>
#include <QFile>
#include <QScopedPointer>
+#include <QSharedPointer>
#include <QTemporaryFile>
#include <QTest>
-#include <QTextStream>
+
+#include <stdio.h>
class TestCli : public QObject
{
@@ -40,41 +43,54 @@ private slots:
void cleanup();
void cleanupTestCase();
- void testCommand();
+ void testBatchCommands();
void testAdd();
+ void testAddGroup();
+ void testAnalyze();
void testClip();
+ void testCommandParsing_data();
+ void testCommandParsing();
void testCreate();
void testDiceware();
void testEdit();
void testEstimate_data();
void testEstimate();
- void testExtract();
+ void testExport();
void testGenerate_data();
void testGenerate();
+ void testImport();
void testKeyFileOption();
void testNoPasswordOption();
+ void testHelp();
+ void testInteractiveCommands();
void testList();
void testLocate();
void testMerge();
+ void testMove();
+ void testOpen();
void testRemove();
+ void testRemoveGroup();
void testRemoveQuiet();
void testShow();
+ void testInvalidDbFiles();
+ void testYubiKeyOption();
private:
QByteArray m_dbData;
QByteArray m_dbData2;
+ QByteArray m_xmlData;
+ QByteArray m_yubiKeyProtectedDbData;
QByteArray m_keyFileProtectedDbData;
QByteArray m_keyFileProtectedNoPasswordDbData;
QScopedPointer<TemporaryFile> m_dbFile;
QScopedPointer<TemporaryFile> m_dbFile2;
+ QScopedPointer<TemporaryFile> m_xmlFile;
QScopedPointer<TemporaryFile> m_keyFileProtectedDbFile;
QScopedPointer<TemporaryFile> m_keyFileProtectedNoPasswordDbFile;
+ QScopedPointer<TemporaryFile> m_yubiKeyProtectedDbFile;
QScopedPointer<TemporaryFile> m_stdoutFile;
QScopedPointer<TemporaryFile> m_stderrFile;
QScopedPointer<TemporaryFile> m_stdinFile;
- FILE* m_stdoutHandle = stdout;
- FILE* m_stderrHandle = stderr;
- FILE* m_stdinHandle = stdin;
};
#endif // KEEPASSXC_TESTCLI_H
diff --git a/tests/TestDatabase.cpp b/tests/TestDatabase.cpp
index 94e3c8ba7..c3a3a8c42 100644
--- a/tests/TestDatabase.cpp
+++ b/tests/TestDatabase.cpp
@@ -20,21 +20,117 @@
#include "TestGlobal.h"
#include <QSignalSpy>
-#include <QTemporaryFile>
#include "config-keepassx-tests.h"
#include "core/Metadata.h"
#include "crypto/Crypto.h"
#include "format/KeePass2Writer.h"
#include "keys/PasswordKey.h"
+#include "util/TemporaryFile.h"
QTEST_GUILESS_MAIN(TestDatabase)
+static QString dbFileName = QStringLiteral(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx");
+
void TestDatabase::initTestCase()
{
QVERIFY(Crypto::init());
}
+void TestDatabase::testOpen()
+{
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(!db->isInitialized());
+ QVERIFY(!db->isModified());
+
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create("a"));
+
+ bool ok = db->open(dbFileName, key);
+ QVERIFY(ok);
+
+ QVERIFY(db->isInitialized());
+ QVERIFY(!db->isModified());
+
+ db->metadata()->setName("test");
+ QVERIFY(db->isModified());
+}
+
+void TestDatabase::testSave()
+{
+ TemporaryFile tempFile;
+ QVERIFY(tempFile.copyFromFile(dbFileName));
+
+ auto db = QSharedPointer<Database>::create();
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create("a"));
+
+ QString error;
+ bool ok = db->open(tempFile.fileName(), key, &error);
+ QVERIFY(ok);
+
+ // Test safe saves
+ db->metadata()->setName("test");
+ QVERIFY(db->isModified());
+ QVERIFY2(db->save(&error), error.toLatin1());
+ QVERIFY(!db->isModified());
+
+ // Test unsafe saves
+ db->metadata()->setName("test2");
+ QVERIFY2(db->save(&error, false, false), error.toLatin1());
+ QVERIFY(!db->isModified());
+
+ // Test save backups
+ db->metadata()->setName("test3");
+ QVERIFY2(db->save(&error, true, true), error.toLatin1());
+ QVERIFY(!db->isModified());
+
+ // Confirm backup exists and then delete it
+ auto re = QRegularExpression("(\\.[^.]+)$");
+ auto match = re.match(tempFile.fileName());
+ auto backupFilePath = tempFile.fileName();
+ backupFilePath = backupFilePath.replace(re, "") + ".old" + match.captured(1);
+ QVERIFY(QFile::exists(backupFilePath));
+ QFile::remove(backupFilePath);
+ QVERIFY(!QFile::exists(backupFilePath));
+}
+
+void TestDatabase::testSignals()
+{
+ TemporaryFile tempFile;
+ QVERIFY(tempFile.copyFromFile(dbFileName));
+
+ auto db = QSharedPointer<Database>::create();
+ auto key = QSharedPointer<CompositeKey>::create();
+ key->addKey(QSharedPointer<PasswordKey>::create("a"));
+
+ QSignalSpy spyFilePathChanged(db.data(), SIGNAL(filePathChanged(const QString&, const QString&)));
+ QString error;
+ bool ok = db->open(tempFile.fileName(), key, &error);
+ QVERIFY(ok);
+ QCOMPARE(spyFilePathChanged.count(), 1);
+
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
+ db->metadata()->setName("test1");
+ QTRY_COMPARE(spyModified.count(), 1);
+
+ QSignalSpy spySaved(db.data(), SIGNAL(databaseSaved()));
+ QVERIFY(db->save(&error));
+ QCOMPARE(spySaved.count(), 1);
+
+ QSignalSpy spyFileChanged(db.data(), SIGNAL(databaseFileChanged()));
+ QVERIFY(tempFile.copyFromFile(dbFileName));
+ QTRY_COMPARE(spyFileChanged.count(), 1);
+ QTRY_VERIFY(!db->isModified());
+
+ db->metadata()->setName("test2");
+ QTRY_VERIFY(db->isModified());
+
+ QSignalSpy spyDiscarded(db.data(), SIGNAL(databaseDiscarded()));
+ QVERIFY(db->open(tempFile.fileName(), key, &error));
+ QCOMPARE(spyDiscarded.count(), 1);
+}
+
void TestDatabase::testEmptyRecycleBinOnDisabled()
{
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/RecycleBinDisabled.kdbx");
diff --git a/tests/TestDatabase.h b/tests/TestDatabase.h
index 46deb58aa..dc377ef05 100644
--- a/tests/TestDatabase.h
+++ b/tests/TestDatabase.h
@@ -27,6 +27,9 @@ class TestDatabase : public QObject
private slots:
void initTestCase();
+ void testOpen();
+ void testSave();
+ void testSignals();
void testEmptyRecycleBinOnDisabled();
void testEmptyRecycleBinOnNotCreated();
void testEmptyRecycleBinOnEmpty();
diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp
index c174e798d..39e4bd12c 100644
--- a/tests/TestEntry.cpp
+++ b/tests/TestEntry.cpp
@@ -21,6 +21,7 @@
#include "TestEntry.h"
#include "TestGlobal.h"
#include "core/Clock.h"
+#include "core/Metadata.h"
#include "crypto/Crypto.h"
QTEST_GUILESS_MAIN(TestEntry)
@@ -106,18 +107,43 @@ void TestEntry::testClone()
QCOMPARE(entryCloneNewUuid->historyItems().size(), 0);
QCOMPARE(entryCloneNewUuid->timeInfo().creationTime(), entryOrg->timeInfo().creationTime());
+ // Reset modification time
+ entryOrgTime.setLastModificationTime(Clock::datetimeUtc(60));
+ entryOrg->setTimeInfo(entryOrgTime);
+
+ QScopedPointer<Entry> entryCloneRename(entryOrg->clone(Entry::CloneRenameTitle));
+ QCOMPARE(entryCloneRename->uuid(), entryOrg->uuid());
+ QCOMPARE(entryCloneRename->title(), QString("New Title - Clone"));
+ // Cloning should not modify time info unless explicity requested
+ QCOMPARE(entryCloneRename->timeInfo(), entryOrg->timeInfo());
+
QScopedPointer<Entry> entryCloneResetTime(entryOrg->clone(Entry::CloneResetTimeInfo));
QCOMPARE(entryCloneResetTime->uuid(), entryOrg->uuid());
QCOMPARE(entryCloneResetTime->title(), QString("New Title"));
QCOMPARE(entryCloneResetTime->historyItems().size(), 0);
QVERIFY(entryCloneResetTime->timeInfo().creationTime() != entryOrg->timeInfo().creationTime());
- QScopedPointer<Entry> entryCloneHistory(entryOrg->clone(Entry::CloneIncludeHistory));
+ // Date back history of original entry
+ Entry* firstHistoryItem = entryOrg->historyItems()[0];
+ TimeInfo entryOrgHistoryTimeInfo = firstHistoryItem->timeInfo();
+ QDateTime datedBackEntryOrgModificationTime = entryOrgHistoryTimeInfo.lastModificationTime().addMSecs(-10);
+ entryOrgHistoryTimeInfo.setLastModificationTime(datedBackEntryOrgModificationTime);
+ entryOrgHistoryTimeInfo.setCreationTime(datedBackEntryOrgModificationTime);
+ firstHistoryItem->setTimeInfo(entryOrgHistoryTimeInfo);
+
+ QScopedPointer<Entry> entryCloneHistory(entryOrg->clone(Entry::CloneIncludeHistory | Entry::CloneResetTimeInfo));
QCOMPARE(entryCloneHistory->uuid(), entryOrg->uuid());
QCOMPARE(entryCloneHistory->title(), QString("New Title"));
- QCOMPARE(entryCloneHistory->historyItems().size(), 1);
+ QCOMPARE(entryCloneHistory->historyItems().size(), entryOrg->historyItems().size());
QCOMPARE(entryCloneHistory->historyItems().at(0)->title(), QString("Original Title"));
- QCOMPARE(entryCloneHistory->timeInfo().creationTime(), entryOrg->timeInfo().creationTime());
+ QVERIFY(entryCloneHistory->timeInfo().creationTime() != entryOrg->timeInfo().creationTime());
+ // Timeinfo of history items should not be modified
+ QList<Entry*> entryOrgHistory = entryOrg->historyItems(), clonedHistory = entryCloneHistory->historyItems();
+ auto entryOrgHistoryItem = entryOrgHistory.constBegin();
+ for (auto entryCloneHistoryItem = clonedHistory.constBegin(); entryCloneHistoryItem != clonedHistory.constEnd();
+ ++entryCloneHistoryItem, ++entryOrgHistoryItem) {
+ QCOMPARE((*entryOrgHistoryItem)->timeInfo(), (*entryCloneHistoryItem)->timeInfo());
+ }
Database db;
auto* entryOrgClone = entryOrg->clone(Entry::CloneNoFlags);
@@ -561,3 +587,28 @@ void TestEntry::testResolveClonedEntry()
QCOMPARE(cclone4->resolveMultiplePlaceholders(cclone4->username()), original->username());
QCOMPARE(cclone4->resolveMultiplePlaceholders(cclone4->password()), original->password());
}
+
+void TestEntry::testIsRecycled()
+{
+ Entry* entry = new Entry();
+ QVERIFY(!entry->isRecycled());
+
+ Database db;
+ Group* root = db.rootGroup();
+ QVERIFY(root);
+ entry->setGroup(root);
+ QVERIFY(!entry->isRecycled());
+
+ QVERIFY(db.metadata()->recycleBinEnabled());
+ db.recycleEntry(entry);
+ QVERIFY(entry->isRecycled());
+
+ Group* group1 = new Group();
+ group1->setParent(root);
+
+ Entry* entry1 = new Entry();
+ entry1->setGroup(group1);
+ QVERIFY(!entry1->isRecycled());
+ db.recycleGroup(group1);
+ QVERIFY(entry1->isRecycled());
+}
diff --git a/tests/TestEntry.h b/tests/TestEntry.h
index 7c2350861..ff0cfe07f 100644
--- a/tests/TestEntry.h
+++ b/tests/TestEntry.h
@@ -37,6 +37,7 @@ private slots:
void testResolveReferencePlaceholders();
void testResolveNonIdPlaceholdersToUuid();
void testResolveClonedEntry();
+ void testIsRecycled();
};
#endif // KEEPASSX_TESTENTRY_H
diff --git a/tests/TestEntrySearcher.cpp b/tests/TestEntrySearcher.cpp
index e949b97b8..7b129df17 100644
--- a/tests/TestEntrySearcher.cpp
+++ b/tests/TestEntrySearcher.cpp
@@ -96,7 +96,7 @@ void TestEntrySearcher::testSearch()
e3->setGroup(group3);
Entry* e3b = new Entry();
- e3b->setTitle("test search test");
+ e3b->setTitle("test search test 123");
e3b->setUsername("test@email.com");
e3b->setPassword("realpass");
e3b->setGroup(group3);
@@ -108,16 +108,31 @@ void TestEntrySearcher::testSearch()
m_searchResult = m_entrySearcher.search("search term", m_rootGroup);
QCOMPARE(m_searchResult.count(), 3);
+ m_searchResult = m_entrySearcher.search("123", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 2);
+
m_searchResult = m_entrySearcher.search("search term", group211);
QCOMPARE(m_searchResult.count(), 1);
// Test advanced search terms
+ m_searchResult = m_entrySearcher.search("title:123", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 1);
+
+ m_searchResult = m_entrySearcher.search("t:123", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 1);
+
m_searchResult = m_entrySearcher.search("password:testpass", m_rootGroup);
QCOMPARE(m_searchResult.count(), 1);
+ m_searchResult = m_entrySearcher.search("pw:testpass", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 1);
+
m_searchResult = m_entrySearcher.search("!user:email.com", m_rootGroup);
QCOMPARE(m_searchResult.count(), 5);
+ m_searchResult = m_entrySearcher.search("!u:email.com", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 5);
+
m_searchResult = m_entrySearcher.search("*user:\".*@.*\\.com\"", m_rootGroup);
QCOMPARE(m_searchResult.count(), 1);
@@ -210,4 +225,40 @@ void TestEntrySearcher::testSearchTermParser()
QCOMPARE(terms[1]->field, EntrySearcher::Field::Username);
QCOMPARE(terms[1]->regex.pattern(), QString("\\d+\\w{2}"));
+
+ // Test custom attribute search terms
+ m_entrySearcher.parseSearchTerms("+_abc:efg _def:\"ddd\"");
+ terms = m_entrySearcher.m_searchTerms;
+
+ QCOMPARE(terms.length(), 2);
+
+ QCOMPARE(terms[0]->field, EntrySearcher::Field::AttributeValue);
+ QCOMPARE(terms[0]->word, QString("abc"));
+ QCOMPARE(terms[0]->regex.pattern(), QString("^efg$"));
+
+ QCOMPARE(terms[1]->field, EntrySearcher::Field::AttributeValue);
+ QCOMPARE(terms[1]->word, QString("def"));
+ QCOMPARE(terms[1]->regex.pattern(), QString("ddd"));
+}
+
+void TestEntrySearcher::testCustomAttributesAreSearched()
+{
+ QScopedPointer<Entry> e1(new Entry());
+ e1->setGroup(m_rootGroup);
+
+ e1->attributes()->set("testAttribute", "testE1");
+ e1->attributes()->set("testProtected", "testP", true);
+
+ QScopedPointer<Entry> e2(new Entry());
+ e2->setGroup(m_rootGroup);
+ e2->attributes()->set("testAttribute", "testE2");
+ e2->attributes()->set("testProtected", "testP2", true);
+
+ // search for custom entries
+ m_searchResult = m_entrySearcher.search("_testAttribute:test", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 2);
+
+ // protected attributes are ignored
+ m_searchResult = m_entrySearcher.search("_testAttribute:test _testProtected:testP2", m_rootGroup);
+ QCOMPARE(m_searchResult.count(), 2);
}
diff --git a/tests/TestEntrySearcher.h b/tests/TestEntrySearcher.h
index e10b1b544..fb4312926 100644
--- a/tests/TestEntrySearcher.h
+++ b/tests/TestEntrySearcher.h
@@ -35,6 +35,7 @@ private slots:
void testSearch();
void testAllAttributesAreSearched();
void testSearchTermParser();
+ void testCustomAttributesAreSearched();
private:
Group* m_rootGroup;
diff --git a/tests/TestFdoSecrets.cpp b/tests/TestFdoSecrets.cpp
new file mode 100644
index 000000000..3876f9033
--- /dev/null
+++ b/tests/TestFdoSecrets.cpp
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 "TestFdoSecrets.h"
+
+#include "TestGlobal.h"
+
+#include "fdosecrets/GcryptMPI.h"
+#include "fdosecrets/objects/SessionCipher.h"
+
+#include "crypto/Crypto.h"
+
+QTEST_GUILESS_MAIN(TestFdoSecrets)
+
+void TestFdoSecrets::initTestCase()
+{
+ QVERIFY(Crypto::init());
+}
+
+void TestFdoSecrets::cleanupTestCase()
+{
+}
+
+void TestFdoSecrets::testGcryptMPI()
+{
+ auto bytes = QByteArray::fromHex(QByteArrayLiteral("DEADBEEF"));
+
+ auto mpi = MpiFromBytes(bytes);
+ auto another = MpiFromHex("DEADBEEF");
+
+ // verify it can parse the bytes in USG mode
+ QVERIFY(mpi.get());
+ QVERIFY(another.get());
+
+ // verify the number is of the correct value
+ QCOMPARE(gcry_mpi_cmp_ui(mpi.get(), 0xdeadbeef), 0);
+ QCOMPARE(gcry_mpi_cmp_ui(another.get(), 0xdeadbeef), 0);
+
+ // verify it can convert back
+ QCOMPARE(MpiToBytes(mpi), bytes);
+ QCOMPARE(MpiToBytes(another), bytes);
+}
+
+void TestFdoSecrets::testDhIetf1024Sha256Aes128CbcPkcs7()
+{
+ auto clientPublic = MpiFromHex("40a0c8d27012c651bf270ebd96890a538"
+ "396fae3852aef69c0c19bae420d667577"
+ "ed471cd8ba5a49ef0ec91b568b95f87f0"
+ "9ec31d271f1699ed140c5b38644c42f60"
+ "ef84b5a6c406e17c07cd3208e5a605626"
+ "a5266153b447529946be2394dd43e5638"
+ "5ffbc4322902c2942391d1a36e8d125dc"
+ "809e3e406a2f5c2dcf39d3da2");
+ auto serverPublic = MpiFromHex("e407997e8b918419cf851cf3345358fdf"
+ "ffb9564a220ac9c3934efd277cea20d17"
+ "467ecdc56e817f75ac39501f38a4a04ff"
+ "64d627e16c09981c7ad876da255b61c8e"
+ "6a8408236c2a4523cfe6961c26dbdfc77"
+ "c1a27a5b425ca71a019e829fae32c0b42"
+ "0e1b3096b48bc2ce9ccab1d1ff13a5eb4"
+ "b263cee30bdb1a57af9bfa93f");
+ auto serverPrivate = MpiFromHex("013f4f3381ef0ca11c4c7363079577b56"
+ "99b238644e0aba47e24bdba6173590216"
+ "4f1e12dd0944800a373e090e63192f53b"
+ "93583e9a9e50bb9d792aafaa3a0f5ae77"
+ "de0c3423f5820848d88ee3bdd01c889f2"
+ "7af58a02f5b6693d422b9d189b300d7b1"
+ "be5076b5795cf8808c31e2e2898368d18"
+ "ab5c26b0ea3480c9aba8154cf");
+
+ std::unique_ptr<FdoSecrets::DhIetf1024Sha256Aes128CbcPkcs7> cipher{new FdoSecrets::DhIetf1024Sha256Aes128CbcPkcs7};
+
+ cipher->initialize(std::move(clientPublic), std::move(serverPublic), std::move(serverPrivate));
+
+ QVERIFY(cipher->isValid());
+
+ QCOMPARE(cipher->m_aesKey.toHex(), QByteArrayLiteral("6b8f5ee55138eac37118508be21e7834"));
+}
diff --git a/tests/TestFdoSecrets.h b/tests/TestFdoSecrets.h
new file mode 100644
index 000000000..eecc687e4
--- /dev/null
+++ b/tests/TestFdoSecrets.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 Aetf <aetf@unlimitedcodeworks.xyz>
+ *
+ * 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 KEEPASSXC_TESTFDOSECRETS_H
+#define KEEPASSXC_TESTFDOSECRETS_H
+
+#include <QObject>
+
+class TestFdoSecrets : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void cleanupTestCase();
+
+ void testGcryptMPI();
+ void testDhIetf1024Sha256Aes128CbcPkcs7();
+};
+
+#endif // KEEPASSXC_TESTFDOSECRETS_H
diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp
index 3e4568c35..ae9c59894 100644
--- a/tests/TestGroup.cpp
+++ b/tests/TestGroup.cpp
@@ -635,28 +635,57 @@ void TestGroup::testPrint()
Group* group1 = new Group();
group1->setName("group1");
+ group1->setParent(db->rootGroup());
Entry* entry2 = new Entry();
-
entry2->setTitle(QString("entry2"));
entry2->setGroup(group1);
entry2->setUuid(QUuid::createUuid());
- group1->setParent(db->rootGroup());
+ Group* group2 = new Group();
+ group2->setName("group2");
+ group2->setParent(db->rootGroup());
+
+ Group* subGroup = new Group();
+ subGroup->setName("subgroup");
+ subGroup->setParent(group2);
+
+ Entry* entry3 = new Entry();
+ entry3->setTitle(QString("entry3"));
+ entry3->setGroup(subGroup);
+ entry3->setUuid(QUuid::createUuid());
output = db->rootGroup()->print();
QVERIFY(output.contains(QString("entry1\n")));
QVERIFY(output.contains(QString("group1/\n")));
QVERIFY(!output.contains(QString(" entry2\n")));
+ QVERIFY(output.contains(QString("group2/\n")));
+ QVERIFY(!output.contains(QString(" subgroup\n")));
output = db->rootGroup()->print(true);
QVERIFY(output.contains(QString("entry1\n")));
QVERIFY(output.contains(QString("group1/\n")));
QVERIFY(output.contains(QString(" entry2\n")));
+ QVERIFY(output.contains(QString("group2/\n")));
+ QVERIFY(output.contains(QString(" subgroup/\n")));
+ QVERIFY(output.contains(QString(" entry3\n")));
+
+ output = db->rootGroup()->print(true, true);
+ QVERIFY(output.contains(QString("entry1\n")));
+ QVERIFY(output.contains(QString("group1/\n")));
+ QVERIFY(output.contains(QString("group1/entry2\n")));
+ QVERIFY(output.contains(QString("group2/\n")));
+ QVERIFY(output.contains(QString("group2/subgroup/\n")));
+ QVERIFY(output.contains(QString("group2/subgroup/entry3\n")));
output = group1->print();
QVERIFY(!output.contains(QString("group1/\n")));
QVERIFY(output.contains(QString("entry2\n")));
+
+ output = group2->print(true, true);
+ QVERIFY(!output.contains(QString("group2/\n")));
+ QVERIFY(output.contains(QString("subgroup/\n")));
+ QVERIFY(output.contains(QString("subgroup/entry3\n")));
}
void TestGroup::testLocate()
@@ -770,7 +799,7 @@ void TestGroup::testAddEntryWithPath()
void TestGroup::testIsRecycled()
{
Database* db = new Database();
- db->rootGroup()->createRecycleBin();
+ db->metadata()->setRecycleBinEnabled(true);
Group* group1 = new Group();
group1->setName("group1");
@@ -840,3 +869,341 @@ void TestGroup::testEquals()
QVERIFY(group->equals(group.data(), CompareItemDefault));
}
+
+void TestGroup::testChildrenSort()
+{
+ auto createTestGroupWithUnorderedChildren = []() -> Group* {
+ Group* parent = new Group();
+
+ Group* group1 = new Group();
+ group1->setName("B");
+ group1->setParent(parent);
+ Group* group2 = new Group();
+ group2->setName("e");
+ group2->setParent(parent);
+ Group* group3 = new Group();
+ group3->setName("Test999");
+ group3->setParent(parent);
+ Group* group4 = new Group();
+ group4->setName("A");
+ group4->setParent(parent);
+ Group* group5 = new Group();
+ group5->setName("z");
+ group5->setParent(parent);
+ Group* group6 = new Group();
+ group6->setName("045");
+ group6->setParent(parent);
+ Group* group7 = new Group();
+ group7->setName("60");
+ group7->setParent(parent);
+ Group* group8 = new Group();
+ group8->setName("04test");
+ group8->setParent(parent);
+ Group* group9 = new Group();
+ group9->setName("Test12");
+ group9->setParent(parent);
+ Group* group10 = new Group();
+ group10->setName("i");
+ group10->setParent(parent);
+
+ Group* subGroup1 = new Group();
+ subGroup1->setName("sub_xte");
+ subGroup1->setParent(group10);
+ Group* subGroup2 = new Group();
+ subGroup2->setName("sub_010");
+ subGroup2->setParent(group10);
+ Group* subGroup3 = new Group();
+ subGroup3->setName("sub_000");
+ subGroup3->setParent(group10);
+ Group* subGroup4 = new Group();
+ subGroup4->setName("sub_M");
+ subGroup4->setParent(group10);
+ Group* subGroup5 = new Group();
+ subGroup5->setName("sub_p");
+ subGroup5->setParent(group10);
+ Group* subGroup6 = new Group();
+ subGroup6->setName("sub_45p");
+ subGroup6->setParent(group10);
+ Group* subGroup7 = new Group();
+ subGroup7->setName("sub_6p");
+ subGroup7->setParent(group10);
+ Group* subGroup8 = new Group();
+ subGroup8->setName("sub_tt");
+ subGroup8->setParent(group10);
+ Group* subGroup9 = new Group();
+ subGroup9->setName("sub_t0");
+ subGroup9->setParent(group10);
+
+ return parent;
+ };
+
+ Group* parent = createTestGroupWithUnorderedChildren();
+ Group* subParent = parent->children().last();
+ parent->sortChildrenRecursively();
+ QList<Group*> children = parent->children();
+ QCOMPARE(children.size(), 10);
+ QCOMPARE(children[0]->name(), QString("045"));
+ QCOMPARE(children[1]->name(), QString("04test"));
+ QCOMPARE(children[2]->name(), QString("60"));
+ QCOMPARE(children[3]->name(), QString("A"));
+ QCOMPARE(children[4]->name(), QString("B"));
+ QCOMPARE(children[5]->name(), QString("e"));
+ QCOMPARE(children[6]->name(), QString("i"));
+ QCOMPARE(children[7]->name(), QString("Test12"));
+ QCOMPARE(children[8]->name(), QString("Test999"));
+ QCOMPARE(children[9]->name(), QString("z"));
+ children = subParent->children();
+ QCOMPARE(children.size(), 9);
+ QCOMPARE(children[0]->name(), QString("sub_000"));
+ QCOMPARE(children[1]->name(), QString("sub_010"));
+ QCOMPARE(children[2]->name(), QString("sub_45p"));
+ QCOMPARE(children[3]->name(), QString("sub_6p"));
+ QCOMPARE(children[4]->name(), QString("sub_M"));
+ QCOMPARE(children[5]->name(), QString("sub_p"));
+ QCOMPARE(children[6]->name(), QString("sub_t0"));
+ QCOMPARE(children[7]->name(), QString("sub_tt"));
+ QCOMPARE(children[8]->name(), QString("sub_xte"));
+ delete parent;
+
+ parent = createTestGroupWithUnorderedChildren();
+ subParent = parent->children().last();
+ parent->sortChildrenRecursively(true);
+ children = parent->children();
+ QCOMPARE(children.size(), 10);
+ QCOMPARE(children[0]->name(), QString("z"));
+ QCOMPARE(children[1]->name(), QString("Test999"));
+ QCOMPARE(children[2]->name(), QString("Test12"));
+ QCOMPARE(children[3]->name(), QString("i"));
+ QCOMPARE(children[4]->name(), QString("e"));
+ QCOMPARE(children[5]->name(), QString("B"));
+ QCOMPARE(children[6]->name(), QString("A"));
+ QCOMPARE(children[7]->name(), QString("60"));
+ QCOMPARE(children[8]->name(), QString("04test"));
+ QCOMPARE(children[9]->name(), QString("045"));
+ children = subParent->children();
+ QCOMPARE(children.size(), 9);
+ QCOMPARE(children[0]->name(), QString("sub_xte"));
+ QCOMPARE(children[1]->name(), QString("sub_tt"));
+ QCOMPARE(children[2]->name(), QString("sub_t0"));
+ QCOMPARE(children[3]->name(), QString("sub_p"));
+ QCOMPARE(children[4]->name(), QString("sub_M"));
+ QCOMPARE(children[5]->name(), QString("sub_6p"));
+ QCOMPARE(children[6]->name(), QString("sub_45p"));
+ QCOMPARE(children[7]->name(), QString("sub_010"));
+ QCOMPARE(children[8]->name(), QString("sub_000"));
+ delete parent;
+
+ parent = createTestGroupWithUnorderedChildren();
+ subParent = parent->children().last();
+ subParent->sortChildrenRecursively();
+ children = parent->children();
+ QCOMPARE(children.size(), 10);
+ QCOMPARE(children[0]->name(), QString("B"));
+ QCOMPARE(children[1]->name(), QString("e"));
+ QCOMPARE(children[2]->name(), QString("Test999"));
+ QCOMPARE(children[3]->name(), QString("A"));
+ QCOMPARE(children[4]->name(), QString("z"));
+ QCOMPARE(children[5]->name(), QString("045"));
+ QCOMPARE(children[6]->name(), QString("60"));
+ QCOMPARE(children[7]->name(), QString("04test"));
+ QCOMPARE(children[8]->name(), QString("Test12"));
+ QCOMPARE(children[9]->name(), QString("i"));
+ children = subParent->children();
+ QCOMPARE(children.size(), 9);
+ QCOMPARE(children[0]->name(), QString("sub_000"));
+ QCOMPARE(children[1]->name(), QString("sub_010"));
+ QCOMPARE(children[2]->name(), QString("sub_45p"));
+ QCOMPARE(children[3]->name(), QString("sub_6p"));
+ QCOMPARE(children[4]->name(), QString("sub_M"));
+ QCOMPARE(children[5]->name(), QString("sub_p"));
+ QCOMPARE(children[6]->name(), QString("sub_t0"));
+ QCOMPARE(children[7]->name(), QString("sub_tt"));
+ QCOMPARE(children[8]->name(), QString("sub_xte"));
+ delete parent;
+
+ parent = createTestGroupWithUnorderedChildren();
+ subParent = parent->children().last();
+ subParent->sortChildrenRecursively(true);
+ children = parent->children();
+ QCOMPARE(children.size(), 10);
+ QCOMPARE(children[0]->name(), QString("B"));
+ QCOMPARE(children[1]->name(), QString("e"));
+ QCOMPARE(children[2]->name(), QString("Test999"));
+ QCOMPARE(children[3]->name(), QString("A"));
+ QCOMPARE(children[4]->name(), QString("z"));
+ QCOMPARE(children[5]->name(), QString("045"));
+ QCOMPARE(children[6]->name(), QString("60"));
+ QCOMPARE(children[7]->name(), QString("04test"));
+ QCOMPARE(children[8]->name(), QString("Test12"));
+ QCOMPARE(children[9]->name(), QString("i"));
+ children = subParent->children();
+ QCOMPARE(children.size(), 9);
+ QCOMPARE(children[0]->name(), QString("sub_xte"));
+ QCOMPARE(children[1]->name(), QString("sub_tt"));
+ QCOMPARE(children[2]->name(), QString("sub_t0"));
+ QCOMPARE(children[3]->name(), QString("sub_p"));
+ QCOMPARE(children[4]->name(), QString("sub_M"));
+ QCOMPARE(children[5]->name(), QString("sub_6p"));
+ QCOMPARE(children[6]->name(), QString("sub_45p"));
+ QCOMPARE(children[7]->name(), QString("sub_010"));
+ QCOMPARE(children[8]->name(), QString("sub_000"));
+ delete parent;
+}
+
+void TestGroup::testHierarchy()
+{
+ Group* group1 = new Group();
+ group1->setName("group1");
+
+ Group* group2 = new Group();
+ group2->setName("group2");
+ group2->setParent(group1);
+
+ Group* group3 = new Group();
+ group3->setName("group3");
+ group3->setParent(group2);
+
+ QStringList hierarchy = group3->hierarchy();
+ QVERIFY(hierarchy.size() == 3);
+ QVERIFY(hierarchy.contains("group1"));
+ QVERIFY(hierarchy.contains("group2"));
+ QVERIFY(hierarchy.contains("group3"));
+
+ hierarchy = group3->hierarchy(0);
+ QVERIFY(hierarchy.size() == 0);
+
+ hierarchy = group3->hierarchy(1);
+ QVERIFY(hierarchy.size() == 1);
+ QVERIFY(hierarchy.contains("group3"));
+
+ hierarchy = group3->hierarchy(2);
+ QVERIFY(hierarchy.size() == 2);
+ QVERIFY(hierarchy.contains("group2"));
+ QVERIFY(hierarchy.contains("group3"));
+}
+
+void TestGroup::testApplyGroupIconRecursively()
+{
+ // Create a database with two nested groups with one entry each
+ Database* database = new Database();
+
+ Group* subgroup = new Group();
+ subgroup->setName("Subgroup");
+ subgroup->setParent(database->rootGroup());
+ QVERIFY(subgroup);
+
+ Group* subsubgroup = new Group();
+ subsubgroup->setName("Subsubgroup");
+ subsubgroup->setParent(subgroup);
+ QVERIFY(subsubgroup);
+
+ Entry* subgroupEntry = subgroup->addEntryWithPath("Subgroup entry");
+ QVERIFY(subgroupEntry);
+ subgroup->setIcon(1);
+
+ Entry* subsubgroupEntry = subsubgroup->addEntryWithPath("Subsubgroup entry");
+ QVERIFY(subsubgroupEntry);
+ subsubgroup->setIcon(2);
+
+ // Set an icon per number to the root group and apply recursively
+ // -> all groups and entries have the same icon
+ const int rootIconNumber = 42;
+ database->rootGroup()->setIcon(rootIconNumber);
+ QVERIFY(database->rootGroup()->iconNumber() == rootIconNumber);
+ database->rootGroup()->applyGroupIconToChildGroups();
+ database->rootGroup()->applyGroupIconToChildEntries();
+ QVERIFY(subgroup->iconNumber() == rootIconNumber);
+ QVERIFY(subgroupEntry->iconNumber() == rootIconNumber);
+ QVERIFY(subsubgroup->iconNumber() == rootIconNumber);
+ QVERIFY(subsubgroupEntry->iconNumber() == rootIconNumber);
+
+ // Set an icon per number to the subsubgroup and apply recursively
+ // -> only the subsubgroup related groups and entries have updated icons
+ const int subsubgroupIconNumber = 24;
+ subsubgroup->setIcon(subsubgroupIconNumber);
+ QVERIFY(subsubgroup->iconNumber() == subsubgroupIconNumber);
+ subsubgroup->applyGroupIconToChildGroups();
+ subsubgroup->applyGroupIconToChildEntries();
+ QVERIFY(database->rootGroup()->iconNumber() == rootIconNumber);
+ QVERIFY(subgroup->iconNumber() == rootIconNumber);
+ QVERIFY(subgroupEntry->iconNumber() == rootIconNumber);
+ QVERIFY(subsubgroup->iconNumber() == subsubgroupIconNumber);
+ QVERIFY(subsubgroupEntry->iconNumber() == subsubgroupIconNumber);
+
+ // Set an icon per UUID to the subgroup and apply recursively
+ // -> all groups and entries except the root group have the same icon
+ const QUuid subgroupIconUuid = QUuid::createUuid();
+ QImage subgroupIcon(16, 16, QImage::Format_RGB32);
+ subgroupIcon.setPixel(0, 0, qRgb(255, 0, 0));
+ database->metadata()->addCustomIcon(subgroupIconUuid, subgroupIcon);
+ subgroup->setIcon(subgroupIconUuid);
+ subgroup->applyGroupIconToChildGroups();
+ subgroup->applyGroupIconToChildEntries();
+ QVERIFY(database->rootGroup()->iconNumber() == rootIconNumber);
+ QCOMPARE(subgroup->iconUuid(), subgroupIconUuid);
+ QCOMPARE(subgroup->icon(), subgroupIcon);
+ QCOMPARE(subgroupEntry->iconUuid(), subgroupIconUuid);
+ QCOMPARE(subgroupEntry->icon(), subgroupIcon);
+ QCOMPARE(subsubgroup->iconUuid(), subgroupIconUuid);
+ QCOMPARE(subsubgroup->icon(), subgroupIcon);
+ QCOMPARE(subsubgroupEntry->iconUuid(), subgroupIconUuid);
+ QCOMPARE(subsubgroupEntry->icon(), subgroupIcon);
+
+ // Reset all icons to root icon
+ database->rootGroup()->setIcon(rootIconNumber);
+ QVERIFY(database->rootGroup()->iconNumber() == rootIconNumber);
+ database->rootGroup()->applyGroupIconToChildGroups();
+ database->rootGroup()->applyGroupIconToChildEntries();
+ QVERIFY(subgroup->iconNumber() == rootIconNumber);
+ QVERIFY(subgroupEntry->iconNumber() == rootIconNumber);
+ QVERIFY(subsubgroup->iconNumber() == rootIconNumber);
+ QVERIFY(subsubgroupEntry->iconNumber() == rootIconNumber);
+
+ // Apply only for child groups
+ const int iconForGroups = 10;
+ database->rootGroup()->setIcon(iconForGroups);
+ QVERIFY(database->rootGroup()->iconNumber() == iconForGroups);
+ database->rootGroup()->applyGroupIconToChildGroups();
+ QVERIFY(database->rootGroup()->iconNumber() == iconForGroups);
+ QVERIFY(subgroup->iconNumber() == iconForGroups);
+ QVERIFY(subgroupEntry->iconNumber() == rootIconNumber);
+ QVERIFY(subsubgroup->iconNumber() == iconForGroups);
+ QVERIFY(subsubgroupEntry->iconNumber() == rootIconNumber);
+
+ // Apply only for child entries
+ const int iconForEntries = 20;
+ database->rootGroup()->setIcon(iconForEntries);
+ QVERIFY(database->rootGroup()->iconNumber() == iconForEntries);
+ database->rootGroup()->applyGroupIconToChildEntries();
+ QVERIFY(database->rootGroup()->iconNumber() == iconForEntries);
+ QVERIFY(subgroup->iconNumber() == iconForGroups);
+ QVERIFY(subgroupEntry->iconNumber() == iconForEntries);
+ QVERIFY(subsubgroup->iconNumber() == iconForGroups);
+ QVERIFY(subsubgroupEntry->iconNumber() == iconForEntries);
+}
+
+void TestGroup::testUsernamesRecursive()
+{
+ Database* database = new Database();
+
+ // Create a subgroup
+ Group* subgroup = new Group();
+ subgroup->setName("Subgroup");
+ subgroup->setParent(database->rootGroup());
+
+ // Generate entries in the root group and the subgroup
+ Entry* rootGroupEntry = database->rootGroup()->addEntryWithPath("Root group entry");
+ rootGroupEntry->setUsername("Name1");
+
+ Entry* subgroupEntry = subgroup->addEntryWithPath("Subgroup entry");
+ subgroupEntry->setUsername("Name2");
+
+ Entry* subgroupEntryReusingUsername = subgroup->addEntryWithPath("Another subgroup entry");
+ subgroupEntryReusingUsername->setUsername("Name2");
+
+ QList<QString> usernames = database->rootGroup()->usernamesRecursive();
+ QCOMPARE(usernames.size(), 2);
+ QVERIFY(usernames.contains("Name1"));
+ QVERIFY(usernames.contains("Name2"));
+ QVERIFY(usernames.indexOf("Name2") < usernames.indexOf("Name1"));
+}
diff --git a/tests/TestGroup.h b/tests/TestGroup.h
index 9fd5c2efd..dbe5d6f4d 100644
--- a/tests/TestGroup.h
+++ b/tests/TestGroup.h
@@ -45,6 +45,10 @@ private slots:
void testIsRecycled();
void testCopyDataFrom();
void testEquals();
+ void testChildrenSort();
+ void testHierarchy();
+ void testApplyGroupIconRecursively();
+ void testUsernamesRecursive();
};
#endif // KEEPASSX_TESTGROUP_H
diff --git a/tests/TestHibp.cpp b/tests/TestHibp.cpp
new file mode 100644
index 000000000..f1682bccd
--- /dev/null
+++ b/tests/TestHibp.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "TestHibp.h"
+
+#include "config-keepassx-tests.h"
+
+#include "core/Database.h"
+#include "core/Entry.h"
+#include "core/Group.h"
+#include "core/HibpOffline.h"
+#include "crypto/Crypto.h"
+
+#include <QBuffer>
+#include <QByteArray>
+#include <QFile>
+#include <QList>
+#include <QTest>
+
+QTEST_GUILESS_MAIN(TestHibp)
+
+const char* TEST_HIBP_CONTENTS = "0BEEC7B5EA3F0FDBC95D0DD47F3C5BC275DA8A33:123\n" // SHA-1 of "foo"
+ "62cdb7020ff920e5aa642c3d4066950dd1f01f4d:456\n"; // SHA-1 of "bar"
+
+const char* TEST_BAD_HIBP_CONTENTS = "barf:nope\n";
+
+void TestHibp::initTestCase()
+{
+ QVERIFY(Crypto::init());
+}
+
+void TestHibp::init()
+{
+ m_db.reset(new Database());
+}
+
+void TestHibp::testBadHibpFormat()
+{
+ QByteArray hibpContents(TEST_BAD_HIBP_CONTENTS);
+ QBuffer hibpBuffer(&hibpContents);
+ QVERIFY(hibpBuffer.open(QIODevice::ReadOnly));
+
+ QList<QPair<const Entry*, int>> findings;
+ QString error;
+ QVERIFY(!HibpOffline::report(m_db, hibpBuffer, findings, &error));
+ QVERIFY(!error.isEmpty());
+ QCOMPARE(findings.size(), 0);
+}
+
+void TestHibp::testEmpty()
+{
+ QByteArray hibpContents(TEST_HIBP_CONTENTS);
+ QBuffer hibpBuffer(&hibpContents);
+ QVERIFY(hibpBuffer.open(QIODevice::ReadOnly));
+
+ QList<QPair<const Entry*, int>> findings;
+ QString error;
+ QVERIFY(HibpOffline::report(m_db, hibpBuffer, findings, &error));
+ QCOMPARE(error, QString());
+ QCOMPARE(findings.size(), 0);
+}
+
+void TestHibp::testIoError()
+{
+ QBuffer hibpBuffer;
+ // hibpBuffer has not been opened, so reading will cause I/O error
+
+ QList<QPair<const Entry*, int>> findings;
+ QString error;
+ QVERIFY(!HibpOffline::report(m_db, hibpBuffer, findings, &error));
+ QVERIFY(!error.isEmpty());
+ QCOMPARE(findings.size(), 0);
+}
+
+void TestHibp::testPwned()
+{
+ QByteArray hibpContents(TEST_HIBP_CONTENTS);
+ QBuffer hibpBuffer(&hibpContents);
+ QVERIFY(hibpBuffer.open(QIODevice::ReadOnly));
+
+ Group* root = m_db->rootGroup();
+
+ Entry* entry1 = new Entry();
+ entry1->setPassword("foo");
+ entry1->setGroup(root);
+
+ Entry* entry2 = new Entry();
+ entry2->setPassword("xyz");
+ entry2->setGroup(root);
+
+ Entry* entry3 = new Entry();
+ entry3->setPassword("foo");
+ m_db->recycleEntry(entry3);
+
+ Group* group1 = new Group();
+ group1->setParent(root);
+
+ Entry* entry4 = new Entry();
+ entry4->setPassword("bar");
+ entry4->setGroup(group1);
+
+ QList<QPair<const Entry*, int>> findings;
+ QString error;
+ QVERIFY(HibpOffline::report(m_db, hibpBuffer, findings, &error));
+ QCOMPARE(error, QString());
+ QCOMPARE(findings.size(), 2);
+ QCOMPARE(findings[0].first, entry1);
+ QCOMPARE(findings[0].second, 123);
+ QCOMPARE(findings[1].first, entry4);
+ QCOMPARE(findings[1].second, 456);
+}
diff --git a/tests/TestHibp.h b/tests/TestHibp.h
new file mode 100644
index 000000000..18ec3fb9e
--- /dev/null
+++ b/tests/TestHibp.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_TESTHIBP_H
+#define KEEPASSXC_TESTHIBP_H
+
+#include <QObject>
+#include <QSharedPointer>
+
+class Database;
+
+class TestHibp : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void init();
+ void testBadHibpFormat();
+ void testEmpty();
+ void testIoError();
+ void testPwned();
+
+private:
+ QSharedPointer<Database> m_db;
+};
+
+#endif // KEEPASSXC_TESTHIBP_H
diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp
index 4d9aef211..4f96d3e6d 100644
--- a/tests/TestMerge.cpp
+++ b/tests/TestMerge.cpp
@@ -1159,12 +1159,12 @@ void TestMerge::testMetadata()
{
QSKIP("Sophisticated merging for Metadata not implemented");
// TODO HNH: I think a merge of recycle bins would be nice since duplicating them
- // is not realy a good solution - the one to use as final recycle bin
+ // is not really a good solution - the one to use as final recycle bin
// is determined by the merge method - if only one has a bin, this one
// will be used - exception is the target has no recycle bin activated
}
-void TestMerge::testCustomdata()
+void TestMerge::testCustomData()
{
QScopedPointer<Database> dbDestination(new Database());
QScopedPointer<Database> dbSource(createTestDatabase());
@@ -1172,7 +1172,7 @@ void TestMerge::testCustomdata()
QScopedPointer<Database> dbSource2(createTestDatabase());
m_clock->advanceSecond(1);
-
+
dbDestination->metadata()->customData()->set("toBeDeleted", "value");
dbDestination->metadata()->customData()->set("key3", "oldValue");
@@ -1198,10 +1198,9 @@ void TestMerge::testCustomdata()
m_clock->advanceSecond(1);
Merger merger(dbSource.data(), dbDestination.data());
- merger.merge();
+ QStringList changes = merger.merge();
- Merger merger2(dbSource2.data(), dbDestination2.data());
- merger2.merge();
+ QVERIFY(!changes.isEmpty());
// Source is newer, data should be merged
QVERIFY(!dbDestination->metadata()->customData()->isEmpty());
@@ -1212,7 +1211,19 @@ void TestMerge::testCustomdata()
QCOMPARE(dbDestination->metadata()->customData()->value("key1"), QString("value1"));
QCOMPARE(dbDestination->metadata()->customData()->value("key2"), QString("value2"));
QCOMPARE(dbDestination->metadata()->customData()->value("Browser"), QString("n'8=3W@L^6d->d.]St_>]"));
- QCOMPARE(dbDestination->metadata()->customData()->value("key3"), QString("newValue")); // Old value should be replaced
+ QCOMPARE(dbDestination->metadata()->customData()->value("key3"),
+ QString("newValue")); // Old value should be replaced
+
+ // Merging again should not do anything if the values are the same.
+ m_clock->advanceSecond(1);
+ dbSource->metadata()->customData()->set("key3", "oldValue");
+ dbSource->metadata()->customData()->set("key3", "newValue");
+ Merger merger2(dbSource.data(), dbDestination.data());
+ QStringList changes2 = merger2.merge();
+ QVERIFY(changes2.isEmpty());
+
+ Merger merger3(dbSource2.data(), dbDestination2.data());
+ merger3.merge();
// Target is newer, no data is merged
QVERIFY(!dbDestination2->metadata()->customData()->isEmpty());
@@ -1220,7 +1231,8 @@ void TestMerge::testCustomdata()
QVERIFY(!dbDestination2->metadata()->customData()->contains("key2"));
QVERIFY(!dbDestination2->metadata()->customData()->contains("Browser"));
QVERIFY(dbDestination2->metadata()->customData()->contains("notToBeDeleted"));
- QCOMPARE(dbDestination2->metadata()->customData()->value("key3"), QString("oldValue")); // Old value should not be replaced
+ QCOMPARE(dbDestination2->metadata()->customData()->value("key3"),
+ QString("oldValue")); // Old value should not be replaced
}
void TestMerge::testDeletedEntry()
diff --git a/tests/TestMerge.h b/tests/TestMerge.h
index 15f67ca79..93a66428a 100644
--- a/tests/TestMerge.h
+++ b/tests/TestMerge.h
@@ -59,7 +59,7 @@ private slots:
void testMergeCustomIcons();
void testMergeDuplicateCustomIcons();
void testMetadata();
- void testCustomdata();
+ void testCustomData();
void testDeletedEntry();
void testDeletedGroup();
void testDeletedRevertedEntry();
diff --git a/tests/TestOpVaultReader.cpp b/tests/TestOpVaultReader.cpp
new file mode 100644
index 000000000..af332fd32
--- /dev/null
+++ b/tests/TestOpVaultReader.cpp
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "TestOpVaultReader.h"
+
+#include "config-keepassx-tests.h"
+#include "core/Database.h"
+#include "core/Group.h"
+#include "core/Metadata.h"
+#include "core/Tools.h"
+#include "crypto/Crypto.h"
+#include "format/OpVaultReader.h"
+
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QList>
+#include <QPair>
+#include <QStringList>
+#include <QTest>
+#include <QUuid>
+
+QTEST_GUILESS_MAIN(TestOpVaultReader)
+
+QPair<QString, QString>* split1PTextExportKV(QByteArray& line)
+{
+ const auto eq = line.indexOf('=');
+ if (-1 == eq) {
+ qWarning() << "Bogus key=value pair: <<" << line << ">>";
+ return nullptr;
+ }
+ auto k = QString::fromUtf8(line.mid(0, eq));
+ const auto start = eq + 1;
+ auto v = QString::fromUtf8(line.mid(start), (line.size() - 1) - start);
+ return new QPair<QString, QString>(k, v);
+}
+
+QJsonArray* read1PasswordTextExport(QFile& f)
+{
+ auto result = new QJsonArray;
+ auto current = new QJsonObject;
+
+ if (!f.open(QIODevice::ReadOnly)) {
+ qCritical("Unable to open your text export file for reading");
+ return nullptr;
+ }
+
+ while (!f.atEnd()) {
+ auto line = f.readLine(1024);
+
+ if (line.size() == 1 and line[0] == '\n') {
+ if (!current->isEmpty()) {
+ result->append(*current);
+ }
+ current = new QJsonObject;
+ continue;
+ }
+ const auto kv = split1PTextExportKV(line);
+ if (kv == nullptr) {
+ break;
+ }
+ QString k = kv->first;
+
+ const auto multiLine1 = line.indexOf("=\"\"");
+ const auto multiLine2 = line.indexOf("=\"");
+ const auto isML1 = -1 != multiLine1;
+ const auto isML2 = -1 != multiLine2;
+ if (isML1 or isML2) {
+ QStringList lines;
+ const int skipEQ = isML1 ? (multiLine1 + 3) : (multiLine2 + 2);
+ lines.append(QString::fromUtf8(line.mid(skipEQ)));
+ while (!f.atEnd()) {
+ line = f.readLine(1024);
+ const auto endMarker = line.indexOf(isML1 ? "\"\"\n" : "\"\n");
+ if (-1 != endMarker) {
+ line[endMarker] = '\n';
+ lines.append(QString::fromUtf8(line.mid(0, endMarker)));
+ break;
+ } else {
+ lines.append(QString::fromUtf8(line));
+ }
+ }
+ auto v = lines.join("");
+ (*current)[k] = v;
+ } else {
+ (*current)[k] = kv->second;
+ }
+ delete kv;
+ }
+ if (!current->isEmpty()) {
+ result->append(*current);
+ }
+ f.close();
+
+ return result;
+}
+
+void TestOpVaultReader::initTestCase()
+{
+ QVERIFY(Crypto::init());
+
+ // https://cache.agilebits.com/security-kb/freddy-2013-12-04.tar.gz
+ m_opVaultPath = QString("%1/%2").arg(KEEPASSX_TEST_DATA_DIR, "/freddy-2013-12-04.opvault");
+ m_opVaultTextExportPath = QString(m_opVaultPath).replace(".opvault", ".opvault.txt");
+
+ m_password = "freddy";
+
+ QFile testData(m_opVaultTextExportPath);
+ QJsonArray* data = read1PasswordTextExport(testData);
+ QVERIFY(data);
+ QCOMPARE(data->size(), 27);
+ delete data;
+
+ m_categoryMap.insert("001", "Login");
+ m_categoryMap.insert("002", "Credit Card");
+ m_categoryMap.insert("003", "Secure Note");
+ m_categoryMap.insert("004", "Identity");
+ m_categoryMap.insert("005", "Password");
+ m_categoryMap.insert("099", "Tombstone");
+ m_categoryMap.insert("100", "Software License");
+ m_categoryMap.insert("101", "Bank Account");
+ m_categoryMap.insert("102", "Database");
+ m_categoryMap.insert("103", "Driver License");
+ m_categoryMap.insert("104", "Outdoor License");
+ m_categoryMap.insert("105", "Membership");
+ m_categoryMap.insert("106", "Passport");
+ m_categoryMap.insert("107", "Rewards");
+ m_categoryMap.insert("108", "SSN");
+ m_categoryMap.insert("109", "Router");
+ m_categoryMap.insert("110", "Server");
+ m_categoryMap.insert("111", "Email");
+}
+
+void TestOpVaultReader::testReadIntoDatabase()
+{
+ QDir opVaultDir(m_opVaultPath);
+
+ auto reader = new OpVaultReader();
+ auto db = reader->readDatabase(opVaultDir, m_password);
+ QVERIFY2(!reader->hasError(), qPrintable(reader->errorString()));
+ QVERIFY(db);
+ QVERIFY(!db->children().isEmpty());
+
+ Group* rootGroup = db->rootGroup();
+ QVERIFY(rootGroup);
+
+ QFile testDataFile(m_opVaultTextExportPath);
+ auto testData = read1PasswordTextExport(testDataFile);
+ QVERIFY(testData);
+
+ QMap<QUuid, QJsonObject> objectsByUuid;
+ QMap<QString, QList<QJsonObject>> objectsByCategory;
+ for (QJsonArray::const_iterator it = testData->constBegin(); it != testData->constEnd(); ++it) {
+ QJsonObject value = (*it).toObject();
+ auto cat = value["category"].toString();
+ QVERIFY2(m_categoryMap.contains(cat), qPrintable(QString("BOGUS, unmapped category \"%1\"").arg(cat)));
+
+ auto catName = m_categoryMap[cat];
+ if (!objectsByCategory.contains(catName)) {
+ QList<QJsonObject> theList;
+ objectsByCategory[catName] = theList;
+ }
+ objectsByCategory[catName].append(value);
+
+ QUuid u = Tools::hexToUuid(value["uuid"].toString());
+ objectsByUuid[u] = value;
+ }
+ delete testData;
+ QCOMPARE(objectsByUuid.size(), 27);
+
+ for (QUuid u : objectsByUuid.keys()) {
+ QJsonObject o = objectsByUuid[u];
+ const auto e = db->rootGroup()->findEntryByUuid(u);
+ QVERIFY2(e, qPrintable(QString("Expected to find UUID %1").arg(u.toString())));
+
+ auto jsonTitle = o["title"].toString();
+ QCOMPARE(jsonTitle, e->title());
+ }
+
+ for (QString& catName : m_categoryMap.values()) {
+ const auto g = rootGroup->findChildByName(catName);
+ QVERIFY2(g, qPrintable(QString("Expected to find Group(%1)").arg(catName)));
+ for (QJsonObject testEntry : objectsByCategory[catName]) {
+ auto uuidStr = testEntry["uuid"].toString();
+ auto jsonTitle = testEntry["title"].toString();
+
+ QUuid u = Tools::hexToUuid(uuidStr);
+ const auto entry = g->findEntryByUuid(u);
+ QVERIFY2(entry, qPrintable(QString("Expected to find Group(%1).entry(%2)").arg(catName).arg(uuidStr)));
+ QCOMPARE(entry->title(), jsonTitle);
+ }
+ }
+}
+
+void TestOpVaultReader::testKeyDerivation()
+{
+ OpVaultReader reader;
+ QDir opVaultDir(m_opVaultPath);
+
+ // yes, the reader checks this too, but in our case best to fail early
+ QVERIFY(opVaultDir.exists());
+ QVERIFY(opVaultDir.isReadable());
+
+ QDir defDir = QDir(opVaultDir);
+ defDir.cd("default");
+ QFile profileJs(defDir.absoluteFilePath("profile.js"));
+ QVERIFY(profileJs.exists());
+
+ auto profileObj = reader.readAndAssertJsonFile(profileJs, "var profile=", ";");
+
+ QByteArray salt = QByteArray::fromBase64(profileObj["salt"].toString().toUtf8());
+ unsigned long iter = profileObj["iterations"].toInt();
+ const auto derived = reader.deriveKeysFromPassPhrase(salt, m_password, iter);
+ QVERIFY(derived);
+ QVERIFY(!derived->error);
+
+ QByteArray encHex = derived->encrypt.toHex();
+ QByteArray hmacHex = derived->hmac.toHex();
+ delete derived;
+
+ QCOMPARE(QString::fromUtf8(encHex),
+ QStringLiteral("63b075de858949559d4faa9d348bf10bdaa0e567ad943d7803f2291c9342aaaa"));
+ QCOMPARE(QString::fromUtf8(hmacHex),
+ QStringLiteral("ff3ab426ce55bf097b252b3f2df1c4ba4312a6960180844d7a625bc0ab40c35e"));
+}
+
+void TestOpVaultReader::testBandEntry1()
+{
+ auto reader = new OpVaultReader();
+ QByteArray json(R"({"hello": "world"})");
+ QJsonDocument doc = QJsonDocument::fromJson(json);
+ QJsonObject data;
+ QByteArray entryKey;
+ QByteArray entryHmacKey;
+ QVERIFY(!reader->decryptBandEntry(doc.object(), data, entryKey, entryHmacKey));
+}
diff --git a/tests/TestOpVaultReader.h b/tests/TestOpVaultReader.h
new file mode 100644
index 000000000..54d096e43
--- /dev/null
+++ b/tests/TestOpVaultReader.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 TEST_OPVAULT_READER_H_
+#define TEST_OPVAULT_READER_H_
+
+#include <QMap>
+#include <QObject>
+
+class TestOpVaultReader : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void testReadIntoDatabase();
+ void testBandEntry1();
+ void testKeyDerivation();
+
+private:
+ // absolute path to the .opvault directory
+ QString m_opVaultPath;
+
+ /*
+ * Points to the file made by using the 1Password GUI to "Export all"
+ * to its text file format, which are almost key=value pairs
+ * except for multi-line strings.
+ */
+ QString m_opVaultTextExportPath;
+ QString m_password;
+ QMap<QString, QString> m_categoryMap;
+};
+
+#endif /* TEST_OPVAULT_READER_H_ */
diff --git a/tests/TestPassphraseGenerator.cpp b/tests/TestPassphraseGenerator.cpp
new file mode 100644
index 000000000..9b1ed8ada
--- /dev/null
+++ b/tests/TestPassphraseGenerator.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "TestPassphraseGenerator.h"
+#include "core/PassphraseGenerator.h"
+#include "crypto/Crypto.h"
+
+#include <QRegularExpression>
+#include <QTest>
+
+QTEST_GUILESS_MAIN(TestPassphraseGenerator)
+
+void TestPassphraseGenerator::initTestCase()
+{
+ QVERIFY(Crypto::init());
+}
+
+void TestPassphraseGenerator::testWordCase()
+{
+ PassphraseGenerator generator;
+ generator.setWordSeparator(" ");
+ QVERIFY(generator.isValid());
+
+ QString passphrase;
+ passphrase = generator.generatePassphrase();
+ QCOMPARE(passphrase, passphrase.toLower());
+
+ generator.setWordCase(PassphraseGenerator::LOWERCASE);
+ passphrase = generator.generatePassphrase();
+ QCOMPARE(passphrase, passphrase.toLower());
+
+ generator.setWordCase(PassphraseGenerator::UPPERCASE);
+ passphrase = generator.generatePassphrase();
+ QCOMPARE(passphrase, passphrase.toUpper());
+
+ generator.setWordCase(PassphraseGenerator::TITLECASE);
+ passphrase = generator.generatePassphrase();
+ QRegularExpression regex("^([A-Z][a-z]* ?)+$");
+ QVERIFY(regex.match(passphrase).hasMatch());
+}
diff --git a/tests/TestPassphraseGenerator.h b/tests/TestPassphraseGenerator.h
new file mode 100644
index 000000000..ca0fd0664
--- /dev/null
+++ b/tests/TestPassphraseGenerator.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_TESTPASSPHRASEGENERATOR_H
+#define KEEPASSXC_TESTPASSPHRASEGENERATOR_H
+
+#include <QObject>
+
+class TestPassphraseGenerator : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void testWordCase();
+};
+
+#endif // KEEPASSXC_TESTPASSPHRASEGENERATOR_H
diff --git a/tests/TestTotp.cpp b/tests/TestTotp.cpp
index f4de2c6ad..5eb9f6e53 100644
--- a/tests/TestTotp.cpp
+++ b/tests/TestTotp.cpp
@@ -39,17 +39,34 @@ void TestTotp::testParseSecret()
QVERIFY(!settings.isNull());
QCOMPARE(settings->key, QString("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ"));
QCOMPARE(settings->custom, false);
+ QCOMPARE(settings->format, Totp::StorageFormat::OTPURL);
QCOMPARE(settings->digits, 6u);
QCOMPARE(settings->step, 30u);
+ QCOMPARE(settings->algorithm, Totp::Algorithm::Sha1);
+
+ // OTP URL with non-default hash type
+ secret = "otpauth://totp/"
+ "ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm="
+ "SHA512&digits=6&period=30";
+ settings = Totp::parseSettings(secret);
+ QVERIFY(!settings.isNull());
+ QCOMPARE(settings->key, QString("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ"));
+ QCOMPARE(settings->custom, true);
+ QCOMPARE(settings->format, Totp::StorageFormat::OTPURL);
+ QCOMPARE(settings->digits, 6u);
+ QCOMPARE(settings->step, 30u);
+ QCOMPARE(settings->algorithm, Totp::Algorithm::Sha512);
// KeeOTP Parsing
- secret = "key=HXDMVJECJJWSRBY%3d&step=25&size=8";
+ secret = "key=HXDMVJECJJWSRBY%3d&step=25&size=8&otpHashMode=Sha256";
settings = Totp::parseSettings(secret);
QVERIFY(!settings.isNull());
QCOMPARE(settings->key, QString("HXDMVJECJJWSRBY="));
QCOMPARE(settings->custom, true);
+ QCOMPARE(settings->format, Totp::StorageFormat::KEEOTP);
QCOMPARE(settings->digits, 8u);
QCOMPARE(settings->step, 25u);
+ QCOMPARE(settings->algorithm, Totp::Algorithm::Sha256);
// Semi-colon delineated "TOTP Settings"
secret = "gezdgnbvgy3tqojqgezdgnbvgy3tqojq";
@@ -57,8 +74,10 @@ void TestTotp::testParseSecret()
QVERIFY(!settings.isNull());
QCOMPARE(settings->key, QString("gezdgnbvgy3tqojqgezdgnbvgy3tqojq"));
QCOMPARE(settings->custom, true);
+ QCOMPARE(settings->format, Totp::StorageFormat::LEGACY);
QCOMPARE(settings->digits, 8u);
QCOMPARE(settings->step, 30u);
+ QCOMPARE(settings->algorithm, Totp::Algorithm::Sha1);
// Bare secret (no "TOTP Settings" attribute)
secret = "gezdgnbvgy3tqojqgezdgnbvgy3tqojq";
@@ -66,8 +85,10 @@ void TestTotp::testParseSecret()
QVERIFY(!settings.isNull());
QCOMPARE(settings->key, QString("gezdgnbvgy3tqojqgezdgnbvgy3tqojq"));
QCOMPARE(settings->custom, false);
+ QCOMPARE(settings->format, Totp::StorageFormat::LEGACY);
QCOMPARE(settings->digits, 6u);
QCOMPARE(settings->step, 30u);
+ QCOMPARE(settings->algorithm, Totp::Algorithm::Sha1);
}
void TestTotp::testTotpCode()
@@ -103,6 +124,7 @@ void TestTotp::testSteamTotp()
QCOMPARE(settings->key, QString("63BEDWCQZKTQWPESARIERL5DTTQFCJTK"));
QCOMPARE(settings->encoder.shortName, Totp::STEAM_SHORTNAME);
+ QCOMPARE(settings->format, Totp::StorageFormat::OTPURL);
QCOMPARE(settings->digits, Totp::STEAM_DIGITS);
QCOMPARE(settings->step, 30u);
diff --git a/tests/TestYkChallengeResponseKey.cpp b/tests/TestYkChallengeResponseKey.cpp
index 126d00315..0d6f9b5c3 100644
--- a/tests/TestYkChallengeResponseKey.cpp
+++ b/tests/TestYkChallengeResponseKey.cpp
@@ -74,7 +74,7 @@ void TestYubiKeyChalResp::keyIssueChallenge()
/* TODO Determine if it's reasonable to provide a fixed secret key for
* verification testing. Obviously simple technically, but annoying
* if devs need to re-program their yubikeys or have a spare test key
- * for unit tests to past.
+ * for unit tests to pass.
*
* Might be worth it for integrity verification though.
*/
diff --git a/tests/data/NewDatabase.kdbx b/tests/data/NewDatabase.kdbx
index a8dfb5bd5..3008cce7c 100644
--- a/tests/data/NewDatabase.kdbx
+++ b/tests/data/NewDatabase.kdbx
Binary files differ
diff --git a/tests/data/NewDatabaseBrowser.kdbx b/tests/data/NewDatabaseBrowser.kdbx
new file mode 100644
index 000000000..97599fccf
--- /dev/null
+++ b/tests/data/NewDatabaseBrowser.kdbx
Binary files differ
diff --git a/tests/data/YubiKeyProtectedPasswords.kdbx b/tests/data/YubiKeyProtectedPasswords.kdbx
new file mode 100644
index 000000000..c6c6d1324
--- /dev/null
+++ b/tests/data/YubiKeyProtectedPasswords.kdbx
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault.txt b/tests/data/freddy-2013-12-04.opvault.txt
new file mode 100644
index 000000000..d36a78f5a
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault.txt
@@ -0,0 +1,427 @@
+uuid=E0D293D29B10483F8DFDAC72ED0BE5C0
+title=Wendy's passport
+category=106
+ainfo=ZZ200000
+scope=Default
+autoSubmit=Default
+type=Passport
+issuing country=Canada
+number=ZZ200000
+full name=Wendy Appleseed
+sex=female
+nationality=Canada
+issuing authority=Home Office
+date of birth=359100000
+place of birth=Yellowknife, NT
+issued on=954828000
+expiry date=1585893600
+
+uuid=F2DB5DA3FCA64372A751E0E85C67A538
+title=A note with some attachments
+category=003
+ainfo=This note has two attachments.
+scope=Default
+autoSubmit=Default
+notesPlain=This note has two attachments.
+
+uuid=FF445AB1497241A28812363154E1A738
+title=Johnny Appleseed Society
+category=105
+ainfo=Wendy Appleseed
+scope=Default
+autoSubmit=Default
+website=http://www.urbana.edu/resources/community/johnny-appleseed/appleseed-society.html
+member name=Wendy Appleseed
+expiry date=2625
+member ID=123456
+password=B8HqCdCMAY8KxJqg
+
+uuid=2A632FDD32F5445E91EB5636C7580447
+title=Skype
+category=001
+ainfo=WendyAppleseed
+scope=Default
+autoSubmit=Default
+tags=Sample
+website=https://secure.skype.com/account/login?message=login_required
+username=WendyAppleseed
+password=dej3ur9unsh5ian1and5
+
+uuid=1C7D72EFA19A4EE98DB7A9661D2F5732
+title=Wendy's driver's license
+category=103
+ainfo=D6101-40706-60905
+scope=Default
+autoSubmit=Default
+notesPlain=Picture really doesn't look like Wendy
+full name=Wendy Appleseed
+address=5-150 Hollidge Blvd Suite 150
+date of birth=359100000
+sex=female
+height=175cm
+number=D6101-40706-60905
+license class=G2
+conditions / restrictions=J
+state=Ontario
+country=Canada
+expiry date=2515
+
+uuid=67979020CCA54120BAFA2742C3F23F2B
+title=Social Security
+category=108
+ainfo=Wendy Appleseed
+scope=Default
+autoSubmit=Default
+name=Wendy Appleseed
+number=555-55-1234
+
+uuid=372E1D51AA1D44CB9F17D8AA70ADA9A6
+title=example.com
+category=110
+ainfo=wappleseed
+scope=Default
+autoSubmit=Default
+notesPlain=I should attach an SSH key, but maybe later.
+URL=example.com
+username=wappleseed
+password=My4scQNoFw8JcvN
+section=Admin Console
+section=Hosting Provider
+name=Example Hosting provider
+website=http://services.example.com
+
+uuid=8445A23B5740455DA360FEA379C3CC90
+title=Tim Hortons
+category=107
+ainfo=Tim Hortens
+scope=Default
+autoSubmit=Default
+company name=Tim Hortens
+member name=Wendy Appleseed
+member ID=12123123
+PIN=Y7s8WaRGJBAz
+section=More Information
+
+uuid=A2D44483145F4B41A849FE5FEA4B504D
+title=Snipe Hunting License
+category=104
+ainfo=Wendy Appleseed
+scope=Default
+autoSubmit=Default
+notesPlain=""I went out and shot the maximum the game laws would allow.
+Two game wardens, seven hunters, and a cow.
+
+They took away my license, the worst punishment I ever endured.
+Turns out there was a reason,
+Cows were out of season,
+And one of the hunters wasn't insured.""
+full name=Wendy Appleseed
+expires=1672470000
+approved wildlife=North American Snipe
+maximum quota=Two game wardens, seven hunters, and a cow
+
+uuid=FD2EADB43C4F4FC7BEB35A1692DDFDEA
+title=Email Account
+category=111
+ainfo=wendy.appleseed@me.com
+scope=Default
+autoSubmit=Default
+type=imap
+username=wendy.appleseed@me.com
+server=imap.mail.me.com
+port number=993
+password=iINe4uig8suLny
+security=SSL
+auth​ method=password
+section=SMTP
+SMTP server=smtp.mail.me.com
+port number=587
+username=wendy.appleseed@me.com
+password=iINe4uig8suLny
+security=TLS
+auth​ method=password
+section=Contact Information
+
+uuid=EC0A40400ABB4B16926B7417E95C9669
+title=Bank of America
+category=001
+ainfo=WendyAppleseed
+scope=Default
+autoSubmit=Default
+tags=Sample, Personal
+website=https://www.bankofamerica.com/
+previousPassword1=speg5nu5di1mol4niev9
+username=WendyAppleseed
+password=reTDx8KHhW8eAc
+
+uuid=E482B70C038D4DD78A0940728FA737BF
+title=Chase VISA ***4356
+category=002
+ainfo=1234 *********** 4356
+scope=Default
+autoSubmit=Default
+tags=Sample
+notesPlain=Sample data, not a real credit card number.
+cardholder name=Wendy Appleseed
+type=visa
+number=1234 5678 9012 4356
+verification number=543
+expiry date=201905
+section=Contact Information
+issuing bank=Chase
+phone (toll free)=1-888-888-8888
+website=www.chase.com
+section=Additional Details
+PIN=000
+credit limit=$5,000.00
+cash withdrawal limit=$1,000.00
+interest rate=29.9%
+
+uuid=D1820AA8CB534AC6A4B5A2C0263FD3B2
+title=What is a Secure Note?
+category=003
+scope=Default
+autoSubmit=Default
+tags=Sample
+notesPlain="
+Secure Notes enable you to keep any information in freeform text format while keeping it safely encrypted along with the rest of your 1Password data.
+
+Just like the website passwords and credit card numbers you can store in 1Password, you (or someone else!) cannot get to your Secure Notes without entering your keychain’s Master Password.
+
+This provides encrypted storage for your stuff that doesn’t fit into other areas of 1Password.
+"
+
+uuid=D8F79F17D6384808848B213EB4946ECA
+title=The Unofficial Apple Weblog
+category=001
+ainfo=WendyAppleseed
+scope=Default
+autoSubmit=Default
+tags=Sample
+website=http://www.tuaw.com
+username=WendyAppleseed
+password=tiac1nut2jab1eiv2oc5
+
+uuid=F78CEC04078743B6975511A6FDDBED7E
+title=1Password
+category=100
+ainfo=3.0
+scope=Default
+autoSubmit=Default
+tags=Sample, Business
+notesPlain="This is a sample software license.
+
+1Password securely keeps track of online logins, generates strong passwords, enters personal and credit card information with one click, protects from fishing attacks, and more!
+"
+version=3.0
+license key=1PW3-0000-000000-0000
+section=Customer
+licensed to=Wendy Appleseed
+registered email=wendy@appleseed.com
+section=Publisher
+download page=http://agilebits.com/downloads
+publisher=AgileBits
+website=http://1password.com
+support email=support@agilebits.com
+section=Order
+
+uuid=F5F099B210F248348E22934DDC3338B2
+title=TextExpander
+category=100
+ainfo=1.3
+scope=Default
+autoSubmit=Default
+tags=Sample
+notesPlain="This is a sample software license.
+
+TextExpander saves you countless keystrokes with customized abbreviations for your frequently-used text strings and images."
+version=1.3
+license key=TEXTEXP001-1234-ABCD-5678-EFGH
+section=Customer
+licensed to=Wendy Appleseed
+registered email=wendy@appleseed.com
+section=Publisher
+download page=www.smileonmymac.com/TextExpander/download.html
+publisher=Smile On My Mac, LLC
+website=www.smileonmymac.com
+retail price=29.95
+support email=support@smileonmymac.com
+section=Order
+
+uuid=F3707FA58EA7480884BC6A662658E039
+title=Business
+category=004
+ainfo=Wendy Appleseed
+scope=Default
+autoSubmit=Default
+tags=Business, Sample
+section=Identification
+first name=Wendy
+last name=Appleseed
+sex=female
+birth date=361778400
+occupation=Customer Relations
+company=AgileBits
+department=Customer Care
+job title=Manager
+section=Address
+default phone=(555) 555-5678
+cell=(555) 555-1234
+business=(555) 555-5678
+section=Internet Details
+username=WendyAppleseed
+reminder question=What's your favorite application?
+reminder answer=1Password
+email=support@agilebits
+website=www.agilebits.com
+forum signature=1Password — Never forget your password again.
+
+uuid=F7883ADDE5944B349ABB5CBEC20F39BE
+title=MobileMe
+category=001
+ainfo=wendy.appleseed@me.com
+scope=Default
+autoSubmit=Default
+tags=Sample
+website=https://www.icloud.com/
+notesPlain=Sample MobileMe account.
+username=wendy.appleseed@me.com
+password=iINe4uig8suLny
+Member name=wendy.appleseed
+iDisk Storage=10GB
+
+uuid=4E36C011EE8348B1B24418218B04018C
+title=Company's FTP
+category=001
+ainfo=admin
+scope=Default
+autoSubmit=Default
+tags=Sample, Business
+website=ftp://ftp.dreamhost.com
+notesPlain=Sample FTP account.
+username=admin
+password=auj7r5?u61ww
+path=/home/product/secert
+section=Provider
+
+uuid=5ADFF73C09004C448D45565BC4750DE2
+title=Tumblr
+category=001
+ainfo=wendy@appleseed.com
+scope=Default
+autoSubmit=Default
+tags=Sample, Social
+website=http://www.tumblr.com/login
+email=wendy@appleseed.com
+password=vow6wem2wo
+
+uuid=72366D161D9E43D98E58EB801DAD1EF8
+title=Last.fm
+category=001
+ainfo=WendyAppleseed
+scope=Default
+autoSubmit=Default
+tags=Sample
+website=https://www.last.fm/login
+username=WendyAppleseed
+password=dowg1af5kam7oak9at
+
+uuid=D06307ADA44C4031BA2FF4B174DE79CB
+title=CapitalOne MasterCard ***3456
+category=002
+ainfo=1234 *********** 3456
+scope=Default
+autoSubmit=Default
+tags=Sample, Business
+notesPlain=Sample data, not a real credit card number.
+cardholder name=Wendy Appleseed
+type=mc
+number=1234 5678 9012 3456
+verification number=123
+expiry date=201411
+section=Contact Information
+issuing bank=CapitalOne
+phone (toll free)=1-888-888-8888
+website=capitalone.com
+section=Additional Details
+PIN=234
+credit limit=$8,000
+cash withdrawal limit=$2,000
+interest rate=19.8%
+
+uuid=27DCFA2810B24083A3ECC7CEABC7C0A9
+title=Orders
+category=102
+ainfo=10.0.1.50
+scope=Default
+autoSubmit=Default
+tags=Sample
+notesPlain=Sample database account.
+type=mysql
+server=10.0.1.50
+port=3066
+database=orders_production
+username=orders_app
+password=tgOhmpU9HgC5Hz
+
+uuid=358B7411EB8B45CD9CE592ED16F3E9DE
+title=YouTube
+category=001
+ainfo=wendy@appleseed.com
+scope=Default
+autoSubmit=Default
+tags=Sample, Social
+website=http://www.youtube.com/login?next=/index
+username=wendy@appleseed.com
+password=snaip5uc5keds7as5ocs
+
+uuid=468B1E24F93B413DAD57ABE6F1C01DF6
+title=Dropbox
+category=001
+ainfo=wendy@appleseed.com
+scope=Default
+autoSubmit=Default
+tags=Sample
+website=https://www.getdropbox.com/
+email=wendy@appleseed.com
+password=vet4juf4nim1ow6ay2ph
+
+uuid=0EDE2B13D7AC4E2C9105842682ACB187
+title=Personal
+category=004
+ainfo=Wendy Appleseed
+scope=Default
+autoSubmit=Default
+tags=Sample, Personal
+section=Identification
+first name=Wendy
+last name=Appleseed
+sex=female
+birth date=359100000
+occupation=Customer Relations
+company=AgileBits
+department=Customer Care
+job title=Manager
+section=Address
+default phone=(555) 555-4321
+home=(555) 555-4321
+cell=(555) 555-1234
+section=Internet Details
+username=WendyAppleseed
+reminder question=What's your favorite application?
+reminder answer=1Password
+email=wendy@appleseed.com
+skype=WendyAppleseed
+AOL/AIM=WendyAppleseed76
+
+uuid=13C8E12AC8E54B1F873BAB0824E521BC
+title=Hulu
+category=001
+ainfo=wendy@appleseed.com
+scope=Default
+autoSubmit=Default
+tags=Sample
+website=http://www.hulu.com/
+username=wendy@appleseed.com
+password=frirp7i1ob7wig4d
+
diff --git a/tests/data/freddy-2013-12-04.opvault/default/1C7D72EFA19A4EE98DB7A9661D2F5732_3B94A1F475014E27BFB00C99A42214DF.attachment b/tests/data/freddy-2013-12-04.opvault/default/1C7D72EFA19A4EE98DB7A9661D2F5732_3B94A1F475014E27BFB00C99A42214DF.attachment
new file mode 100644
index 000000000..04d6a3ded
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/1C7D72EFA19A4EE98DB7A9661D2F5732_3B94A1F475014E27BFB00C99A42214DF.attachment
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault/default/2A632FDD32F5445E91EB5636C7580447_8FA293F2B001459D8F8F78C21E6BF9F6.attachment b/tests/data/freddy-2013-12-04.opvault/default/2A632FDD32F5445E91EB5636C7580447_8FA293F2B001459D8F8F78C21E6BF9F6.attachment
new file mode 100644
index 000000000..c56f141b7
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/2A632FDD32F5445E91EB5636C7580447_8FA293F2B001459D8F8F78C21E6BF9F6.attachment
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault/default/E0D293D29B10483F8DFDAC72ED0BE5C0_898CD4CD00164930A2E15B159CE65E8F.attachment b/tests/data/freddy-2013-12-04.opvault/default/E0D293D29B10483F8DFDAC72ED0BE5C0_898CD4CD00164930A2E15B159CE65E8F.attachment
new file mode 100644
index 000000000..77282dab1
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/E0D293D29B10483F8DFDAC72ED0BE5C0_898CD4CD00164930A2E15B159CE65E8F.attachment
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_23F6167DC1FB457A8DE7033ACDCD06DB.attachment b/tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_23F6167DC1FB457A8DE7033ACDCD06DB.attachment
new file mode 100644
index 000000000..a1c1dfd5a
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_23F6167DC1FB457A8DE7033ACDCD06DB.attachment
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_AFBDA49A5F684179A78161E40CA2AAD3.attachment b/tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_AFBDA49A5F684179A78161E40CA2AAD3.attachment
new file mode 100644
index 000000000..78bcad110
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/F2DB5DA3FCA64372A751E0E85C67A538_AFBDA49A5F684179A78161E40CA2AAD3.attachment
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault/default/FF445AB1497241A28812363154E1A738_16684B74F26145169EC03B950DC68E95.attachment b/tests/data/freddy-2013-12-04.opvault/default/FF445AB1497241A28812363154E1A738_16684B74F26145169EC03B950DC68E95.attachment
new file mode 100644
index 000000000..badcd4235
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/FF445AB1497241A28812363154E1A738_16684B74F26145169EC03B950DC68E95.attachment
Binary files differ
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_0.js b/tests/data/freddy-2013-12-04.opvault/default/band_0.js
new file mode 100644
index 000000000..4e62ab08d
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_0.js
@@ -0,0 +1 @@
+ld({"0C4F27910A64488BB339AED63565D148":{"uuid":"0C4F27910A64488BB339AED63565D148","category":"099","o":"b3BkYXRhMDEIAAAAAAAAAMQDerODSnrtEVkZHp0tO5qokNWe+77F7yjsHcCvBEdxYL9DPSUuPV4FDv1F4E3VXWoY4BBYZrm8G3IUekJhL3E=","hmac":"SP8xH51\/qYBOoiCzKWDDmyNluCdPiP4bzOPR2+eTTh0=","updated":1386214150,"trashed":true,"k":"6MnmUT7fNchO0lIDNYGITOAO0cubw8Qsad1dEBZFCUSXrUOR7IkFUwddSA8QBJTH7P7iJytKB00KclFRNR\/zf+AC+VD6aCQiznj1zx8uKoxG9Wv1v4YsnH95NbC8UvRxCn+XA+6WRZII2kWN10IN9w==","d":"b3BkYXRhMDECAAAAAAAAAO\/uG7Zs+1OHwr82PByk3Scrlb7f1QGT0EThuhBdj50T3qyvt\/uoxBb8APNUDjTV81dTjBoNvLCpvuAEyQgdmlY=","created":1386214097,"tx":1386214431},"0EDE2B13D7AC4E2C9105842682ACB187":{"category":"004","k":"A4kIEzE7ypBL5lTeguPoFPlD21Uv5akEeosVZQ8u98BIBnMqScGmLJTlCoAgvfn+1YjgxQX3vZJTMDUcmt678UuBVMMehVg87Pys4hMFLNjwhhJaFGSRpSfWDlVB6Rb5PGrkkIDZBPkK4kFbYMN1tg==","updated":1325483949,"tx":1373753421,"d":"b3BkYXRhMDEYCAAAAAAAAOX\/h3yw\/qsvS8loinC\/IeaownXcDlKuIxDWIhQZJ+wZSmV43jY7n4iCxG6Fg8qIQm+l1Tu7M3oTOwsRREhbqqEsQHnJSts32+nxh5K9hgcCKYfKMbPB13pQlWamGUMX7tCLno8w+8XQnI8izoTE75klF8z+jF+LjGK3IhQ1wm4hCqWje0j9brjGId8KPrQoVIorzROtYfBKYjEMu5bvhCI62KWUbyBodAKoYdnHK7bSs01GvY\/tPyXPZ4qyQ7qrou5uDJNclYQ715Ajbm4sIDbfW0qtrYeSA6+uFT6ClxDccc9+RvW40vgaZekx8yEa6ytrZ744JlnKGdYQrecV8WDjIiVzgZrTV9GthzPzrUb8JUA\/naBufQNlQVISvnFQUXM+S+E8B+FR8OJDY0g0VNMkQ4BxeYyAlZB9395DcJfrzu7378PSy0egyNoWKM8PZH\/HHYhUlWMWMkP90r+iIIFnp9XpAXyetSUfIHV\/nRP0wBxvgBtcz7BBsjMwHa965K5KOQxZm9Nb9118IaUiXfG4jU65M1keJBa4fOUlka7QK8Q9cYHQZNY86PMrdYjDvG6YhL\/aNjQ+oWUpvtyZnFAdwe7+5Zw4TuAKXf2SiWcKzkGfbNLZxJJY95eVPfv9lSYrZay4LZKtD8WP\/X6G8w8+NlAMESiZkwhx+w33HgTzVIbLqvTFcIAgXbcCmNCfmIW+VlnvXtUZCjs9rI0KC3rXLE6OUBo3mJTy1+2iFHk3ed1gdlDWX0mWe4+CI\/4Q1pAxsXnqATgLM8dep6fySXKYXf44mj0t03jQXnm8t02FPK7lhPjjGddntqz5idk1jVFp\/wfDB4j+E9EvszWJyP14PYZRIyIOS67wWs0mKHeLdkoOeEGxFf\/h5IdDEOxm4xe\/+8ZfzTjPPrKX27XJlT\/XbVShvLbru\/ToP8qLqaBq\/7c6tmKhUvOLg0M5WX7oEEq4Rqk2qBaRmNSfd9ke\/AECrVzlqTRubVgfA95G7wAOERT6aa0wJZ7JxFj1ynQVgFrSTHyNSeW9n42TWGO\/\/6w\/hmDv5jJ\/IEJlc2eW0wPRBRCjWE\/cz384nVU0d0ixucYzLlsxyXn1GzseMa+u0WqyKHvJrXCj+6L1GKokp42yLDJVg6WO7EiS+sVcc\/WnTOdxfh8WMrexEfQS3jlL+d1IHt58c3kfjxhTX48Tlhj9Ih3dWW5xwK5JiVM+Lumk+IKhpEHpIu46YOQfbyK6ETqHNdKYiBOQByjCPq\/MftDPXKH8bAyOe5pMH89SYs8Y0TdSqIRsSyVWBKYkdcRp\/bpMB0CRJcSapkpQSMDOpioE6PkIuhGXNENT8EDBlM477yPxorYxHxLdzusOsxzzRBgc120ezJQALoWTgCy54LMYQlNj4Xajw00V8EnyVaKD7zfkhvqo6bTveR89mNQL213bGeOvEbOTDizNYgWpFGJb8WgD7Ji+Z6qd0vfBm17r0A2SNCrtHG8Fp1q+Qh0DR+94nLdN5R0Ann7LTgLbi2LhzQyr9KdBlLA73SRQFvaMsmPoopO46Bf21LbY3IeVjHDRa8253zs2oASHrTNFnki7j1byyVZQDRQwMoAXJnNZre+CzhCYdSA8pERPKihODRpXpq4NSSitWKMAKIqqoDYWzrZmBiTLFwF0SxmYGpkTn6AdMjexp1Xayx+7NIOTui6yaUmIf\/MEm7hfOfN0SHZOLYA3FMOa8mLCLU4qdnQTZlK\/v5QLcBTy2WB\/RZlbyX3nXb2ooE4kheMA6dtPI+OnBSIkbZ8nRzJx1eNfuOqpxS8H8M1oQ96I1g1LyX58VDjlHVcgrpVXcta4uXb4y9ZbWCiS5C3DEPlx9FAb3HwKgsvnArkNP8k0QIvX6w2xKAOv03bafVETG3LUh5OhQDKZkoRjR6sOcBstWLoyL8yJKj6YnoVNcLdHW3pvlbaKvETb\/Q5y1AE81XYADWWbMQo8AHg7lMpGyG98KuNr3WI9X1T7GyJAAaSXIYDepa\/l9icfqEUPyYyxxOUBjTjtdhSHFGCwoiu5rnGcA2Nq9v44ZGOGfy8tLzbzoMmZf3+qjmoSgmCRDTgCuWuSDixEfo65BNC9sRYPgf0JyYrnW9oBB\/\/g4lkzEv5B1V6leXQonJQ6vPKJbOWPDsZ1R8\/3\/dxPoNOjfp0J59ndoboOX5E52meVIQ99GqAAmLSWCNU76IZWsnGQHBmsaZqgHjE5E86D21rSVgOaKzN4ngvXd5fbaJn7zVvaQwh26uBT5vaTtZAc7UubBzj5FrnXC0j8Tha6nAQ4ZYkqhIQK\/FjWgpnF61D3v0TYwECNQU5xNOaSGaS4jMsrX77PnrNUnAq7Zc3ainZtZ1fK9A0UevqonpqkH3RDC1r5QcAU+aLTV4AyG50F16KMgv\/Hkib\/GoY67qO+3IJuYXPdhjHRgZajl3XC70d9Agw0uMEFhhvhaEEJ6hL6qKXDzQ\/CjddIiz2l2tb+7nnugCggc516CXoGQIkTEjS5vBeAqkhtcyBS3F\/W4toATCIZPPm8U1E7Q2tURWA9P+lKPoOvFxGLANTVh6BxiasOMKes8IH\/6E3umpV5ajzcZYFeoNDrUcYe0nXRbfOnhM9VyuIcoJnCfJHZLXJ1MUCdmht5sSy78SVHI8ngwOjukM60fHK4mqjHL6qqexVa0+7N\/iKNdF4m4\/Fpx5CKoy11nDEhAq15MrYk775hs98hRLX\/h+WPccbwxX3+iDVLiLrFoujVLbzKg1\/ZqP5NQmEuN3hi27rA6j6kyPOs5lxXqG6EgDBGVLyeFlacXK1tC1ELuW4\/HlVGC0GLACo7x1OfU3VK+y1efUrSTTzgZn4=","hmac":"NFYnSILBYIuaRNngAmgenlKVIzQjrNI58924O9wVtP0=","created":1325483949,"uuid":"0EDE2B13D7AC4E2C9105842682ACB187","o":"b3BkYXRhMDFSAAAAAAAAAFx\/NqIo8EXowE0JkyOXYU9TwZBTupG5WKRVaYrA\/nU6Jy2xC2eyZV0SGmRVS8yt0A0eRVEBXGww2UV928lrUYGpT62kMa54yPHQ6PJ\/SBw6BITIoZqX91ohdcm+vUDDwkoNx4Vm+0VMFkBHRnAtT+cavKUMMmjdWrQ+0rEoWIVtZF47tOOUhh6HdGiY43ihsA=="}}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_1.js b/tests/data/freddy-2013-12-04.opvault/default/band_1.js
new file mode 100644
index 000000000..2743389b6
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_1.js
@@ -0,0 +1,24 @@
+ld({
+ "13C8E12AC8E54B1F873BAB0824E521BC": {
+ "category": "001",
+ "created": 1325483949,
+ "d": "b3BkYXRhMDF8AQAAAAAAAIj2+ycIIdHiuA8R2GDHcmD/kq9Bski/xVY/MzB5rKTOf2Ok7u9iGyq52/H02zob8xQAlMgVgCT3b6ZCkdNCiDM9G0Io+cOC1c9Z6KwY+AWjAf6N2gUdVthpHGSjSWHeQg2I+B9rZw8G+5hDWoKCNkz59sHLDVzb1utpTX/yqG//rBwdReGMcsMLdJ5i5z6rCNxDOzauJsPOmdND6Yl8qN8biW1Zi69j9yecKlGKbZGnkJ/BLGcyATw+kFTUjSIqpGQuJjRil25+iSyOQIRyaFZuI8LY0VzNwDXt630uVw4FCG/BlWDEFMxWD2MByKVFyMCXb/4jyL5EatoSfuUfcgUNjzcxMUDkZ5arCDy3nkycKUnnYEY/8mxw4TB8FmQNjtDcSuV+CxZXtEdnkQtxNh/j8DIFpxBqDcKmEkXDFkoBzz4JMttkJI+VUAH0rt6xFHEQBIrVMJiqc1oCLBpDCM2ttz5Bex687+zjo1PkqNC7rNKz5pc+2oT34i56z9BOSCUJNnPu3AbXqjTodWi/t9uQ8XbzozvLHgbz/YX4CwcjvNShZUywWScls8QwrCyHvQ==",
+ "hmac": "rBcqgatstCubnHbtCS4hTZ3iyh6Jx8c1pxJCwXy2dAs=",
+ "k": "Q/2/LDLfd1NAkd0nTzKgs3WlDvPtLU4iZ8RjpPCD4BCcuosWxud2r1vz07B7T2glcdW1Wm0eK1jGaJsSZ1mZARiUfkY8yyFjKHaw5K/S+TYHV2ypQaZwIH+qs9qpzRKgTIriMK6ZfWHOJAMPrB991A==",
+ "o": "b3BkYXRhMDGLAAAAAAAAAPKPZ8R5CHeY7YrgLUdA5b3Ay63vr9yrKHxyHmBgeHCmSQVM5RwqwEVQrbuNDNqQxekF6gKL1cB/P63ZSMfjYVtRGomifY3WBNsjbf8UYffI5mb+yOaKB9U6m300fbkVQshrVWTSwibhZe0nl6V+OqqyMJ1lWDRSt5fnuYvsDBUlggQ5JyZTGTadGAwpi12LihW/hpSEqQSoKX8KTkHivnTP47TETjYqTdP8XBUBQqz9XXb5R2o3GcRrID642HAzgg==",
+ "tx": 1373753421,
+ "updated": 1325483949,
+ "uuid": "13C8E12AC8E54B1F873BAB0824E521BC"
+ },
+ "1C7D72EFA19A4EE98DB7A9661D2F5732": {
+ "category": "103",
+ "created": 1370114995,
+ "d": "b3BkYXRhMDEKAwAAAAAAAKRrSzqtu6qyKtAvRqceTqZtWt2ehX/OlzSgl8+vLzoU0FjWtb6pTvUZd+YexvO/1GwwaI28vEWHiaZoBsXMWjJf7gdJkW7vEZyXvuXnpb7aIy7teoyvZz8t3xwugKIZ6pkdqoY6af+qRpWpIZHeKMfOX/2RCuh2V9c4tpO1ZfVqHHDY68yL35SknbRxS4oLdGASa8WiENbLdl4uWZhgEqkQsB0HqOACRKilT8+/TFC5Nhf7zKKIZk3b6mSgGmhgTshUs0VQG/IyvjN3GVfI6Q9cZyEMItow2XVauVAsLMry8x1qALt+C5yTmly2eAIhzh5EHgEE8IHGyYO8qHV0S/rwdAWqUlljVQ3jzxwpPkaBq4RM8zLiJ0he5scOSV/qxSLvBy2OJ4lx9tpuiehKKI0/kRjTXgirsEA4O0lMBn/J3jNdAco4DygSD8OUzhA0IZEz5TWv1UCrMQ0QVc7ljlQLb8H5KAZ4xIue5Wd5FPi+7SVk6VBhJZFZBtssy23tklpmIxvlrt9axmSgLxEMUuTSo7Hecexh5+/1LVQeDtHjOXA6XrSqcFkr1t2Q94mXa+hVtLLPCnf8DYSgdUMevMgNqgKi/TWh64GqoPvxx+HnrBLH4WEIpBZhgIKRNuww9vkMaAYw+RtpPMcZzxenJ5htM8ep9WRfwYg+Mn6yCijYZgQseZFnz5EAqTzXx1CzP/vPK6IQlGmZy0kte8VLPbngSMaUoQFMnlQNTZhHwm85N+wdvDVZStas1oFUUtHLLSt2KCPMwVmuoiFevO6Zlstys3uy9ATLOXiRTP3MBEu5D1ahC2+Mvi0FDtf+YSi9UbbCBF/4/gNt3eSveNBz6q9LsBLTdCMVz/HVjQpn350irDKr8+D+6PLx/yisia0L4kNKUOIgRATpIGgODaBDjslZRjntAzC9eRT52hbbSyvAsTgNnsriBMXE4UimwwHe5RxPBOshuHrCnHjljqYVdgd3UrrTWMwQSorEom3i2kyryOEWrlZGCz/aL2D7T0Mw1SLxDJvfkVDBhX4wdSLQXXa6smgyRagvbxFzx9r3fp5zLJuwzc9aS1tKB2Pzvj34xTcTl9lzqzDtiMNkNQLYkHg=",
+ "hmac": "/wRZl/I6nGCLlYVALC2sOHr7GTLXW8PViyX+S37Gnsc=",
+ "k": "NaCkXC9d/ohnFWkalmyV/CfGxg1f9JqCLOdN96hnybygx4lPuV7d+XOhNkpUybQwtzCoKwGVPkp6IqOfa0s4aIjxbmHZ7JKX4YolqyU/IJRIJK+zVFXKdkH4jvSnf9WLPw5odKypNLAkWwmz0rGNuw==",
+ "o": "b3BkYXRhMDFHAAAAAAAAAAz2opVfQ3X6CoxN8yqzudxCe4dcegs++FcJQKDDzGY6OsA/3yP3Duoj6lbDcAkFfZ5s7OGg7HqmiIh8q+MhMUWFjM20cstKN4ghssKJzaSJgYaA7vj3OQj7H0/Y+/frnfy8E1jxpVim3sdihUcw8TbzGHgLATwIsxdQCK+KqO/L",
+ "tx": 1373755270,
+ "updated": 1373755270,
+ "uuid": "1C7D72EFA19A4EE98DB7A9661D2F5732"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_2.js b/tests/data/freddy-2013-12-04.opvault/default/band_2.js
new file mode 100644
index 000000000..5a27848ff
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_2.js
@@ -0,0 +1,24 @@
+ld({
+ "27DCFA2810B24083A3ECC7CEABC7C0A9": {
+ "category": "102",
+ "created": 1325483949,
+ "d": "b3BkYXRhMDFDAgAAAAAAAEyAoreOe6YJDuid/4d+Iku6EpI5wiM21L7QyH4nQCdqsFff7G74sUOfg2959KS+c/m93Bzsq9cm4iczcQ031F0pI24q9u4Qdo7shN1lyglnMXdNq8SURd7pP80XACSeLvbMwV4AovNe2tQZwt04wIAXWenafWb3ooEg1Z+1///xsNu+LuNn1s1OVozao6Ko8CGmMkuNOEBbcSLJyWJoMubdqnTPZPZB/Hb6gYmJSuvEhgi5UlkJXQThT+zBU7OxjIyn3Se/Gbb8ULiW3SyHqkk+ND8eglFFowfg7DzTW1b/bodK6OoiYthSEMhS2YMOL2eCN7QMaWXRC006StHEbk6QsK2lVNY61aCj8aOxVDdxbJLVh2XWHrjyoXeUX5y5MZ6DMJP10KNYnhsB13GNmJoC6LgP9FkkhX3RmXY85B6xgP7pyuoc2qYJ8IhEtR8TUBclRd4OTtaW2ppP3rkGLpvAC34WvjgsXfJeGCLZl8s6hO0RfGvlL3ssFYfRk3YqazUX65gwgWZ+ahXcT5lPavGB43GSmKykNMKhpG7GGYc1rPCxef9PyhBhLXJdDyj7XOAA6EZuq2cP39+bitPfhbBO82vmXP8ozFYcCoRZfa/nuJzXZ0gsHIFlW+MmtfTQ2Ig1rBIcQVWssWuFgi8q0dCnJyotl1jvM70BwNP3bG54v3y7sglCN8rCQbk33ECGsAsaSDhQhYHN/JV86TGvYcF83WN3W6wyVfHaPlTGMttuQQFEUpJSyLHw7jipmTg1KgxhSqpTXDkAx8bS1960Ody1AOi6wQDk+XbHRR/lkF2FFd88JlD5V5+P4OVI1av9w8lGlbkZapT0px54tRzfCHg=",
+ "hmac": "u2yFnVEILAki+YP5dmN/gbSflq8vyKd9Aaby+/R82BI=",
+ "k": "2WbOqqNF5mqW9d7d/Npd7CpSTdEL8wwzUIHYpvJNsInJ1DuXkPnKxxWDiLVaVn/kMFo0ssD9U7+GPzp6gJ4kzxKw3OM5W6XfJdMiByDOwul6RZFAgAhH0oiv5JeYUsN7AJKkBWskZK35txYvHROFLA==",
+ "o": "b3BkYXRhMDE/AAAAAAAAAFlrCvy386Pid7oc4h8DdsFwoeK+rW0c3dtT75fhdL5CItIh7DHMrh1FAnXEeQ2jNlnxNjJpif5Eg9YD4+gzdYTMp9shvndwSHCgjGwZxkeoV/5Rf6TEDZq519yfwz2Yz+qHfoAJwogUokFwjP9i110=",
+ "tx": 1373753420,
+ "updated": 1325483950,
+ "uuid": "27DCFA2810B24083A3ECC7CEABC7C0A9"
+ },
+ "2A632FDD32F5445E91EB5636C7580447": {
+ "category": "001",
+ "created": 1325483950,
+ "d": "b3BkYXRhMDFDAQAAAAAAAFAC8wz9EOSY6x0PZoJnNWbYplXUkyusprslpTLDCTQc0hPEhAZRUQU416rdA/SutvsnG9AUhSWSQe8CX0gJqwCUGQRmo4+krdA7vrR+CmWzQb/AP0JiTew2aRE4lc6rq1NaO9JbnPWa9YwAv2PddpK50sN1tQJn4VYJGesuYIiS6bdiaY1KQ1AdHilZe2VBDUIHfN9KVfWb3fJmCq2nwnABfBytNXENHvOhFg/nJDr1Z0abxc0amS6oTJ2aXhL8EQ/3diLB2qklh8+LMdxvLeF6QLlIlZuxPwQr372sGPrJqoz8uvKVToEYNtoY27W17xEsB+hIDARkuJBXfElaQ36F3peUuaGrAhUCRL2g2lDkLXuKUnfHtanONBOD6dayQs7RiDlBmrPc5/YNLTCwTrxdgNECiYiAhD/Mm2D6Si/umojN08UbFhltKP9YDjM6jgXdGDbYuQ2IKRwZKpHFVNtohORfQHYmud0HqqmMIWrwSyLwq8KpjpmMi8TftOusng==",
+ "hmac": "MgjPy9MB80eoreKhbqI1tjwQ8EpU5W6PK2hPMcW60b8=",
+ "k": "btfq8UDLgzCLQw+xNAAIc8cdzXZUxIz6PILHwGhbY3ude0yfPSSksiYGa7p2weiM2dHv30hgIoBYqTgZbzVz04WmJOskO9CBjPPrqRzEm7OcqGS9UlnHv4+E/aBk74s350oTi36u2w7aIEjqOY8R6Q==",
+ "o": "b3BkYXRhMDHZAAAAAAAAAMvusYvnxIbWpwLZDSSorwy+jIlf0Og+FkkoIW5vtG+ASwB3oyLqlQHpsGFMhFjrqYcBr8lIz3aBUM559wAKzfLpY8cGjldTgRQaXwuYj+N2MhMgPC8OXAzn/oIEg2WF8tD2KXmbzBb7CwyW5wDJclx8XqGft/rQhKIjz1eZ5qqwK4OMbS8m5kSHp8AKivCFIiVX+7Y+QDUkqKuQyTVCHacKUpI47IEdNxWn/FxKNE1oxRKLv+biYaB4I9ugPvCr9UW/lpPZgnoVD407ZSe9GPBw75NL/tbyzK6s140qxXhscUKwesLuCoXhWyD/5DKHrtMlErWM8I8CGb92WQvVzrLyszr2Vfg1V6sdL9YmTkN6",
+ "tx": 1373755400,
+ "updated": 1373755400,
+ "uuid": "2A632FDD32F5445E91EB5636C7580447"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_3.js b/tests/data/freddy-2013-12-04.opvault/default/band_3.js
new file mode 100644
index 000000000..dcc4471f8
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_3.js
@@ -0,0 +1,25 @@
+ld({
+ "358B7411EB8B45CD9CE592ED16F3E9DE": {
+ "category": "001",
+ "created": 1325483950,
+ "d": "b3BkYXRhMDEGAQAAAAAAAMxxfx9Ei8WUX9X10+6Kxgydhp1zbbdPIBJ/MLSii+gEhLcmDMUQA1AcTKEygw2nNqCrdJh98c2noGtV2qjsZnwiUCEhWMNCTpu0jeKXVBu36zZLwKb367D4cU20GDO8nMIXxlkFKwO/Ni9oAFGkl4ZSsSgTcmDqNtbTa+EXWTxBX5ZL3WawCtzYG3RmgVoU9hATk+kM5ZRJaR6s+mE+DFvVMW5U3g630EkGzf/gZnq3x2KHAuHt4PIWdSO+8lwCjbPKYbLoSS9FtqDkmLsiVUcOtW2uxwxKtBkJ0OUOLgkUCDCNG8sUKwtOtAs1+kO73m4DWAEOhe1994PNT8Qu48HkrmMh6KeG7buftl0vMf7Duq1JzAQ37zmPZ9cJlqpQRJ1H7oj6fVKPhfPFHxSKWcXUHJ4MwDc1KAxphi8gRzbt",
+ "folder": "379A3A7E5D5A47A6AA3A69C4D1E57D1B",
+ "hmac": "/FLC0nyA/eYKQ6vIRDDMScZLrJLTFExu4CQ/A2R3G6A=",
+ "k": "AGZoorj389dIbQQKUEgPR3gPuh0T7N3RNwbY5gBtD50yrLByRtc9moNTgeHeayynwiz52vspjCF9214k3CXUJOVRHcZnWFTb12xXomrfkTBR0cd/wLsoUZufzoG0vCUlYDrI5CaFBY4a0vgkdaGBpQ==",
+ "o": "b3BkYXRhMDG2AAAAAAAAAAUcSSE9Pr1ma4sGgZPQzjSCCDwKleyuTm34b0i1k1OSX7WJeqRo4B1ToIfoxSxgFhZ4wGvzkQvBS7/E3IZXND+b3iKiGYDWBElKz1wZiraRhjEaSs1turD7p35T91asK05uqQlVehHZuEGXgm87aQIMoUvgkAND0Q4jYd8aGMechyQURQ5vQdKaP4iqlYGaFqEOh1nRTfZUsyV6yuFJLAHLc6fb+eE7Hum5iwS9fS1JE4KZdgZmETY+0JvIhMEp+vsZIYdVlTTaWJxvU+imEee/V2cx9sn++G2nnuM9obrGaklaj5W1ysu4BGEKnYw9dw==",
+ "tx": 1373753420,
+ "updated": 1325483950,
+ "uuid": "358B7411EB8B45CD9CE592ED16F3E9DE"
+ },
+ "372E1D51AA1D44CB9F17D8AA70ADA9A6": {
+ "category": "110",
+ "created": 1370116532,
+ "d": "b3BkYXRhMDGFAwAAAAAAAJIAigy3ZztWl46Kx16K7KgQOG6mQpq9dv0LWtLF7vbFaK4wZU9bq9kv4FFt088kLAjAH2ToJMyF0QiUiQDxix56mahLDjee22iUbvVaza/QSK8SfHFEpyR1Ecg2MRsXvn2DrwUPNsIrJJ2X6kdZLN5duXZGuhqLDITxx7eBOF+J5UWyjIBGDJNs4q9kd/B+W30YBtolRhzaHNonaNAEwEKOYxBjOnEE1oO3TwVRYqq3IT/fqHpj2yVfTMKa8WtLy2g4rGGe+8NzkiXPMND2cYRo+8jwsCBY1Zxvqw0149k/Ly6cUam0nAlq7NuDfpoT9J5rCC1UdFNKjE88Cfoarxcl+Kr3ZbYFQA3POhVsgFusQX1YyKZdxZWlfyPWb/SvkiD1vQmM5DhOs5XLONnXDTKr1xbWL+zlJxruYSWRxM5qD9oexnv1U06FFOUVDGpFg9fzbWmbkS9KBSGsUIyeqmmNFMa+5WgJ2Q4olZXUE81WTsPi2FerncvHnGd95n5m5BW85icZwIH+0pPUUlYFljhruBVXa5+D/GMX1DAzpBHRaEmgDYMJrhsLgaArXJiDw9drHKP0gzqVM4Ma0TX9G1Cr/mMEW2DaVtGNVywiTNSMMoqazb7hxTgITiTttShLv9nBUiw94vDKhcigD05lVXAsbXPqnZUwwGz4yCkIkhB3dH6u/9UBDqtB5hXFz/3taMPu3dr2G61Aqe3EU40ihz5D7Bp147SoBcuCyPeiOGzdfGa5zuGwC/IWg2Ii8nJgfhBAD2Va8hsutTI7Yc4yU4Ufla4cX6d0NH/bU6ajZIb2oFw3ie5fzyk7pInlWUhR41z6CISwPRmC9SseTKQzZ3FsMqKZ5KcBNlYAu0v9IFawC+kjKrMwKl3W6NKUkAR8AgM4HCyskjx6cbs52Jac5J3UIaUwj3zjoV0dH+6fOEuu44Xr3sk9VBJ6zUHiSV8OgNV1XEFlrqal+XfP60Rr5RaeztFWT7y0q+CFoS3ZKzNItudi0y1zY0ZnNsUbll2RCYlHULXE3Idxy/gsQJ29Aj39DTfbxvqGB9u6PUxewfvHnLkNXp7cjl3wE4IsaVHCNsL/ZBNgqwcaVVos9Wx1BtIWWhkOnmt2nrRIFz9vVdry8nEW6G+/IIFe+1e34oQmBSkGD+4OCGxGq1/Yctu3yG4QlumKa7SDIATG7q0iX0IMfFE9ws2RMBa7YawjMkRItFw2gn4Egzz8IPyvh328JssIW9oo2K/O0if5+ITWKvHvDDbi3M3FjJKMxDGPvAr2GA==",
+ "hmac": "ebtQCFBh6f8fdxLuO/3B3K8qoQrH2U96t+5yFqrEc+w=",
+ "k": "3Yy1faUq8AlFc/zDAcePMDmbqw/Y6vAs4bjjW5Y7enTU/ww9XDh7HEpVFiffEI1ETzuBOF2mnj4pq5/Y2dOiIwFS0tUqLwTSrIwHx2bnIohKygGz/52SpsiAeo+AB5D7UEVCaQG+RENvlUcD99cZvw==",
+ "o": "b3BkYXRhMDEzAAAAAAAAACY1JR1jdIYnvKtyFND55QYVRufOfs+Ple73caqc7u6VWTX77qZlqmrp+ihfaQQIm0AWFLvXWZHsp/08THTxBVgx0GwQ3iXJnGfvkhmeKiJYy3Lmb07alTphswv73ZZq4mlkpVNimYnpjbg+4S37v+k=",
+ "tx": 1373753421,
+ "updated": 1370116687,
+ "uuid": "372E1D51AA1D44CB9F17D8AA70ADA9A6"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_4.js b/tests/data/freddy-2013-12-04.opvault/default/band_4.js
new file mode 100644
index 000000000..99171a084
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_4.js
@@ -0,0 +1,26 @@
+ld({
+ "468B1E24F93B413DAD57ABE6F1C01DF6": {
+ "category": "001",
+ "created": 1325483950,
+ "d": "b3BkYXRhMDFcAQAAAAAAAGlGNJ9in9DhzbvCPbVZnE5f5STx/5WJ7lB3irIT0npLHKxXvYi+bcYQK4kYbJbksYHsVS5mudX500yH5G155wpmlWfFpC5P+bHrZf0Ex6jykiOkpFOdOA7K9CIv66+z4613nyZujcslvAgKjIYB9zNbfep2kZwiW6ymkOvLiVrL31H+On6kDnF9K1cm/eoX75FJaVOVIZWHnTeyjbQ6BPxOTjTviDCFo9cKqlI5I7UzoeAXatgeyLhtZmwie2YAKRbZhzddo86sUnbG22Fb7PXxHpRQZC+rINqhyT1tM5a5dF1zpG3b56+d9APmaYm3bLtNvSV+z6/ueuwi+WQ5nDYXG5WzrkeDbidNkZQY01XU/YkNZt2rlZ+e49tDEvxA4Sr/0rFFh7j2+zSVYE4GJNiMMKXdHcnzyH+Rldf1zb3OJN2Pgtooklw2d1Omj1zmJAQu71FI1r7bGGxFR1/P910nnIpAHyD8nLO50srqkv1efJo46Biz7cp7/H5ZDMcKgfsBCsIEJCVLHd4Oz6nU3kU=",
+ "folder": "C8CE328220DF4157961787FBA30DAB96",
+ "hmac": "acLAZabMMQAHmZgNZ1nzTGzV3sBD974BHboOQr/EkBc=",
+ "k": "i/YaJr4KrTaO4/herbFX6rYcGmzFnBLyPSuyFhlMxLPcFP+c0a6x++BZ/DYQ8qPubQOa4HjHigcQFawcqkpUmAnP4lbeAPxXGjRcGp5TEORRp2WWzMItfL5f9IepUgjx8rlInWJEwSoBvz9uY2pjKA==",
+ "o": "b3BkYXRhMDGcAAAAAAAAADx6jShnR7SI/Qj/CJyyL6LSrCrFfvW52sSsdvg/fKG36swaSi62yrCrmXzKp03/bSlRSyNY5YsRzPU5weHdBk+LE/klsqnKyI/Pp/HHOFlZzr+HQoSA+PIK49HfFxRJNM7bFQQ3FQD6OXYmlY02hgdtfEFM+rXU4UrE2Zstv3lHMXLtzbNq4XY12qvoxjtDspQyMCeRmudOtzktiI0zzCs+tKUbd7vWPvwehx+/BpHmAmVkQ1RqFBsHmXWo3LRtEHBRrAsE1Vk0F6dh4+lUZsI=",
+ "tx": 1373753420,
+ "updated": 1325483950,
+ "uuid": "468B1E24F93B413DAD57ABE6F1C01DF6"
+ },
+ "4E36C011EE8348B1B24418218B04018C": {
+ "category": "001",
+ "created": 1325483950,
+ "d": "b3BkYXRhMDFcAQAAAAAAADP3hpn5gvc0E6c/jeTCZ3+WYfg5i0bvAV6/aL6Mj//jGn9Tn8pioTKNAEwqPqW4QyRDbBeNWasvnQc0W28JO0zVNBUGP3nJkboX7Wk0tNc6rOC1C916yhwxNbQtdXMzT9CFdanEnRxaoVEkOk6iz421A9qMyvDsx6d5PUJx46Q3dmIfvTvlmuaVvq8f0rkwjric5gINViNv9GzcmL8wOdBHuiB23uvoZZ5zsGo2IzfR/6xaVFipav45j0Dvgj0jY3dluqf68TdTfM4TyRHcgCIvd0dn5QmZIxB1PjRbH/9oECMKWcEWBCxISX8mpCVVqva44HErSF68ooPdelgLQkzMbv4Rf7seLnckyvfHqPagY+ENSixRcmMlh/eWtddkqj7uMSkPKJ3pVrymG8Oypw8o7AwEMP293S1fRLyt0kcq8srHcehEs3gVpnQR3pIYfvzxXv9YcxMeUmCgjCvy/B1VKSvoCRvMv3E+9d+djN595WiUKQ+dajfNFO5/cDYNtfeNzQopzuzGoKX3bMQUrm0=",
+ "folder": "617F428170E1455D9503EC75AA103859",
+ "hmac": "n/iVpXSy31QWaWlMvvurm9bWez9Xy4xJRZLklYbMIKo=",
+ "k": "E/icM7PfmTWXDfzNZ5qg9I8UFbhBl/PeE8lEAXbQWtaNA0ZcxHlpS/FA8g2orTpkHgdtWcGEhTYWLBacYJBKZojvFbBLg+5LQW6G4gXaqo1Axb8NWrH8s0e0a0S7r4smTZeOse4aBFnRPom2npSd+g==",
+ "o": "b3BkYXRhMDGMAAAAAAAAAOoU41poJnZBcj5J5rn8sA13uFYnvtvJsopeKlAgSByFPUXLoNDlieO3Z4WdQ1rJWc3+SgUybS6wbgXejydTAUxRIqEReKoVnN3PdLGRKix0LffTCNRwPHy8emssJSIz01QYG6b10eRQ/97tTrSyvUOY2LP6Ja1dm+TpT0AeTUpTIKtRrScbWBd67uPB2gnaBOVvf749JkG5/fukkIm6NM0oxUWfOEhFuneppHRgiYx03xxyOFLo0hkfhdI8pXeFMg==",
+ "tx": 1373753421,
+ "updated": 1325483951,
+ "uuid": "4E36C011EE8348B1B24418218B04018C"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_5.js b/tests/data/freddy-2013-12-04.opvault/default/band_5.js
new file mode 100644
index 000000000..ee33c83cb
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_5.js
@@ -0,0 +1,14 @@
+ld({
+ "5ADFF73C09004C448D45565BC4750DE2": {
+ "category": "001",
+ "created": 1325483951,
+ "d": "b3BkYXRhMDFTAQAAAAAAAA9fJBca6be+oz0ye3FsSVyJCY0AnQXWfJgYQgYThr4c7eiW5POIskdjdle535X+cfFdriq6OUxNv9VIbUn0QUI1jP+V75VDoa7pDIL+zpR22VfXsR6RY5S5JINpEbZ+smIrMFphM9+ToD/Xli8zxmcqfywSekbLMkITwpFfyv31ZlB0I2WZCABQ5H/P7+UIRfK+jnwPc5VkUpQW+Bf81OfTNKa8N2OH0XIUzQEKcAG6ZpBohM+V8RdVIR+7Zg77uskQU28n4gIdJi0jsoFyarM1NeCoysX9cpGJATcNNI8XKKU0LxC18yBK0ST6INXXQ9hSrG9wEv6cpsdix/GNkma+XaQp74Dar55+DnauAZpMEfJcGe6PKSLA8QfUYtiqqD9Voh2F60dyyIVqXcgdpeBfVf7jdygOXuG07dKp5qW1w1eUH8I7zLX8Y+msuFGRyHXQ1WvB4qU+iiHyy9nxP+HH4fJbl27fUJ5q3L01o96Wdi/2MVhAYcoY6RD2DlRVUJgXDW/abRFmYnyXuL6MnnI=",
+ "folder": "379A3A7E5D5A47A6AA3A69C4D1E57D1B",
+ "hmac": "U1LfhLPcGrQT4s1vq83f5ikspRc6JZyUFmzpwyX0Jo4=",
+ "k": "CcSDvXgNE+Ro5U+MXx6VoYgA29o2mbTP45K5GORJaTgb3lGvFLZs0Gs7eecAaCQw5w/fJI9Frl5pl9/ntH+jJy/SOyg5KBxsGtnkjG3LXOcEJck8BBqWI/T2dfwfwSIcIji9dzZvACWifGNgnMdzBA==",
+ "o": "b3BkYXRhMDGbAAAAAAAAAKl92atkS8UPkld5AfENoWUe4WN4E8iVpJ/bj95sFeIthtaAHWk3OFHRB5XuBunuM43sUpiAIbCVuoosOMMpM1dJX7gctwSgpHen6ObUx85NGpgGvk2rhII1CzPhER+ACkIlopVBJd9tZsXf9sR24pO62soASghk397BuyaEkobgEnS7x8pBdQ3rKnXBSO5HMdLmb9Iw0YFZYHDORrJoQN19TFqIH2LQHe2/yvdMGD7r/gCbHZR/cqPCnIyYOqvT9GSVcsnLwxC9y5PKLV6Mng4=",
+ "tx": 1373753420,
+ "updated": 1325483951,
+ "uuid": "5ADFF73C09004C448D45565BC4750DE2"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_6.js b/tests/data/freddy-2013-12-04.opvault/default/band_6.js
new file mode 100644
index 000000000..f5cbb07dd
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_6.js
@@ -0,0 +1,13 @@
+ld({
+ "67979020CCA54120BAFA2742C3F23F2B": {
+ "category": "108",
+ "created": 1370129714,
+ "d": "b3BkYXRhMDHAAAAAAAAAALKcrmbSK3N10mz8SnKVCpdQS2cYLptNG47UL3OT3kJ3HFTlnEZUlC+RgPGWt1ZTSiC+vGBFMIltHU3o1sJ/LxO7k8nSuX3Iky4BadclqAur8ux/kH2TyfBdWTu+sRSskE5tMb3SB0z3Yfv+w5nj3c7amD2eClrxwFyjW/Jv1reHAI4p3HD9bbDxVlVxHFuqsVlwsb8fiAdIXmhtf1ZQv8XM+Vd1KBSHaKC/nVcwyG/ZS0r4CyGdiQUq2bEvdERssRR1nzjT+g/sFseD8q4jrXVXhezXQdstl81GM3WSvVSm5lT/z6qMbCUrcPW7AZsFIcAMqtRHexBvKwfjpn3Tj5M=",
+ "hmac": "AVY2ZVXViuYtgfnSKShK/ZbbVn6T9SMfugz7F89Kd2Q=",
+ "k": "NwsqfULiH/XRz0LPCNJ5u1Kv4Onmqmeu1Ye4UKmipo6YspWDQ9zswlSWqgtjhKVzsv+eq9G6qQftYwG4cHbid18RdZksQWqDCrnE7arx9zwR9mYdxB9Eymb/nSU4o03D9pkAk/niM23vS7qkbbap8A==",
+ "o": "b3BkYXRhMDE8AAAAAAAAAPnQNt3DIzXvm/rjmdk/NHmfWLgOs+/hvM6nFutXkkSPcWK2Xl9NAzyoMV86XJviJF2wYd74eJFXZgFDgflquGnrK6xQifFqMj6zxVF4r6EACcNtzHgsrv054MFtKKiZm073KEQStDhnI2dwtRWQQjM=",
+ "tx": 1373753420,
+ "updated": 1370129765,
+ "uuid": "67979020CCA54120BAFA2742C3F23F2B"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_7.js b/tests/data/freddy-2013-12-04.opvault/default/band_7.js
new file mode 100644
index 000000000..52e8e918b
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_7.js
@@ -0,0 +1,13 @@
+ld({
+ "72366D161D9E43D98E58EB801DAD1EF8": {
+ "category": "001",
+ "created": 1325483951,
+ "d": "b3BkYXRhMDEbAQAAAAAAAHuKL7sJ20Yz8sgns/j9LqJDQy9lms3XaDZBwYt8bmEKK3t2nQxNvUQVqxISzoRj/nX/axFvqcEOSOzZhxN7CvszP9eBPmTS2zTZvz4iu4NQ/LqXlUJ6wpf4HTjnhaqqcunas49y9ahK9xSICfo1mbmVyUI2raUoxMIQCzthfS/Wqr6J2uk6I0RraEO/eJBvOxO+buXfDQ5Bt9WoZREy+o0qcGEUs6kIMcTG5PmbOWV0DH3/Y29ggzzrUiaAbmvcu88e6warGI5Ii9gnW9iLt3AIFtIvuZQNhwyDDH7e8LPYOdusu7MfQGannWoc4QGTLnUkZrIozo3WTsoCEFv1Q9sYjyucSaR2Q2BEHVwiKzPsu4YaUADQSl65IgyfMRhjpU3qNsIxtu1gLjjRWwx8YV7BTOOSgz5MMwesZrMX5WcsulOgH6/TRH6mQtbi9d/kTw==",
+ "hmac": "A3fS6NKkoS6T1vTDvd+mVUWweXeNnWdPYb+T81WfgwY=",
+ "k": "du1CJ4AKSNBWoORyfTICsCJ9ltR/Jdy95IwZBXPsxD2fs+LmzTrFPB6sXeoB8Or7aaISaH6fzf5PJfhwIYs0WwtiJNMsHQOJ0aijvDMmpFvE1EHle+E/V9aPK0f3nws5opwfcUAxQVKAoZCg6VFXng==",
+ "o": "b3BkYXRhMDGTAAAAAAAAAExAg52C/fG2dWHCUgSx+8mg6eRc4M2Z0Qb9+ievEU6lNLuHqQQAEnJhe8zJTNfUm7bKMA9aqNrR9EpObuMR1j+uN2pIFJmD1pDtHsemM1vnSr5tZ5jUYPjOC7pWJyvC16ap4zBPfDMcrUjCVjgnZlppyZ3cJuxwVJNFRHUqShpX7oetObnVfOeixiUsvdSFjEGC9dbzvnQHrcv4G+nwmHtSLI9vN78SCWkX8I8DKZd4QZt/94Am9OWArX3r+s3Yvq4HTvNto/kC1q+a3k55AJw=",
+ "tx": 1373753420,
+ "updated": 1325483951,
+ "uuid": "72366D161D9E43D98E58EB801DAD1EF8"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_8.js b/tests/data/freddy-2013-12-04.opvault/default/band_8.js
new file mode 100644
index 000000000..5eb3eb3f7
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_8.js
@@ -0,0 +1,13 @@
+ld({
+ "8445A23B5740455DA360FEA379C3CC90": {
+ "category": "107",
+ "created": 1370116459,
+ "d": "b3BkYXRhMDH7AgAAAAAAABhbMvlFeIwLjjtGPnVc640YpM/uYRO4JbNRIxb6cSpo+FU9mOanKkql1Ffwu3ZRPSQZ6vloEUDRMqhGr4YpWM/v6lIO1iCVtegauIEVdAy+uDSAQzvC2+2NL3X9s7WgAcYh2G94JVbj7AharSB4VCRxc5NwDCViTkj0TTYDa8wDfJfQPhhM/+tlfZgcD9ZIUteFMtTPjoJwduphbScjhyRzsQM9jJ2scrYjasrnp+tFjUFQdTmuvkSI/10hoo3htLLF4bYpUGa4LPzu/CkjIotaJrJTAXZq22SDtrmYZEDPyR+epZW/2NW8di0T8gnPbx57nBKmvx1QWej3noEFcDRwtjwlp9tapyC0VFTw8xG7GaVNHc/xzGNbzQhxseGo2MPyIaUfx/9/zt0X20Il+wxX3kfn97F3DXY8KQOAHBrTeME1HD7HAvHyDnMtFX6IjdfUU488OuGVPWypk623Lmdv9KRSJoYi3bLHhR9tD4Txl9/kL+gLoyPosnr0gkua8Lfss89hohkqLVh+/VlNgwob62oBhSuS3lIJwyNl0abVrQ7jWQhkuRCXcN2sJce68cWYgvYwe/4+h4o+yfURqiLTMvts257etCN2dBkRucuNWNQJAPYw5HJ5lhwgVWVXKqU0hx+TeCRaxYDlQT08M7Pen7tmNZL6rR2f/GCz2ek1ZSoErabcFOcGExNJoLS/yvBAVVv9qOAa+m+fH4rVRt5eVrie4z5Z0G4IiL9Y/aGKqZ9JJ00h32+k/SmHmoYn8z6u6jBTJmnIVSIRzhQpn7YCTT7bu1b/WlYIeYA+/bNAUaqO6yAjuIFiQipocGyvkmkxkC8kIgsomdpyllNeJYz7ACc1bJVKUs0ZdYWqk73KlQEXB9GrbxCtPqsDqnYwvFlNgfc9ebmxUIKK3HsG4rKk03dj8JHQa5K8E96/qPxNLaxCX3Gvx0vKI8zzn8vCmUkDzHTC0Yz2GT4zm0A8ps3HvuX7gRqU5vs/E/UkpTaaHIM3CabTRzPLTstxfkMo9Z4Kll+g3VvQeOHazW+ifGYhPVVFk3y82loPrqpxpy4H5tlAB3XKG3Xgai+3LWqFdQ==",
+ "hmac": "6NNDqDnF+PHFS/RYa84na8Uo0D8FFiKiBC3VhMTUfSk=",
+ "k": "PILmWgunfIvnhZ2SUnP85rywepsURtQxOXs+/+KV+o+0Of3dpWiH/2vbSuQtA3nWgTkzAFoKMQozy3ekHgIq3X56ggJZBaEGVUd0yvqZcQthcdDjCTdwo6jlj6yqnaV1gUxV+xxi2KNN+OEHoF/F9Q==",
+ "o": "b3BkYXRhMDE0AAAAAAAAADDeatvXdJlmViVGv/hYR+L8uv51h/sRlE4N8bLbsekQfnOq4Zjno1XOMGG96V/DdTut8NDlTpESo50Xr0kJDR6nhAZ2GibT1c1PEM2M+qYahg/vr0rbIThGlitfOmHwOXyzIqo/GQUrTJkNkR88Mz4=",
+ "tx": 1373753420,
+ "updated": 1370116516,
+ "uuid": "8445A23B5740455DA360FEA379C3CC90"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_A.js b/tests/data/freddy-2013-12-04.opvault/default/band_A.js
new file mode 100644
index 000000000..92845fc9f
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_A.js
@@ -0,0 +1 @@
+ld({"A2D44483145F4B41A849FE5FEA4B504D":{"category":"104","k":"AgC49BNLEAcpFwcIcZ4VAJN+tIHosv9RAxk0ROK6qilWWFELXJyJXP9KmH4pBREjmc6LcRw4BsFwKpVUm1MHbOG6khhzqCRwQ8rjIBY+f52L\/r\/YJo9XGX569D1AHqoIhPMTyvhiV2nhjhFxmVuERQ==","updated":1370116182,"tx":1373753420,"d":"b3BkYXRhMDH1AgAAAAAAAL0hkkKKdOztTeMZRdhtIPQtooMTL7xdcKM21KA+g\/K\/ZBOXRstNaIF7GPqycQOAOknUfsPUrPaNQabE3hwiPRQ7vAgqEDgtmHyrn0ohgYN8TteVANoMtsAo\/8B2UeiAigkhQMVY0OKEZE06PzHH1ez2bPprlLWocSk3y0PB06h2N9Rl6n+JuE\/bYxlb2cCpWrutM5Xb8U8s\/GmLkyTeDv5ZrqPP4zWaOPyPrnkSRn2AUxXspVzRKmCDuIKZmmXh6XkPe1I7yrGOiAH4G3rDz7AZbsdzEIKaT2CEk6MWet+U1mnJoVzmQxKJnwSzs\/atnQ+yOlSfDjRdK5YzYfyD5nOVuDJR84bnGEGMCe9cyI+jcmyCIkHP6HDmGFTLDhvvnXXIziuh05RPAIrCOG6gpxkHY34mTh5AYfsYnv4FZw6ceEegbHEABNejvzSv3fBkh99bA+h2Y9ueOMWtomYw7S8P7tjEPaTIHNtPLJy6llqgLQqksBu5YdkwSE004L\/qRJ7lNiVNn5opHyxXOeGMo+c9pcXm1N+cARTztjlns\/wCb9lWQKZDRCQus8zO4222VOVsgoFEUZ6YKrDdgz\/fraQOtSzcov47lq4cGwZo4EeMGRJmPQ2pBGQF4csHYTwNdN1dkdTT1KV0mLMYtwn\/6tbybjlxT5MtcEPAqwXP4khV9v5VathptiqsxnXl8r2A8ovQoo14l9JzyvMOlvTcJHe3L9AnDoWvUmXw8rzOoUdOifcz4dpJs5yJDVB28Aog671wt7gca0R0kAj15tbdS0RNjXN3rWdki7B9wj7f6l8JiJodvi4Xt3av7eRQSwCbfYdQ2jZ1yTaWpZ+yUF8kTR\/4zUYbemSbi\/LWIqcH9narEexyBE5mA64PXBpVvjjXS5d2JLwmXY1jK2fuofLTmNcBZsJ5cMWSDBaYjp76rgnGtG3UQ\/0AELPTKcv2n\/MVp8XFKwAsngiHP4dbfFOWjXIMMtfz3zJ11v5zJTrXuG1fCWQrewjYC3iwiWgQEk2Nv\/a7aUG87vcgXMipXMr8\/dt6+c8YHNP+cJN4TjmuTGCLa7RmfUV3I2qN5CaI0LzQ5g==","hmac":"xNhX2boeIjZSYRTzOQBw\/lj7VX\/iucniYCtky+gFnkI=","created":1370115875,"uuid":"A2D44483145F4B41A849FE5FEA4B504D","o":"b3BkYXRhMDFCAAAAAAAAAH87YuKjL7BH4gfLKRT0MfiJDJ1URxjfNmThc\/UkDXdoAD0jixu3Q30YG8xR3itHYp5Gdtr4T4scp4HAtiKJ0UYpkGbLt3bmhFGtpuH\/AJqVUiRW+t4kGzoLdV\/nvsL76oae7KgQVqSOabIUMvdIVapjb+uA9BVCOFV7fnj\/4+rj"},"AE272805811C450586BA3EDEAEF8AE19":{"uuid":"AE272805811C450586BA3EDEAEF8AE19","category":"003","o":"b3BkYXRhMDFzAAAAAAAAAJ4FWzFyJZW8+caJC7cqRq0prmapCi8G2cYsIvOxolmZ+O8WUXknbg\/IdgHcZvquPnWehKt1qlx3Q0b4wUjkH20uZBkJJADB4EixRs7gjcNEFYr5rJhcocoV\/LoXcFeNNZlSLSu9J0v1o1IO6dgdEgOdzF5irAdk\/0WxkZJ9jN5EYXCsIFFecabjAimXQZMZJw\/gGIOpSGDQWLKCDuk7pv5xRuII6pmR8jif4T35oM3R","hmac":"JMoh16y26Yghanste1vPLKPbTCOWBgBaY\/Eu08LRk+8=","updated":1386214835,"trashed":true,"k":"10078IRI0KYGRKgbidYmpqdgeLmsXzl\/Rr0t6Db0ZOV3GQGMk7n36Qcl5r6facvMwT1mgmCOSpLAsQ4MJ173G78UF9VPeqfzVxu11HQYXpEPr\/X4bRWfPI9jbWcL1sQNuYvoKFr6AGyeGxfRrPv31g==","d":"b3BkYXRhMDFXAAAAAAAAAM\/pW84fBukYAaFjZQIRf4CaloTNI\/UKT60EczrN8fSGcekBOnuxx3oNZkTIhRHhqimNXXjsikYJ015pU81u3S33G00SeJZGt2ybXPyQ9LshOaeqKg0kjIxKL+GYIk+rPkAIDixNuumgx6nb1C6s8\/JnryP4bk5mi4e2avIbO2ddFZCqzK48\/\/7nyb+zOVlukQ==","created":1386214759,"tx":1386214835}}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_D.js b/tests/data/freddy-2013-12-04.opvault/default/band_D.js
new file mode 100644
index 000000000..ebe3e19fb
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_D.js
@@ -0,0 +1,37 @@
+ld({
+ "D06307ADA44C4031BA2FF4B174DE79CB": {
+ "category": "002",
+ "created": 1325483951,
+ "d": "b3BkYXRhMDF1BQAAAAAAAJaT1yZYCCUlp8pOUU7XbdTy90boGVyyZAG71tm/5W3N5ktaZZFaL+OxS4LOpxWQGGcLrWTLXekyAwh8lKcGUtx+gmDlMpUR7teTvgX7jl0UOhS+NOcXZajrdPqhJ17XIeq7ze2HveKyLEpJ7zoNMkf6yHH+hEo5o6LVb0mDoskDx0Tb0FjSzDzvlxMInfFZrNPa/QdMg7au+2lj9GtTY43lX0CN51HrkJqqC5IJHti9PcXFglakVxATpT+h66xoCDreWoObCOdMlXVLhVOvYGelapHk1hIxSWdIgP0Is1ubEvivdhBVWuG+FubZVOk1WaLQJ2l0hw6fIL0yIRfeiA5eWEUB3zYYJbl1kLnYhiz93LMUbaaAiwPVRhFRjUBstgUVipLayTb3QCg0um4M4/qYIwPO6htj043Qn5iG4WSEuEjG0YjXytqdrIeS3h2ghzBPkMsW6OdPixfruix5+HSMV53+vzVLXi+ko7ScjsWgSZtYEPxc6kjcnp/4xIzhbCG7zCu3j4HBIQ4Cr1TYDWGh571zE+tfewVEOPriBLvTmcEdvQUZky3LesqXdJudKgAhGRmLLAKiyYJTOFkB36MLGh3oDqu1GIebQSi19hA+RPSZ6T+Ouz4GYdN/jHyA6/WqKv3fg/RdipaU1AbpryIoXd9xHprJ5poyaAiYdBNAuvM0a1SDndGaV2ABHwKTwzXmYhDvMdPgRg30zH7hw6LUGNEXDTlmmz4PjGndUQJaeWDGwexOOetoBLly5jYZ+/f+ZC6ZuNVyssODUDbySBVbTyrv8rnagVSRPWGryXtFH8YDfbRn3bflyX21vRYY82aCMezYuaLxAgeaX7+VD8APJtQIAm5b1Ob3OEm0CpJvn0h8OwDedebq6w/3pQPBz0z4jDugXFKhA7UQEs2w0kHvRI3H23h/TYP6VpBfu0Cc6RJ/6TcRHAJ8dyRl2ag7vEGMoGBafmik/68lEvG9CjbbOhbMw3JUcDglmSCuAFCR9etrxO7+PdlyOaCWOoBvF6+8rgRymdP9vXjnoZxTYmFINjY4OG2qRNQuDuDHPa9YYVonjCXPAJq/ty2uLD5JVEXJhsevWn5YCM7gOtR1g0lEywYHlUiQhGwO639Qoez6x/nmDDCap9AYaYumU0aAs5878aT5pXOHnWpdJJThIs2/pKYrlY8IMyM96mvBeT0odol7WhGCKEZ9O/LW+xqxqs8kyCmwnWxO0rJwuJfAH1BCYgynXr76Aus+wKqIF1cjgTsEVIaIeznKJpxMpio6OkSm5kXyEawOKW26yQS/KXeyXUWCcVrCp87Esx1EQ0i5thq5iVC6UzaG9i1AnJ340Fu875vvNg5Cfk29pUFLAMPm08V4Jlfq12341GiBs8zCrlq+3DJiqK4G2A6i4sMRblWYU/OJOhWpHTmCTs8Lhk79ZCBpJKtOdmHsyFcH15HqJ71YhX1r+Rba/beMaJlor4w+2a2Txvtb0/Khsi0RrfrHOr3juR+5h5x7cKWS0ep9wVTh0eRtuzxYRGpwE5Y2n2FuNfmPzDuCtagea3INjvp79r27UqxO61F1BxvnDRTHSE1P2tV/5SpkVrpA0BvEwpEUhRskw0LNGSmZxt0dZzFjAcxH3vopzPvxdvqOutoC2ISliInAxc8CiJw0rq2vLh/T+XXUd3hwy5vdn6leUu9pLvi385cHS1TixYXGJ3ewHa2V8fmglTjWsMjdU/v8JywYeND30/0BAY5trF5CTI3E9sO/JrZLLpTUjDhNjILGVD7fA2wRvmrmzCixzID1TukS9hdLxDnO/xvZMDjlvPdnls6MMEhi8sTAzzU0sKwX3GZBfE1H2lY4fotvF8OEkt98X6SMC8t0SQeiMx6/j3ikoVceUtkn7Lu53izp+H1KBRzxQDf6qvzw8j+7d1FkpvhZUoTXUuoIYfQwDXSiJAQ=",
+ "folder": "617F428170E1455D9503EC75AA103859",
+ "hmac": "Aw+IzC+E5wXzIONUOx2T3HkpEuOe9GJd9B2VKTDQE1U=",
+ "k": "XX/7JtI7dGhIowwC8kdeCJgSEQBz2473RpR/Sd/zBpefXOqSW3O2A2ar6JQoBKiFaniMFzJuCVyF3u5ho7imWT9JkvsB3N4vRNe5W4Ks7mTLnbZFjDPYu5NGqN2mRGH6i/W3wh4NHILNE5jTxMwvTw==",
+ "o": "b3BkYXRhMDFiAAAAAAAAAKLESLkbJBDmrKAD8sBqerT2BhZsYb2r1kEhA6bj0st8B8pOhDDAGeg33G+wDS49SSTIU0+qQd5V8NPPoXh2dOwGB/xj0h0LNOlx7sBjzb6dZ4JWpaazFoO3PSgeZBaeuD9VZ69LL5QO88Hv66yNuPKtwqxTe65lZKbX5OrVG38GxJj+qtLI32ORaZpby2N3A/UcvqKJBcd7jVK+xhf8huU=",
+ "tx": 1373753421,
+ "updated": 1325483951,
+ "uuid": "D06307ADA44C4031BA2FF4B174DE79CB"
+ },
+ "D1820AA8CB534AC6A4B5A2C0263FD3B2": {
+ "category": "003",
+ "created": 1325483952,
+ "d": "b3BkYXRhMDHSAQAAAAAAAOtI8mRSS2ZPodOzN1vWoS97ViCd1s7x2aO4FUF4U9fYznoHNE0UeNlZyj5HVpZ+LYcAm8/wHhFt5YH9rqIDtADcjRTzI+b5UZ56uUycJ9Oeh6V6oyMRyrv+0sknwYVlsQUZVXRaP7v6G0PxcJNpLH4RisxxVF2y+r023GT4EI5pncgs0J8LaqA4HG8yjy4ie0orQEyeSSmuqeaMIlGpxRapvakdpexjNMzWpdFUEnl4o+9MwE0QvgRilchQuGxD5hEUf/nQwjEU7BcQSEAbzn7aDhmuVMh6Laongd7K8XEDLDQSNJYZdY54xmIajkifMNXA40vSqhjRDB8vbLNUWS9h0uU9TV7mWUujZTGHhFPlrcxmisAW44tXuJ/nRNYO4gljVEWCdPEjHVPteECN0/50OvZvM5X9F1MYNGk/z4S3u7D1YBvBGnVxGn9TXR0nyT38dYq0GWW5xBbDUz5vgCe4w0gZ0EQ13z8VCjnM7v6uKAW9ajsQqIoYCVRv/bjXktb5CmzC4phNSH0RYYD8ByEY/Jahn4FdouLab/NoPQmx5ZgDZsKNX5D/iuXv/hQ/wkmgjaCppdPJeDmEHmwTqTvFrlCqvu0WJosC+PiOVkMq9oIXByNf5kFVLqpMEiKxPRieZWcZ8evSkrTPuSHE3EmKzzevDGNR4TEBP/zLv9leUecOqL2tlZ87iclIywOp+A==",
+ "hmac": "NtgrlVsQUjVOS+by88aMb2744M0TFC+MNv6h8gs4C0A=",
+ "k": "ELybuWAxQX3rIZCsJ5cgt9rImCIoDoqwGRzvspqEjs/Nh3m1LH6MIlI2L6NeVZNvQJvqfNQgjlxB1G7f7D/b0sUjv1DN18reNSYiEfC6J5i9OJPb6AFH+n3Pamu5azE171E3IOJy8Tcm5EonoZanxA==",
+ "o": "b3BkYXRhMDFGAAAAAAAAAI4XtY9Rhit3UaBvo32Nx9g9fSH7COUGvj/JrZfpPTfI975k26woxzapwHjdBVlYEmKWLaD1Cr1PJKuJtDJui2RT1q6hGv3+0yDsnCXsoM6OkSPlFisKjWA5FuaZjZVxKyZHSLHbyNiR+hj0PfSVVdFVoJs/WNfa8KF3NpD1+LCG",
+ "tx": 1373753420,
+ "updated": 1325483952,
+ "uuid": "D1820AA8CB534AC6A4B5A2C0263FD3B2"
+ },
+ "D8F79F17D6384808848B213EB4946ECA": {
+ "category": "001",
+ "created": 1325483951,
+ "d": "b3BkYXRhMDEHAQAAAAAAANiTotCslHjA3lDSFq67/PAjJqHIN4CLgBq7B9w3/vp41wIDjd7HeH1RlG1QShODDhMf+NGbN/TCK8snRjUfKS1F+XgAEOKjeTBpnY3mA8FIdmKwJm/VvYXWI1bzd/ndZA1wDniaFy6+qBOaCDRCh5ccg3PkghZqSzouDY6VpQ3RtrtCd0cIp61PyQh9fhsIcaV1kuzOamAtTRrJdfQ9Kfd3wN3WYmvQ76KV2CtV17eohR63tJk1uPxa7YfEd0zihPc7vVJX2yKyHmO9Xb2yva+CDVExKjv7sIh3D+oT2J7vqfJocuwjzhs5C1c5rxMipOot0FSEYQ76YPb+Rz22NjKfEcuu+49s6+kq3XoJBoqVohF+uFjM76v5gDeFPbV9Im5zxFtU+R0YtiGCFA7NPQ5AFL1oQt2fGxDw06jhUt+z",
+ "folder": "225014A4FC654BE19531C19E5A3F8D5A",
+ "hmac": "kH17UD/ltmyhXda3DaIpzQtW3NYXgzOcMCPbOvY21uY=",
+ "k": "nHYWK2zu3rqnDsrZV9y3WsH/Hd93Ci+j4GSMLNSW6S/6DQVn5UjhFIwLB8qHKCQSlZWkieGz4lMaN7F7SKAj/OjJE73NfsGgjQHhwBy0W3/Ty85XuGufE89gikFNs1sw64WQQG3ZM692YdDd2QY7EA==",
+ "o": "b3BkYXRhMDGbAAAAAAAAAP1DU3jTImWEWTH9q5cDG9fw5DAVO5fvavTSShwoDQmrLryQL9R4fMXL+r/xjUg2EiyPG1OPNkmPq5kF1vrGNTdblojCWmpvhh8DIV3h8vt5gwd5+JaoTeQbvYqayfPXpzVcZ0fDEZQd5HvpmQJJGHMpU2mU8W9XiXlDK66tpLIJwqPLSibSE/OV/FIUn2wb3G+eEKi6rPZIoIZjMMkvk8S3H965CKUr9T7QrpVP6zUP6oQLeRIuQt3WUGPfi5LWfnUY7suMxpAYRBCWVnti4s4=",
+ "tx": 1373753421,
+ "updated": 1325483952,
+ "uuid": "D8F79F17D6384808848B213EB4946ECA"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_E.js b/tests/data/freddy-2013-12-04.opvault/default/band_E.js
new file mode 100644
index 000000000..dfe1e0adf
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_E.js
@@ -0,0 +1,37 @@
+ld({
+ "E0D293D29B10483F8DFDAC72ED0BE5C0": {
+ "category": "106",
+ "created": 1370116210,
+ "d": "b3BkYXRhMDHvAgAAAAAAAMwXinLLoArWq5bfBXIorDeMP6Eg4AIrjDMcKauM87yrq8BgJB4yJlw0CmHzLiaul7vLEuTFoT8Y+ElWPIB6x6GOTYyXX+9g2O6ffOMAt/x+fBVtMxTfUnK8Slf9h+lHkkmFZWKd9Q19W6YN/DRQD65yO+PwQ5ErqAZayN31EijXzS5vbtnwXkDvK2wXwXu9l8ye+7kFGjDT9BDPCLdpawqS2BEMoH9w5dkxqenf1pixt12XaJVaZ4x7MPsVLGpS6Vwua6Y9+Y6OWSgV1xjUTz1DXGmT+13yG8d3lgAM+McJEHRihzq60NUIK/7XNdIDsZwyTMBAk8XM0gxvInQbRmOGAp3JH1UdvhMrRsXlF0b8yNJfVXb4H1QCkIzxlkEbDlsL0dP4TE47QZZnnQrPNSb51FxTCsdTIjnG4DClXijrR0YknI86cMsaHC91zzf0oIz7ETMZ8vkxmIwBlq559IOAns1hUyoQAWuAbOBNQqw1TYQzIT0CPtd5cDPEfuERj1/SGyXdFa7SWqvGNc5z4ET6tujoG7xZzJg/JvifW75E0xel0e8ZfHJvQUaZx2Mj0ukjiNsorB9O2p0DQq//P5W1A4rHAg/oeLQB1926u62k9+FcRG4ZrBgPI0HGszprHzF5T+lm7JCZamf6waPFsIgIAh+1RMq4RUqpmaQPsypkB2GtkO8h83wKDaX5fngts3CJH9OZI5NGqsOpXjUyOcqUFM7GMHKsXVLSXPXG1snKCSFph3iLoH/bnryPx4Mf1eYbgqDrdQoJ61Youiw/qo64xMA3HpW3EZ3p48tTOwvJBa335o9QdSgIOdnmhpAYJmhrS/iRyoAhamG6QxRxIk43e17UbQ1Y1Pv6lgMOfsoWhkRM2dL6rjUA6O1YUnPQNdrjYA/HL/qWEvDe1C0JbOR3xWLFSCIwkTFvYD3CQ9NmMXAnZ5Fu9vzgQRvjhxQSWPE6GwkykKYOS96RXOeP92HkB+Jt5lgKFSuDNwBYXDCXu1KwVvCRuqV67SLyJmOG+Rf/c8ThbDTIwYh0Q1EZoPMlx+/koEVZhn89lzrzqQJJ",
+ "hmac": "GPeCKCNyGzGIdpakTJAIjThf6j8ZLubbbsYDsyewllY=",
+ "k": "ikCOxk5d2VpVu7slo/9KBW5GNAsXlBKHJSIOV4rChQsWG+GdLzWekfMbc8liT3Xw08lR4aY1VFt6K6+nRHuazIvnIK415aD7wBIcL+Tw9gT/UESQv8ogns16SOXzCJjt6M61sO6jpzQzZENWfqK2CQ==",
+ "o": "b3BkYXRhMDE2AAAAAAAAANuLreKDkN5RxxpiuHlR+MvbU2JJls5F38JDUnuIqXvBVKYlExHOLSTB0gMjcTf1pvGglvQqqGaNox2GOnQ5F/MSFmHg/eFVsewgeXj+IMs8Bc5itgsYeSwZw7Po3fdc0RgxWvaWipXdhsejk6Fd1uY=",
+ "tx": 1373755376,
+ "updated": 1373755376,
+ "uuid": "E0D293D29B10483F8DFDAC72ED0BE5C0"
+ },
+ "E482B70C038D4DD78A0940728FA737BF": {
+ "category": "002",
+ "created": 1325483952,
+ "d": "b3BkYXRhMDF3BQAAAAAAALd6CWU7JR10MTbZRSdznA5VPiBVK3JYI8liAbhUQdjtsxVxazkwiPDhPTVeiD0F3hTXF+KzJjrTK8S2eoSaXHL1bFjwglj8r0hMEf/34/AytILXubb2MiW64wxsDMbuhDJFj9dobm5OWFKUYix7s2v8DapYgbcA2M7xRcZpqqUOJOz6hdLFVCfvdHfRjfxi4m4e2N/1XhhECDrtB7fuBCHDvollW1ohvC2wmXvcmp3CT2w5Dzm0FaxlysIIg9OJRgP+uxzEG3hYR2bp+cxF+x/ddPbEFJ7ckx/Mx5vb6TRtzjn/We0O+HfVYwCkaV1pN3EYnjMYlkfPR418qg+MSpRbSU2ufgIQm3TT+lGIB35d8LhMi2xd3geYwMCwDshvgGFusYyGlwLVqmC5BTYiMgpQFkestz+pA4Gx9Y9zrYCZ0X/hpZ6J5E34ss6XvnWVlRO3Y66d1MRN18y3+/zOeBphqxmruKxdojzm9wY9AxYNJuETV456Sx/dguePkOxCA115y4LOlcLijw1HRVEN6jLsuGpabENXmDyZoiPXnGiyHarlLqUfIRvW9uwWjdg+f6WFDae2rOjuOGTL8BsUhBE6xaV38qC39zbme45tpe+xGNatERPcnLPFehjpB45Oo84nGl11N7jSqqAlqjkFQfb78WeDlanx/EvXah+pTmTm7ubaoALOPFK4rCBsxiftOpgNaHR2kgkU0+TNKexbwtWflkfDrm94UAe+57n6jkW1EZ8Eb2lTQ4GgdwZXguYm4l+R9gcQ3ssePKkTzfxMhsNRJmYWIZZnzUc8uLYLnK3YUx6QzrI18fn7Pdx2S4BiR8xf91lhTl4ph0MAQ4Adquy8s+AmCMFYg5XfjHH+XxfxK1VB9jFYkJ1yQNNMOETPDXYs+ST+GnBYQrl139Duba4KMudGWgVFYtXIrroVJedzEekpf7nPfHsvWoeu+//cNR72WETUnGQAp+Mwa/lWHw/IUcifRSKbgkTEJ0JDCMfP3DJhT4VU6D7WbdGBfYE+ly9q60TTG1XUrdgBwVpswJhAOtxq6mjZ7s6ncxf+93dbmGV/ZxyH/w0iYNR2wk/RTZuhv7XRej8PWXkpvDl/EwDdCbwIXupp5FbNK00cqF7IPjqREYca4MeO7/D265K6CyfmsUyNEQj95X5W06vL3wIToaC+Cn9CMzQkgGOtq46FK5WXmDYaj1GFRLfC353ekN3kvdl9DfTGhAH+oPkbMWGFCIZIoMIZeeIfJJgQNxA6pRH9TyA08hkK7NiuLtCXLZQOjpCfB91qfz45eWHErLPxtJeDJw3M5lo/tejXYZz9z6RzMWFiVWagmS0gpfUfOJZlUk+oGM1vUKsK8PhdE/bA8/3WfXrlcHQ8M9A5meTE5Hn2sTuBdKVQI4r/sYOQjFcYIwBTdj222F8hAKnZ4RdjUYKIMrF16OZKqpAWxzfDiMcI1kfw3LUF45Flq9G5xdNxtrAtLmqwkutOTZ0qabET5qF9epae9fucCc9H3Y4q9Jk4xUoV0m5NrVjRDF7ZqicB/09UUI0n+3kd1M9kTcx1E1XPlhuUGtUGGCr/YzWuVxyLrn7zAzT7Sguih43vgm7kUg6p32SgIJt/6lThxWoHy2w3MO4zKHA3AoWSqrEZIXjADFJejG8sfrwuQg8oLSR80M/hiaozyostqfki5fQ/Cj2A6hJdkmJf4lcfwtgAbPuMsTsY0QRhm/EMfcsg/pNcwLd01h0XdsKsiYP+39QBYnupNpcxE3BGxnsQFj0CgOM6CVEWu/sfrS112SHiJXtg/FHAMC8MxJPZUAcA6XM45tuduPm9CaMP3ASX13LqJKDuhJMHdMy44vKi9P1R/Rav83H47MGyxXYwtvz6FkRVX1oZjcgD7RNNa2VcBIrHZfUp8M8Fp2PuKrR1RQDNN2Px5HkAblsKvwfPfzT1zCs=",
+ "fave": 2000,
+ "hmac": "4eHvwV3DwH+fmk3ISBpnFfYVlVlFTB5bJw3AXHKS2SA=",
+ "k": "yr2c+hmtrTg6kwcio/GTlS8bogJj0znYD3cNB7jXQdQICYG888AHzlB4UrGsMZPhLzUFLC7Vfd77Uw8x7TivyfjRNzTQpvTtGoIbhSoEYVU5TWz28CrwDZbmDYWpz7z4r1ElIWYQtRCrgILez6c8iQ==",
+ "o": "b3BkYXRhMDFXAAAAAAAAAGXKYq+ozGVTUMOS6QEFBbvmbltPopkg/3pQUwXR8pRRs90QqvsIk9JlL0zWrV33N8bWzAUWQyr5U14vEMZNyLBRSQ26SpAEkdQllj0SwD7Nm3p9SpR8TkvY4sbnm3rHzy4bm8DvkSNM5Lau2d/SDSjT1vjK/8Yvi2u+6pMdniBqkBy3uJiTof/cHPDd5KwH+A==",
+ "tx": 1373753421,
+ "updated": 1369148598,
+ "uuid": "E482B70C038D4DD78A0940728FA737BF"
+ },
+ "EC0A40400ABB4B16926B7417E95C9669": {
+ "category": "001",
+ "created": 1325483952,
+ "d": "b3BkYXRhMDFTAQAAAAAAAF09tCe7uipDcmMo71+IeR2y1xC3e7iX6qFyWSXfMHyYJ9jA08+3rVf8L96QYgjzLnfkyQi0++mIeDkclKhSVNQ3wQ2H41oRq+BB2sFpl9LZioIZCj9y512XR3eXHb4/fPRVhZm5Xy0EISl1lsKzykoA3CMiAILTTJeYMJQrwom3akyZnvrrM8iizDb+7xfIq+MRcvnJVgQsYCRJaL6QkXGK9RJJ4P0F8FyhpQXbDCZ0/x+dUch8bUHwRFjuW8a7uJfr4bHGINCq2JqrJMjWDtADgBZG3iipoiiRNsXbDYAGIVohqIMgbJh2NzAgyptIVnNFR7ArvBerV7Ka3g+s2PqFCO8LmPMgVvPW9fLQJdl+ZBQ4WRJCQh7ZDDm5s+MkyiKvCwOzI1RJeVpSh8F0aZiESZI6exIswxkErwK2tGV1JStQku0WhM/qCKbYENgRT1dwFKNCYSsSaa/PRdLZujwpb0TU+MijZja+fTkpLKWkpqa8P16mzpwFZxFM3MsOaGENe+xYFU4PfGBEH0LG5AU=",
+ "fave": 1000,
+ "hmac": "WJiNQqN3uDxc06QAWI23wNgn/FYniigGlgMfLZge/Mg=",
+ "k": "rIpJwTVdfuqy2sihZc7bJJHb50DVQIAyYbZdHPDUXveJiLdwSTzx3XmLrcSUcMUruoP8RdyU0NbK5ix4lFwC9vcb4y2WOmLsCxARe5VxfiupFqXKvnSILsSIo7AiwXUT59r7syS/s7/iejyIqKr3EQ==",
+ "o": "b3BkYXRhMDGwAAAAAAAAAJqgRaKvByRAogZbxxBOv8R6bNVhESt2/WFvCY6FFUoYP7hziYrQhOgBv+EM9n+x9CdkK8O1lhzHoc2U4RO+knh7VFTIJDtnZuedxgILfr+6izsiFJZn08KwwEKNGP5BdpuOzg/a58vhr5qPUO1hOVzVLmTYuGCvnaQ7REinkwLwaX4W22uYo7bFRo60sFcrVcva/KTEn81013B6Gc3fcDtFnjdG17QkxvG3rhc6yzJA9JPCi52UA7q+rLbsn1jd3fcTCykI9T5AfAki00RDXG9qSbZcQLjD2GBs5IvtTrdjtYaah2yrtc8lBpmLyUhFrw==",
+ "tx": 1373753420,
+ "updated": 1370115423,
+ "uuid": "EC0A40400ABB4B16926B7417E95C9669"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/band_F.js b/tests/data/freddy-2013-12-04.opvault/default/band_F.js
new file mode 100644
index 000000000..94cf3829f
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/band_F.js
@@ -0,0 +1 @@
+ld({"F2DB5DA3FCA64372A751E0E85C67A538":{"uuid":"F2DB5DA3FCA64372A751E0E85C67A538","category":"003","fave":1500,"o":"b3BkYXRhMDFYAAAAAAAAAGVZGfAZ0hOzvSYNXpQTzEDSu8nHDkXbBPNbVJfWncJWvSOUjg+YAFMrjszVOl7YVaYJCE3EUVIARSyhUN7Dqs0rolTkXRjEpIPLmoW7LoSyt11STlFGo5mhZDW12CY92BJiYlTrhisnmaqL9gOxHUE7W4Kuflv8oGZn2dp9xwUkBd0dhQ9Y7vS5O6PTUzmzBQ==","updated":1386214861,"hmac":"hVOwATMlnTQTAdiXrYz8zBvS9WZ3O5KjQnTuF7uWJ\/g=","k":"9ab7Vb8k2b0lu8NSXzSF6JOQFbtoxyctCfcmULCamix5k0c05f5d90witDZ++Fa2o0N9ZQab46ed\/tidZm\/Vz5MllzKu7uETy9NAtwPcIMGszkNB0jh8+1MfszMRcZp2q2S5jo4+ChhdWVTsD1UIuA==","d":"b3BkYXRhMDEvAAAAAAAAALynfnuH\/GcDtho1hIFNF3WDi72NY3G5y3bCUgSCGwNfPLijWAGkllE9tl9RUa7hCCtLrTvAoBDNWGdEhTgVKD855n8rTjngEDbIgsmEZLeELGPwNB2XWblP4Lbh4Rjk3g==","created":1364999176,"tx":1386214885},"F78CEC04078743B6975511A6FDDBED7E":{"category":"100","folder":"617F428170E1455D9503EC75AA103859","k":"T4nySlyP3RjvcPxEIo3pVw0IxF4i8C8MnYubYaTcWplV+r+h47mHozmiLqS1TNwrIZaC0OxfGvqfr5ymr5FcVNknwPA+K5d7KypQ\/vA7ICFkY+q+igl1h2tgnLjwWbRgaktqHnQuHdOdolP4Z0WB2w==","tx":1373753421,"updated":1325483952,"d":"b3BkYXRhMDH\/BAAAAAAAACG+iJKIB+TaegDRNiZFhsZinNcC7IoA0M2XwJOqrshC7psJ5H3VBD+y\/X49GgXwVWsnWvzw+xoRV6LFeHdfhXBEE0TReX61Qzd9y4KgpRemIuls8ORTeEbnzZxZafE5O4\/WOwAl+K\/gkGpTZ1YrnIwGBbos+5bWZCh8gTG97xohRTMXtM251fNfpSQBVAPpjjiW7+vr70DIavdQg9WSUaOwpNz7mBiCEtaN\/zdRcb9TQb\/STEOtG383nF9vcYEC4hxKXEA2zRMPBO7WWMvquPq08nrEVBqNuVFSo\/O2wPMBWjE1txg0XcBJQtCv\/mFRumrx1sxdQR1T\/EQKYasFRQmSNo9xHvytqqJsu6lTtLSHlKGqB+ifIdtgPsPQJi2RRtcOTsED+Tz6EgfmrN+p7FBciQcbsq49NSKLVRjbvPWO3U\/bJTHOyZQFuGgoecRlWgkfhpB9R62enV53QYq+VcEmJev7hAn+PjbwqTekBLfDWXx9YxqgqcJuzEcPBq50plkKzrktNxzUHjyyNlVDvi9clyd0HQHR\/V3QMGjDG7czu1uc11NkLPOHM0GP6gvbuxA8j657lQ7JBQ8HXD34JRqeBX4dEJXBw5nFbWpJwEO8bdCmdxBhXVfW\/04RQLyNcafUG8YzcjZBcUSRTcvRBpy67rNiHHpO8vML\/R0tpM7E\/BTYmXekhhlKpRK26axDalKIfAyuwbftvP0Q0n6ggONbvLLe6Z6+UI+2YqIA2IuY4M4DzdOoMFQDRzCtV77tTfIamPkpQS+PqV2Yr+c2enBljfXNbnArPoKj09hFEYjqZCmh4\/5OluSqZn3Ht17NtHACK2W7DGCxLdH0CW67IAbyQWdyvGwIaE3tC9CxjW\/SGEEy8JponKH7enbU74OG1yLDWWkc0coYPDHAEmXYcvSVHaez+2uPzlj0HYTY4hZJvDmgqVOvObwji7xJVwVw+r2mqg9b5e1qDEOqo5Vh9srXNQAMsyM4NNfGTWWbi3nCZ0FPNo0G4VXGazWpQx4Y+qk0dwtFL+wncMO1H6mSG+Re2592XJ5joxQ+5H7l9cdoz9nWKhn0WbzwTZ0wJU7bPTDfxGkfzdFJ3\/UdyjYPPdorkJ2NbECnpG7ZGs00rl8sX0a5mse6LBE7rWbPhl98jJrlaeh5\/BV5fVHxOXL3s+\/6NE8RwG8h+i2Nvh91\/D5VKQ833OfLoaNJckGw0nCQQDv75oS32AXjBzYH\/gxEYtdpj6A59P7ZtvKymulGif0WgIYWMI4s2rlIDNRaZ37Wq6w5vNnmZtUoY4Vme2VreZcTv9be656dqfg7SSm0+2xM1E4MfurncA4VZM6xRoZdPmTVIjTbEoFxghSGutVl04IYgBJi6QyfSt5g+zpq1XCsbOPBaPZzO5Y6P6F+Xf\/nIrFIe0MvMbMV+S9JP5OnYyp5G5d+NwF3aNU1IhnzLFt3EKK7zx8uO\/3GONU\/5N0Bshekk8a2EjRTc0ajkfYDUq3Ehu++So9BUiBriIeL7qS1FjPqH85mXsb9lfwpx6mmxQAMboJ\/X2+65I0x00afg4c6nKdZ1XWstgw8sRcHsFlYbQlZ+G9\/sR3mAd4jmZalMFspA3trKY00Ia6EgtTZt0cb\/jErWPwHHHT+DhSYTpMlrvw9Ea6AG3lb5I\/xigJHFIwXDhqP2winTKdfwYbjADNdJXV34YhwZ0aEBStIhTAcHa8L5jYo00j3Td40Kj4e0ZN7ig1D0s4qzR\/r\/NhzJJPXAMuLKKJ2jrlUU5lbQaaN","hmac":"wPsd75UlSe3kXq0lUKFDQRkCykCFYEZRSgHs7o2U9EU=","created":1325483952,"uuid":"F78CEC04078743B6975511A6FDDBED7E","o":"b3BkYXRhMDE8AAAAAAAAAJomnirvNYqHCY2ZEm\/m5n8WYCNRsXxtt72OnnAC5mxf5u11+GoGT4HxU1lq0AFowmjB7Po4iq+shdgvd\/uVQqLYyjhD0oxhdTElpzyOBF1l04h0d8gbbumDojMLy9WRuevLJkyqHenSUoSfxBz6XUQ="},"F5F099B210F248348E22934DDC3338B2":{"category":"100","k":"uLUIwqVIzBKRuPIl+Acp\/Vh0A4TGpgrWOAUJjx52kiHxIFOKV5gkmpasiWA1Jb+1o9ElNaWMgPgVTpN8+F\/M0w4ODtFIaW5vXlFLgCiN7AYOCL+k3ym5b3TZ8w2\/+omTHvvMqwEpHcOD80pkrqThwA==","updated":1325483952,"tx":1373753420,"d":"b3BkYXRhMDH7BAAAAAAAAM6BGZoTsdH5Eule+fD1M9QiwPF4bm9vmthdGFtfElmzwr+aJgNeIhq1ndSlIkwCPPBbhSV2EML7UNVjKeo65hYnlmkQ4QijK\/fQC+YkHJXs1Rxu4fr+QoT0ppPgPgedPfkmH7NImtL5I29Si\/CPKK9G6DEnVlsRB0Hpt0cxhapHB7ZqS0yyetTUSYbkOADeYee3DIt588s7jQHf1zTPRyilW7ogpLsVbo\/tHpEbaOPZv5nmLi0QKzHpL++7b2gP5J7eBT2jaVZ76MCxcQu9vX0EHnjLdJXLJsfCf\/o6GQ+lx1x4YU8151YpVJ92r5yUtkDG4Ry+gZbJIZWSPwx3OUcNW6WIf9atBFuQiynah+bTJzWViYsQaoEzLYKJ5KoCKb56HqG8B5O9kTqO0OXBaanr55W+S9eIuw2ntTImF2RivMoeM0JlrBxRc\/SgIWYRjr\/tRHwh8n\/tqrTQSku44DdGQFxQeia\/Nx0p2\/1y6Eh+kFj\/pdzBrPYFJl96q22+jXh\/n68nnuZa7B6OxTGmMe7SsRCviD8dLWTgwPw193hBHPXbjaMtjCAI4AsI\/\/zf\/bAEY\/4G80JXXqldEkrRAz\/6DYZHUj2Kh2HwjKE5HiJ\/Ml+FjZL545KHj3pPorRlXpzWw4HgAlYORcAuTDMKA8uQM6XuBgYzjUzjqeXjWz\/JXNXR+FcA0nhIf2\/XTKzqNMwpVeDwutr\/1tkTz6xs8tmcuHJHM3x1IaffzxD4R4f2tRw74Nu6A6\/vp\/byJfOAInBaBqTK4ZwbTT2AogzmIsQG0tAbs88fXglESwZeWcATHHDcNh84rDkbEygOYavVta+te5ZyWlUkGPzGm3mDg1UcGj31ev0E16pWzBVtr4l2xNhe1Yqse0KYUD6lYJ+vlcFMlC6DbMrxMiJc9RWqqlaPe2INf2U9JhYTDcCoBnveUaAB52Sb0PsUZrEFuHVr9I7Yzt5AFxWnM284lCLXeWzOLlHGY\/4FMs59rnyQPnoOU8Lb1Gl2G\/iDufM0hnvk3OiAF0zilJ3s9IAv2mTbvrCjFtwfRkhzrwA3oK13FOCFA\/09N+85nCuzINipLaiUEK2s+bViJdAvzZuWaZRfLPyw2d3rostrBn7fzV70IsJg7nmkl0SnRUP63MAqHbX3gIQzS\/jtcBRrs7MA4UCwxQg5ZRE8CYVi7cz6eWwpa8Cy4yzCe81IrC5qAr4KPx8HoV16dQa1g8XLY2UxSHCA\/k\/guLGT6z1JqBDsKwFTMwXaO74e\/4uY3JN2ePAwnfCcwqHvBfzMQhgM3jlL9T6E77Df+nj87WB3yzMesyA+iNod06A0LTumK90ORSNeblvZ7c\/0UxNmHTJqPkSlMj0VSJPsjXAdEEbY3Cka4BB8ed3pdg+XAO2cm2XioLpN2p4DnsnXkpT0VjBP+4wg517oD\/pHlwV9UevdETTnd1m9w1bzb4WyzK\/7aFiPf5SDOectbc0d6inb36huDD+KrpbAI67KRI4e1Q17u378y1RrUjbGrOqv505j27czAGMxCy4Jwc6RHFULXqtU5UwXoomgiHxtRwyjyrrdTgbhtDMd8UZZ5ez9qtc92szk9yV4jLqVbk8VJuS4yTSSH3gkjQLhBysRzkFfZMQk80KR4BLQ\/O3HUqyKMWfRbN3EUX10Oxi1VkwkN86+f1o0CuZhxp9YqOW7tyB\/dTZEaHKv82HAwfCBmSwPVnAiuuLvEYpouaVMwEbPTYBFI99xG9tsg2k\/K0yyItn\/MWOijZRhBYjz8fM0","hmac":"6v1BQKXgFWz71ifnpKQQQeGPGOlmdu8XxMroYSZT\/kE=","created":1325483952,"uuid":"F5F099B210F248348E22934DDC3338B2","o":"b3BkYXRhMDE\/AAAAAAAAABgY9\/LZi+FMU\/4ddpd8dj8fvGCr8iXRYvDepKFGZ7\/reaoxv0uAMSBmScYUcX7kNcrpv1jf10IAtX2YtrMS1PaaIY\/oi9Ws9RWjI5Q7Gm5\/a0f\/zgfe9WUSWFtc4WDy33Rsp0wPXWzsuh7qp6Cd9SM="},"F3707FA58EA7480884BC6A662658E039":{"category":"004","folder":"617F428170E1455D9503EC75AA103859","k":"m+n9j3ulyOcp0n6NLWM2dT0xNSswKOTGBcKSZf0P2963eaDj+pZVEKUOh\/\/6Ho1a1E1Y2J9GTBG8sZx+rJCI7xt9ADONQ7ULhkSPe2APC3psC5T0Smpz2ZL44n64QSGssJMKaMlDsHU45NH0oa302A==","tx":1373753421,"updated":1325483952,"d":"b3BkYXRhMDE4CAAAAAAAACy3jlcycUCtAnGAye\/OaoRkd497OIPqGGRgdLGpc1Ac0kNA6IBguAkLQgInXP9\/Ekw9VO4C+nXkoruT9hGWWfzOOk6fWTWYC7B\/aQ7gwLoTVeUSBDFTaNf8ik3TM5LOVFYS0YYlEGAU5y1\/TxT74wYCKjq\/tIHVrM05Y+wHVtHC56CFXt\/6YMJ27mM\/qOhP0CAHqsQdJRORgtyGHghlTWp4xfzvzALKQJgSic5EnuNaCLZgQ2C6jet\/HFzyYu2qSb4iRkx25DGWuksK9d+GnGOt5Xj9Tfvfh\/l0L9c+0gBtwkxfJPbQCE\/hxsomzmZIVnIvJzJ+2oXcFpkI+6AIlcx71L+hYmQjz8nlMfbfml3Sa9\/w0zk3i7pncuOVtlXzegH\/KzENnOHxZymRUkAYfR+iiOWUxAQzkSvWxvi3sxq\/EKG8N4J6HCY4jC5eFuw+IhCXBSz\/4KPqhYhglGMj1S0QM40P3fvXyG91vD4gA18kJ4iTc8BfZWixtTktg+rVjigMKNlv8cXfv07MM2xA3nVcDkuE8VYld7jySQwKoVSGwK5yvgWUr9Z6VdKcqY8TCRtHX6sUd8YSUGP1b+JCn0qIBoF5kazJurkmGHN0HWuMO7Fp8DIPQURgNm\/JqnIrav7hZs3ZMeT2niMDWJLNuD1li68ivSX9jEOVCsD6TpVoXOrBATGr\/AoS44glYh06inoWxgB3teOwOZcc06LRH71UbT6tWt4WX9157+4DQ0pCcHh2Sw3SuDRxsBaQ1E5\/2T\/yp3WXpFecHKhqEsGZEbeQSMJ7BLxzFE4EUQWbMuooLRUy0LuzoNpfuWsCyxIYrIMImlvztJbNNlfdXZ\/pjqFRkGUzkFry0yDYEQQlX+6BgaIaN6j8TtMWWgldyWixiYNGR2WGClAJFnNVbby0UuvEqIDFKaHXTm10RjrjcVyRUrSIEAnN1ZpLNPi7bDTWp3iJP8GypFiY17jQQgoC7oIiVIKG77P6FqvRZr2JU\/oYiABKbzZoMDE3jzbLgLcytp0o3Q89qm8ixQ2DvwLT9W07BJxZ9lOUG2nJcYZNXzOzOrRoSdkqpwjax0LKswsr12THtvAN+QvwWQsNzKUIHDmOspHuVcI9lWJSiQWB+Uz6+wR2UMJixriz7FqdrAYmAsqa9C3F7IhsOYfav9gpsq6h\/43uIE9MQkpHspcBGHoi5i9b+QkLzjF6oNhmxLz+jZ\/rWuc\/fGhq2arNb08MxPKJe8bmrNkDvLCMfRVJi+Ga+DU9rPIYqrfmDjBRFUjtyf9fq+RfIyG6xRN\/6uL0DnmA+6mp5Iyk7RJLYqupelxpf+vF1YNPI\/BAwffW4GoK3abvNrgtIjL3rypmcyA6ZaUVrp9euvp7zLGsMtKpdOML42NIl0EVzyCvrNoa9Et1G5X95ZN+eeaZIDPOcPOtKaPK45oOSZu4puji\/hO2yGhthlsvmDhE1hm6o1ACgo4QZHpr6rb9X9YUbHMmKzR8dR1oVX3qzS2vuvU6maj1iv5OZnabEWdizKmcRnpjUyMyZY1Su9fp+gktr003EM7ysjsj1TxloBdxYcxn5JEzrem4BG0MV3l+o90lhyx+BfeXPEnQQ\/Dv6t9wlirwCUeYOOsdoMwXjFzowIyMfcfl+W9jgx6r7d2pLgTjThf7Nw\/+F30HZL0zVJuXVi3nmxGY\/6hP19yeCQFKDQx7bbuHsxIpLwqWh4P5pUomkzhGeJPAHAx9+eeNQnENX9rES0mg7cZOzc1U1\/SDeASXjAdHrxj06p9wtFgR1lhw3SEKjccELfP0PIF0tcErXeBiuanPGj0dvdpRkMhizk5AN1h26xemTP3hepLzxb3ACepVmB12vq+avp0HI6NQTJQyMh7yzNU5rGJXi4BUSXwi+MZzfl5WEXWTEeTqZE1JjPbkdwlSJwFXfjtIOdYtJx\/2TeYNDnCsTHtvK21M5C9aC0uvagNnjySqeEwK9YZvjoaMBFnpkLqiAJVpk7jeAsuMVSy\/7IZGopbpR5IUhG3JoliFJY8SwIIw2P+RFKx+fhZjwJKl+xuumXTs22uLSqajDXJspcxYaB4ZTvos6Od4ryXifdSFkjh+CrOn+LSVeK\/lmrMqxoAk6k05lhRuWQ1C+e798FKy9wSMNFC4KcEk1mWXDrkRam8tRJiZ874V1LNC8jDI+tCyfqXWH+VPJ9VWTcCGvXCrLH28qKUdABEjTGdcsrxulpwH0OsfSvDv9KNgoFT6hopbfLGMEm\/y6mm8mjXXUM4lHXWII22bzRZWYURZKsoFR9Kn2ei911u1Ocp22gcr5S+kbaM6NYdF3I31cEpLuVJp67LyJqNDz4YJFfVlOp91xyAnaADGSYW52VCOPjzcZPaRsvSPhnEzysIs9cVbFYvz6UV7PQLvqxRAfoV8odwtHumMzV41WiQ\/+D1LjmngYWRbT+W4Y2E5RepBXi+errOWH9RjH6mzoM154RK38UqW7H+3z2GvK10vtFdMYGpHWZCEZNMg8fb2EPgBr01U4Mc41TzXSVYQR\/M17oGOmTU51xahsgyuFAkWBirgt6CkSfc4h7CXTyhEPgYhcPRvCWz5+x1N97JykChjonwwaevKwvIrk3f6BDT0KluFGwiIAjJKxCoNJZJWljnUfcrdUquDiajCCZUX4yTsQrbN+bh3HOmn7rNaCrl8wL1hsjCu1zNWGP+xoq\/W7PNs7QuBtU\/a77fWjtafH9aCJaFOTOdlJYTcnzl0x8NHvk6OtSdiPPf\/eohtIDfWbfMhzWC8saUL1BNovLfGFmGeyaR5yOfl9GN9wPpsghMhf62noIsk4rW1ZSBqvI8NySai1pEkm2342nYLWK3ptbpxYiLseKzQJ3nUn60KZjb03+fadpbE8g==","hmac":"dyDETV4dtoJY6ObOQZMlbeygLuJLAn7qJmLQYV\/iLKc=","created":1325483952,"uuid":"F3707FA58EA7480884BC6A662658E039","o":"b3BkYXRhMDFSAAAAAAAAAMc3YaaY9aRpLJ6pTvh2zpTuYPE6E7drcD\/4jLFCpfjwbOGhnb4RgXxf0SJLqhOWjhbibcrx88xVR0wb5jf55DcHAr14d9yHAXHRBDLUvSBw\/M2w09aYYIJX1IuziJu2Tw6IYMNZl18kk5A+HcGnMEoHkzX6XmXNU+csR4C5Q0MHpmrm75TMUxVvnCE6nQrB6A=="},"F7883ADDE5944B349ABB5CBEC20F39BE":{"category":"001","k":"fwEzHy5Z\/KX89M\/0ui1W6jm3KLmqdZ6Cx6qBGRratWGVtsgWpK8rdjnzP9HJ8kERCZ4smAhTPJLLGBNZ\/uDTJweSnyR1ZjKvUfrh2nZEQjmjNOJih\/h9OdwjqVNoRhvHqIC5wDqAA6MmoDbpso8Z0g==","updated":1325483952,"tx":1373753420,"d":"b3BkYXRhMDGYAQAAAAAAAOqwscy8\/oxzwP9rnBpW\/mr8bwiM6LRh4vng7LcB806hOttQ8dFvnd\/PIYkqnvWTwZvLbxtTKk2WrcD8uNkvIztDNBGBLk18rrRcZsosa3Hsdsp2jgpI2iEvaE\/2Lk8IJmlG\/GmhM6K6eKwJ7lefAwGYp52bg0aYfSkB7xxoiffbcDx+Klia+WKV72LIaTAgjz894NBkbcPQ9u3mPXpgjlyk8a5SLnIuondnLt69VBOR81wNVqOxT\/IlpRjU6UAPQEjnOogrNvaGFH7j5Zgw4Px8g60U4ZHysa224mAral6mBK8PBm1Ks5p3y4tw3oO4sqwlpEA1DE56MS1UhstHzK4J4Z31+C06mMFTHs5sOpMKSpAqqghXvTOA8sgRql9p+NDAiSs\/eaaDRxfYmiQXVWbHvae2edLtMiNjUgxvbXhyvM8ENl+Pla9VxNYbg2s6+K7Ct2obx\/oQAbZpo\/h8AUbgugc3hTIvQuMw\/o2DoIuhtmbQqxyc99eeRn6ZUE03XB9pnT\/FM4AUbtgqprV1ebMlf8pS+h9R3zNgB4EVjUXftTH27jFhvn3D2sIIz4ZR2A7nl2KGfJLNjGRpN9LBf0qP0KziORNg1lVlEMwGcAYm","hmac":"CUavpN2qu7Kz+05aLCHNDUYGrsp0D0wFGIShzRdefxc=","created":1325483952,"uuid":"F7883ADDE5944B349ABB5CBEC20F39BE","o":"b3BkYXRhMDGYAAAAAAAAAGRUHVTI1ig3dPmw3gdUasxYzglzq53+WXaerBgPS44zyc6fQEOjLHfD\/qP\/uRqwQvuW+PlRC9gKqFoTrptjy\/ImutcydczWYgEp333LL7KMi7XEy5aJmxrITgHytmdguNn380ZmygliXTvWMZm7N4TkkOPWZ3FXRSGoJ77XEQDmexwJsVdoxUgATnYUwubBLaybVJkcVzGGeAeeFMJxo8Z\/wbsOWV84yxVNRwW5kLyO73x+WMC0zAZG1utUy8qNPW30II9Rs5KRQcYa14Vvl48="},"FD2EADB43C4F4FC7BEB35A1692DDFDEA":{"category":"111","k":"G0L0iCrB6JMFIx6ZwUEAW2UKTDx\/aL0LTZX0EcuPCoU57RRIBRgDuqEy+U7tnyFXYBKc9WDV+cHDVoDpmqTkuHhiYS1t9wR14qVt5mtFMz11sxmLkV+v7InvRE8YzlURVFyuiuUEWvIKhW4rGID0ww==","updated":1370115699,"tx":1373753421,"d":"b3BkYXRhMDHsBAAAAAAAACz3bCFPhL4eK+SSnXE0eXtTyiwpheBzq86mnRW4zOioqHB6KMFfr6yeqHByoAegxYwwoyw5nnBzCkSI0XNwAKIJvRvQq+ObMWT7+WmLvCw+I5DSLN\/+vuS43f7v5IH3u\/UHylJagWPiumCDNZnKmVXQh6J3C0B3VrR8t+YV55lOYgtWMKqwlpK5BRISjO3o6YZolQ5dKqKILiaizHBEru0N35MvaYiTRzm\/n7o85qAEDpr+aw\/1Yjp3sGn1uN+ErRckYTVjd1\/+NORb+P8ZxK\/T7QNpj4tGoWZ9u1UByKVYES+3fkRvB7AVsyLVBCKwT6Yv1D4OmNJ8Ph+nch9JsxotxA5UN1hlDmpLm2yL+dEM3az18sQ1+hlo4cdpRuIxCgBLmEhe6uPnngGuXely1RPrpmbvNJHx5QOZ4YIQTtfnKHXEgf\/e52kVSX3+Uz+\/llP9RU8cURtezE3HUbV\/9cM30UlT+\/kFHAu\/wQVqM6p93Y3KZx4+dCsATkvphIr7t5Zz+lfY4a2BIdptX7tUYyRuhbgWWHtSJVVvztuPbrIhj3qZ00m2YmFtXxHpyyh8PWcTliHXEQMCCRyYvAFEwSLp2B0R+cUXyiAu8jh175x4BUoTgJMOODnVv2vYKW4xGzqm09hXTG3S18ayJ9d\/ndngB55JDd3bMk53pTvUah8Rl46p8pHzd+99useAgpsCIv6RngW129s5l7nEHkmjmX3xnJk6M6yf\/1R8rTGjhlpIsODDTn1L0pJQB9jtJS+D3cySHeqJ6M5sJIS36DA2Oo8bqbWDbW1uzQT53Fu9AmnZOv4I5IkcdsGgAaWyQCsDptNGp+YlE4361wEXYLklTefkrno7YtXuCpTKItEUCyWOgv4csIzTBi0IJVBQ2cqwc72VWonXWRE5sMhKAQx1xe9GMqbUIjYvJW5bpYHij7y8SRtdDNJUHsK2P2qbRflSa7WbGHI41qJnQw\/fmnHwV6VgpGl83wl9rEM3qOFXffZPIDWQ5mt6SAp2244a4a3i3XY6NQe6MMov6yFP\/DCVRJtGEy7OaOioG7c1G4zY+VOIXmsoStCwEMBPVpMZz9hJh\/N\/\/Hug\/4t08btFfP0CY90O6iQJ60SwjAgwQvpumEhGjeU7toSI8ReIsHDIaKlKblw+EpuV6AADys0fPHxodic+z+oaK8y+p7B\/PIW3ytooAleEzmiqnPI89Jem4N6zgpyv4xDK0jdY\/d\/LLN+7\/FqKjd5j0mJloApj\/5V+cpm2vyCPW3t7Prb4WKlfTLbTh7jwxKOBztXfzw3EzF\/g4xpLRJ6BRiIfAM6aCGR9HKtiDjHSvb81XECTLCsCVXW7VfUPBcP9T2jgEI1pR\/Qux5MHcGR02lqjuJmd40zfLB9TRTQqGUfY7tH70QAdOBCLseNTANFizbugu70I1MqlTBSmQ41CGW5SWHQ5iitAGoYODSpoGp5egR1h7Q3NweknKLwpRQQqshYcu22SyFFk3TsFLon8mwckhOcepbtsNZuF021ZFW8o6\/\/L3eTBZStU7aZe0CScWzbLK\/+m057zEy\/cFxPhcXpNpK5gAmJw7GkVZCsmEwatWbTaUiycfgmV+EADmUPMR54IlKMySsLCSiA+lG8\/S6IqhceCUII23NLZ8nlSlL+\/NpZ+uBVVb9QoERUvdAacdHTX2clrwHV74l51JaoswDWw6Lk7ny\/VTG9bijbp6OhMz7yCoN7ec+XIYF3KWI9TAXa1cERLSqXKOjI=","hmac":"jnwgVbZzxznprZqhlBpIe1btAc0bEX2OsuTMjOUVj2M=","created":1370115515,"uuid":"FD2EADB43C4F4FC7BEB35A1692DDFDEA","o":"b3BkYXRhMDFBAAAAAAAAAE9TT\/jOvqEv0b0N2k3f17qRVeaknpZsmka8jOntpaHCjLINsJkYDslj8XK5Y5vXOLFzFyLgL3NdidDWGgaqrg5hL1XL+90ZJpLbLCtNhlicdYzUzXZt28PtvMzGLpZqWJOlYIqiIn+PjQQsn8Yo9cryI2UkssWYr\/\/KpHSpcEeV"},"FF445AB1497241A28812363154E1A738":{"category":"105","k":"Tlqi7ebwFFYMvH1pe76LU+RmWUXkFbjS2lMwNJELGYrHCvhXf3DwJ8lJ2yEReHUz4EeCYymYGKG4As9PFH+5LeOiUD0IZJZCBZFEqf6xgqwLkaGgno3EbFMZaBANg9oxaXGBQEZhizZMCYK00zcbsA==","updated":1373755465,"tx":1373755465,"d":"b3BkYXRhMDFGAgAAAAAAAIwMlBAM\/WYGiSbR3UCrYG3bIqjx1jijY4GqwWY0ylXOCdOB8xVDi6LDCq1pv17mwNlhRzVcTSL4WBzsdHFh3rxblyIiUGtxruvnRV2u\/yPrBLKgsTR1cdF4FhTgWvCyJ7AOrlgY11+Fa3ExjXiPTn7\/FEiOHu8safR9LyRpHKdkW7BcD26BbNCMLfZduO4MDeMds9jTZRZnn3a+lzN4SwCRl7oXpMDgEl2kUdeN3UJVenpHS1hIHzC7miLYSQk5W1h4CXVdEbYSK1u8KBoZ8IRx1WmBBMcUg4h8+gQNIHDff8t9lg8oGWqmNFsNK00\/EkvVleOIiEuwmmb\/FkC0kQGLu52\/Gw03\/Kj3UsC5KxqAGP7ydpXuf3Smyklze+8+q24VEUqs9k8p\/aKkYIWW1RWUd3bWLusN70F7rjNv1sP3UT5LaLybJ+TwepzQV50btqDy35gWtDh2JwWxgqkog7MfpY8baM5Os\/Kd5wvROcP\/Tb7ChhKDF5FF7heSdyQKoDBzbI9u4jvZDhvcJawF4rU8E\/p8cQiran3ueCRHGmWm8DffRHOn9uS12O5yWPPlBM4EWbP7B6JSWv1EtYETCXlq7YzE22xan559zMvvFnEwCSPBMIRouu\/sHfG7UVUA3gg5H\/cuhQYwS4Y9c7pOAraZVhTc3O\/1IUspgiNzN9VQ+U9pT5pNwuX3TBs45nEF56SlxPpWJ+ICUUcQqUKqyC2Y3D0m2KY8yn+fplTZ\/+u4bM7WBEUihL\/dBcmGrwPrpLXi98iVGuHBMLflP3ZigYGagoUX5+OxGP5NDLxJIAVZzpx8sSftRkk8NaOCwQ0iK6vLAyojmkY5Tj2Xc62aWT8=","hmac":"CapriDUPvoQ74ZSxmvSFhaOUs+iYaJ8cfkwEv8XJTq4=","created":1370115718,"uuid":"FF445AB1497241A28812363154E1A738","o":"b3BkYXRhMDFFAAAAAAAAAA+up4RSylo4eV4ZhWai\/wfDemjKUxTJ3v83kNYX3jQoLAyO0Tu0QjSWEpDNZ4YsuxClGlGDgmBChugQS\/7SSLzopMBRccI7F0ED6LgQs1\/MBvOjXovrWFFt9OS9SIRuqPeWeK+gVyHUp\/bvQ2Fy6VfHOdwF+CgLEXvl8bJCMPR7"}}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/folders.js b/tests/data/freddy-2013-12-04.opvault/default/folders.js
new file mode 100644
index 000000000..be2c74dce
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/folders.js
@@ -0,0 +1,24 @@
+loadFolders({
+ "379A3A7E5D5A47A6AA3A69C4D1E57D1B": {
+ "created": 0,
+ "overview": "b3BkYXRhMDESAAAAAAAAAHw2J+nRQ2h7a9jZ8kH4ser/wKowBqgkJxv+RPujmrB7X53ooYk2wxyfiM2par2J44pCxLcNesV9F+jFCIecxGouN+3F033Ktzm3fKC2pGXy",
+ "tx": 1373753421,
+ "updated": 0,
+ "uuid": "379A3A7E5D5A47A6AA3A69C4D1E57D1B"
+ },
+ "617F428170E1455D9503EC75AA103859": {
+ "created": 0,
+ "overview": "b3BkYXRhMDEUAAAAAAAAAETNJnQozPInk04UjWvSpyh9PSWcFbetAzkMB+Sh36BPB6nk/FyqwEp2jeuMA0GTuZ/6AChqo0DYSnj3F6E2890seFFtufva2t+j7CI4Ft6J",
+ "tx": 1373753420,
+ "updated": 0,
+ "uuid": "617F428170E1455D9503EC75AA103859"
+ },
+ "AC78552EB06A4F65BEBF58B4D9E32080": {
+ "created": 1373754128,
+ "overview": "b3BkYXRhMDGQBgAAAAAAAPk2tT/+vjtAMX6wkwAs8gU284CfdqWHKsN9kFXY40rSTv4f8E1daHNMt2hLAbvR3BjP29168o1taEIYcXVHaZFdYTQ5yl+AvSn+T8aqkQ4sPrggr2Zi2NKuo75Nd/Cd0cnDGBDE3y4q7Gqzoo/Hr0mSfjJFkIbg3PEdY6LRLR2rnHBiqKAshdVyKBXO2maK0O8M7a0fGQN5OG0iHYW8Fo8gJcfBzfVDaUaPhZHj630ONuIVOAXhk6zobzBuYEo9khv1w0ueBrJqvT6jiLa5LhwPfhQmGBBc4scBqJqXFEB8lHoj01V75wkyn1GgVo7CGoSqEbaogFYoa6F14rIFs5pJ3dSbK5qxrz3aAVVZsJ8ouq8fniiRPUmaC/2f2PCy3EB2P0YtlAoE5/fxobq532a+SkAPey5fPxrS7kdgZwBf6zqnbwe8/pmmcNviVxuDz9/19c+Q/UQu0nYg0MS0rnTb3Eui3/UZBMoNkUT9YKKSS4ZZCLEvq88QYCrDTq9OBIMYDyiq3t6Jlq2+ynz9V0rs2uk1o7UpmCr7V7HA2OH9RmpEk1f6LGf/dPocvjPpUD4RR/DUD69EhwCWNkkC2PjE5cRLNnRMjKwb5rhxjkihr9/jTQMqKJQT3/gYHtfZguWrXy1xPB6UmxLv0mwY3BTw+PZa2q/znhyam4xA9Jf425JttoaectShHyMTwsmlcHqkeMLvTdodgOsNAHP+rCy0uuq6CUOlZrX6BRbg6WBs/kPjL8Dg4BwHBw2wh7XvkJkLo8eyErD2jg2Dd3a4s8jErPRZEmDbQJbVYut9fTAJc09LAGAS4O9hg3Esvl5yEhQrC0zoRtHpm/eHKRy0uDTQm5+EhmEAX3zyWjM7O/BoW3q1ZrbVkgmK+814jBzo2/agpiNm9/ZDd7PJkZU1H6M3FMdPamx5qxe7rnrngaxnVvjL6f+1OgYHJ7Zq51Y21Mx4We4dwHU+czMpCcJNoaLtQ8ZBWhNpAYWey6eseazChk7HS2lRSQYdocIgNeWrziXksTIuMBfUsmIGqqzzSda3oMv82Tz3eKKSfgD5MNlB4rGxko9WHZO+pXYZJjhRIvEUTSMPwntfyN9jqZUKgCZgfCI0TjS8NHxzCnuonfgpzO7qNi2kG1U8N/JWf7IfVL5qOAHU5YwzDOgiDAS3Oy5CHvRVvNyi7D2EAP+oSgn9CfsK0OhhhyBkxygPbuhdvljIqJOhVItOtNYJYXeY3QM0Sb1xE5U04wA1cySTRwsiTMO/k5HyTU4V9WySQAB58WtneaAciRNzZUnFdhwC9JlkPNgyZjBrw84wpjdxAbJK1D0T7Kq8l5w5FgwVDGq07JsmDYx8W2ReyuwkLNq7oaSwj+wTpSy7uqVVafa2RoFOLVWNyPnrwHYgF65emnO30ZYYda0wVrOPVvoHB6PcftWdmnBPY2ktd2eGaYeEOE5Vhf26GMOrdbkH0aM0jDLEmFE/O3Rw4ILsRpLXcxxiS/y7MlEAuW6O//sZ9Z5/CjLfswBs9zU+EeduObgKUN78AsPXBzGHcY4QymlcUwMdVdptoa5rJ6+dzrm0l/xyqiAQWhvaVytc5zDXu1b8clfMe4xQEVAxpA5IJXXWUIUoxHEbG95P9rjVeY+Khgjcw0XMkwPBstYka1aZUKe06Cp8fc6XC59Ti5xQC5eywjfNZwHfXNovTx6jeiysDcuyTkDOqG8+B8ls+e73hCPbBljV+dIijAY7DY8+R3bziCRNX73PLH+LfLGBll/IsAY8m+Qoo5jT6t1GS6mVztnbNLwL/NPrOW1ZeEXvO1gR/b2WpjyEc/dmIo6zg8qbYxMRwyAeR7RJf+eRJ/AVj32eZPAGDhhqaE2QAdNvROKTZsLhchTJBN/Xk7oZPrCT2rZ6cJv8x/gHwiyQwEL/g4gldE9/PPFZv39XPEvA62jnHOyzoiToo/FMhtYxCKRxHzvhz8KcBXp5eW5hQMXgmUPouHTtc0S5+rMwKbRYcqEvkYHMWNyU+0gEOWTbvf7OLvFl37c4hCHencsGSeTzf1pbENjO9nx9nV92F6+KrSYXnNJlXUZvXvivr/wnruwf1IDWzPAuLRHfLiuXyPde767du9RVHYR7KPcQcLAAApM9njDlXyMRhW1vK8G5t/PvSdTcbk+lMdeMkW/DhlYWSJv2dOe3x9aFpvLMnP+P8j5XIyMFTDhopQ1LvUIGwFu6WjDpMIo+i/3sK0q4YFOhGF40BquOMsE3Z/Jp4xMRfoq5IrsL5vdOWK/NTswzN5zDOQUcLEgbm+Dt2jwciMm89XbiaLNTfdp/VLlY8M7PGlhsZC/RKBM=",
+ "smart": true,
+ "tx": 1373754523,
+ "updated": 1373754134,
+ "uuid": "AC78552EB06A4F65BEBF58B4D9E32080"
+ }
+}); \ No newline at end of file
diff --git a/tests/data/freddy-2013-12-04.opvault/default/profile.js b/tests/data/freddy-2013-12-04.opvault/default/profile.js
new file mode 100644
index 000000000..90425b5a1
--- /dev/null
+++ b/tests/data/freddy-2013-12-04.opvault/default/profile.js
@@ -0,0 +1 @@
+var profile={"lastUpdatedBy":"Dropbox","updatedAt":1370323483,"profileName":"default","salt":"P0pOMMN6Ow5wIKOOSsaSQg==","masterKey":"b3BkYXRhMDEAAQAAAAAAACN8JuE76yN6hbjqzEvd0RGnu3vufPcfAZ35JoyzdR1WPRvr8DMefe9MJu65DmHSwjObPC0jznXpafJQob6CNzKCNoeVC+GXIvLckvAuYUNSwILQQ1jEIcHdyQ0H2MbJ+0YlWEbvlQ8UVH5bcrMqDmTPPSRkbUG3/dV1NKHdgI0V6N/kKZ737oo+kj3ChJZQTKywvmR6RgB5et5stBaUwutNQbZ0znYtZumIlf3pjdqGK4RyCHSwmwgLUO+VFLTqDjoZ9dUcy4hQzSZiPlba3vK8vGJRlN0Qf2Y6dUj5kYAwdYdOzE/Ji3hbTNVsPOm8sjzPcPGQj8haW5UgzSDZ0mo7+ymsKJwSYjAsgvawh31WY2m5j7VR+50ERDTEyxxQ3LW7WgetAxX9l0LX0O3Jue1oW/p2l44ij9qiN9rkFScx","iterations":50000,"uuid":"2B894A18997C4638BACC55F2D56A4890","overviewKey":"b3BkYXRhMDFAAAAAAAAAAIy1hZwIGeiLn4mLE1R8lEwIOye95GEyfZcPKlyXkkb0IBTfCXM+aDxjD7hOliuTM/YMIqxK+firVvW3c5cp2QMgvQHpDW2AsAQpBqcgBgRUCSP+THMVg15ZeR9lI77mHBpTQ70D+bchvkSmw3hoEGot7YcnQCATbouhMXIMO52D","createdAt":1373753414}; \ No newline at end of file
diff --git a/tests/data/hibp.txt b/tests/data/hibp.txt
new file mode 100644
index 000000000..6b48666d7
--- /dev/null
+++ b/tests/data/hibp.txt
@@ -0,0 +1,5 @@
+000000005AD76BD555C1D6D771DE417A4B87E4B4:4
+00000000A8DAE4228F821FB418F59826079BF368:2
+8BE3C943B1609FFFBFC51AAD666D0A04ADF83C9D:123
+00000000DD7F2A1C68A35673713783CA390C9E93:630
+00000001E225B908BAC31C56DB04D892E47536E0:5
diff --git a/tests/gui/CMakeLists.txt b/tests/gui/CMakeLists.txt
index 8542e58cb..168272bac 100644
--- a/tests/gui/CMakeLists.txt
+++ b/tests/gui/CMakeLists.txt
@@ -16,5 +16,5 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)
add_unit_test(NAME testgui SOURCES TestGui.cpp ../util/TemporaryFile.cpp LIBS ${TEST_LIBRARIES})
-
+add_unit_test(NAME testguibrowser SOURCES TestGuiBrowser.cpp ../util/TemporaryFile.cpp LIBS ${TEST_LIBRARIES})
add_unit_test(NAME testguipixmaps SOURCES TestGuiPixmaps.cpp LIBS ${TEST_LIBRARIES})
diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp
index 0db2a5dfb..ca208db01 100644
--- a/tests/gui/TestGui.cpp
+++ b/tests/gui/TestGui.cpp
@@ -75,6 +75,8 @@
QTEST_MAIN(TestGui)
+static QString dbFileName = QStringLiteral(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx");
+
void TestGui::initTestCase()
{
QVERIFY(Crypto::init());
@@ -91,26 +93,19 @@ void TestGui::initTestCase()
m_mainWindow.reset(new MainWindow());
Bootstrap::restoreMainWindowState(*m_mainWindow);
+ Bootstrap::bootstrapApplication();
m_tabWidget = m_mainWindow->findChild<DatabaseTabWidget*>("tabWidget");
m_mainWindow->show();
-
- // Load the NewDatabase.kdbx file into temporary storage
- QFile sourceDbFile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"));
- QVERIFY(sourceDbFile.open(QIODevice::ReadOnly));
- QVERIFY(Tools::readAllFromDevice(&sourceDbFile, m_dbData));
- sourceDbFile.close();
}
// Every test starts with opening the temp database
void TestGui::init()
{
- m_dbFile.reset(new TemporaryFile());
- // Write the temp storage to a temp database file for use in our tests
- QVERIFY(m_dbFile->open());
- QCOMPARE(m_dbFile->write(m_dbData), static_cast<qint64>((m_dbData.size())));
- m_dbFileName = QFileInfo(m_dbFile->fileName()).fileName();
- m_dbFilePath = m_dbFile->fileName();
- m_dbFile->close();
+ // Copy the test database file to the temporary file
+ QVERIFY(m_dbFile.copyFromFile(dbFileName));
+
+ m_dbFileName = QFileInfo(m_dbFile.fileName()).fileName();
+ m_dbFilePath = m_dbFile.fileName();
// make sure window is activated or focus tests may fail
m_mainWindow->activateWindow();
@@ -145,13 +140,11 @@ void TestGui::cleanup()
if (m_dbWidget) {
delete m_dbWidget;
}
-
- m_dbFile->remove();
}
void TestGui::cleanupTestCase()
{
- m_dbFile->remove();
+ m_dbFile.remove();
}
void TestGui::testSettingsDefaultTabOrder()
@@ -333,19 +326,10 @@ void TestGui::testAutoreloadDatabase()
{
config()->set("AutoReloadOnChange", false);
- // Load the MergeDatabase.kdbx file into temporary storage
- QByteArray unmodifiedMergeDatabase;
- QFile mergeDbFile(QString(KEEPASSX_TEST_DATA_DIR).append("/MergeDatabase.kdbx"));
- QVERIFY(mergeDbFile.open(QIODevice::ReadOnly));
- QVERIFY(Tools::readAllFromDevice(&mergeDbFile, unmodifiedMergeDatabase));
- mergeDbFile.close();
-
// Test accepting new file in autoreload
MessageBox::setNextAnswer(MessageBox::Yes);
// Overwrite the current database with the temp data
- QVERIFY(m_dbFile->open());
- QVERIFY(m_dbFile->write(unmodifiedMergeDatabase, static_cast<qint64>(unmodifiedMergeDatabase.size())));
- m_dbFile->close();
+ QVERIFY(m_dbFile.copyFromFile(QString(KEEPASSX_TEST_DATA_DIR).append("/MergeDatabase.kdbx")));
QTRY_VERIFY(m_db != m_dbWidget->database());
m_db = m_dbWidget->database();
@@ -360,10 +344,8 @@ void TestGui::testAutoreloadDatabase()
// Test rejecting new file in autoreload
MessageBox::setNextAnswer(MessageBox::No);
- // Overwrite the current temp database with a new file
- QVERIFY(m_dbFile->open());
- QVERIFY(m_dbFile->write(unmodifiedMergeDatabase, static_cast<qint64>(unmodifiedMergeDatabase.size())));
- m_dbFile->close();
+ // Overwrite the current database with the temp data
+ QVERIFY(m_dbFile.copyFromFile(QString(KEEPASSX_TEST_DATA_DIR).append("/MergeDatabase.kdbx")));
// Ensure the merge did not take place
QCOMPARE(m_db->rootGroup()->findChildByName("General")->entries().size(), 0);
@@ -382,9 +364,7 @@ void TestGui::testAutoreloadDatabase()
// This is saying yes to merging the entries
MessageBox::setNextAnswer(MessageBox::Merge);
// Overwrite the current database with the temp data
- QVERIFY(m_dbFile->open());
- QVERIFY(m_dbFile->write(unmodifiedMergeDatabase, static_cast<qint64>(unmodifiedMergeDatabase.size())));
- m_dbFile->close();
+ QVERIFY(m_dbFile.copyFromFile(QString(KEEPASSX_TEST_DATA_DIR).append("/MergeDatabase.kdbx")));
QTRY_VERIFY(m_db != m_dbWidget->database());
m_db = m_dbWidget->database();
@@ -507,7 +487,7 @@ void TestGui::testEditEntry()
QVERIFY(okButton);
QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
titleEdit->setText("multiline\ntitle");
- editEntryWidget->findChild<QLineEdit*>("usernameEdit")->setText("multiline\nusername");
+ editEntryWidget->findChild<QComboBox*>("usernameComboBox")->lineEdit()->setText("multiline\nusername");
editEntryWidget->findChild<QLineEdit*>("passwordEdit")->setText("multiline\npassword");
editEntryWidget->findChild<QLineEdit*>("passwordRepeatEdit")->setText("multiline\npassword");
editEntryWidget->findChild<QLineEdit*>("urlEdit")->setText("multiline\nurl");
@@ -594,6 +574,10 @@ void TestGui::testAddEntry()
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
auto* titleEdit = editEntryWidget->findChild<QLineEdit*>("titleEdit");
QTest::keyClicks(titleEdit, "test");
+ auto* usernameComboBox = editEntryWidget->findChild<QComboBox*>("usernameComboBox");
+ QVERIFY(usernameComboBox);
+ QTest::mouseClick(usernameComboBox, Qt::LeftButton);
+ QTest::keyClicks(usernameComboBox, "AutocompletionUsername");
auto* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox");
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
@@ -602,17 +586,31 @@ void TestGui::testAddEntry()
Entry* entry = entryView->entryFromIndex(item);
QCOMPARE(entry->title(), QString("test"));
+ QCOMPARE(entry->username(), QString("AutocompletionUsername"));
QCOMPARE(entry->historyItems().size(), 0);
+ m_db->updateCommonUsernames();
+
// Add entry "something 2"
QTest::mouseClick(entryNewWidget, Qt::LeftButton);
QTest::keyClicks(titleEdit, "something 2");
+ QTest::mouseClick(usernameComboBox, Qt::LeftButton);
+ QTest::keyClicks(usernameComboBox, "Auto");
+ QTest::keyPress(usernameComboBox, Qt::Key_Right);
auto* passwordEdit = editEntryWidget->findChild<QLineEdit*>("passwordEdit");
auto* passwordRepeatEdit = editEntryWidget->findChild<QLineEdit*>("passwordRepeatEdit");
QTest::keyClicks(passwordEdit, "something 2");
QTest::keyClicks(passwordRepeatEdit, "something 2");
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
+ item = entryView->model()->index(1, 1);
+ entry = entryView->entryFromIndex(item);
+
+ QCOMPARE(entry->title(), QString("something 2"));
+ QCOMPARE(entry->username(), QString("AutocompletionUsername"));
+ QCOMPARE(entry->historyItems().size(), 0);
+
// Add entry "something 5" but click cancel button (does NOT add entry)
QTest::mouseClick(entryNewWidget, Qt::LeftButton);
QTest::keyClicks(titleEdit, "something 5");
@@ -1063,8 +1061,8 @@ void TestGui::testEntryPlaceholders()
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
auto* titleEdit = editEntryWidget->findChild<QLineEdit*>("titleEdit");
QTest::keyClicks(titleEdit, "test");
- QLineEdit* usernameEdit = editEntryWidget->findChild<QLineEdit*>("usernameEdit");
- QTest::keyClicks(usernameEdit, "john");
+ QComboBox* usernameComboBox = editEntryWidget->findChild<QComboBox*>("usernameComboBox");
+ QTest::keyClicks(usernameComboBox, "john");
QLineEdit* urlEdit = editEntryWidget->findChild<QLineEdit*>("urlEdit");
QTest::keyClicks(urlEdit, "{TITLE}.{USERNAME}");
auto* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox");
@@ -1261,9 +1259,8 @@ void TestGui::testDragAndDropKdbxFiles()
QCOMPARE(m_tabWidget->count(), openedDatabasesCount);
- const QString goodDatabaseFilePath(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"));
QMimeData goodMimeData;
- goodMimeData.setUrls({QUrl::fromLocalFile(goodDatabaseFilePath)});
+ goodMimeData.setUrls({QUrl::fromLocalFile(dbFileName)});
QDragEnterEvent goodDragEvent(QPoint(1, 1), Qt::LinkAction, &goodMimeData, Qt::LeftButton, Qt::NoModifier);
qApp->notify(m_mainWindow.data(), &goodDragEvent);
QCOMPARE(goodDragEvent.isAccepted(), true);
@@ -1280,6 +1277,94 @@ void TestGui::testDragAndDropKdbxFiles()
QTRY_COMPARE(m_tabWidget->count(), openedDatabasesCount);
}
+void TestGui::testSortGroups()
+{
+ auto* editGroupWidget = m_dbWidget->findChild<EditGroupWidget*>("editGroupWidget");
+ auto* nameEdit = editGroupWidget->findChild<QLineEdit*>("editName");
+ auto* editGroupWidgetButtonBox = editGroupWidget->findChild<QDialogButtonBox*>("buttonBox");
+
+ // Create some sub-groups
+ Group* rootGroup = m_db->rootGroup();
+ Group* internetGroup = rootGroup->findGroupByPath("Internet");
+ m_dbWidget->groupView()->setCurrentGroup(internetGroup);
+ m_dbWidget->createGroup();
+ QTest::keyClicks(nameEdit, "Google");
+ QTest::mouseClick(editGroupWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
+ m_dbWidget->groupView()->setCurrentGroup(internetGroup);
+ m_dbWidget->createGroup();
+ QTest::keyClicks(nameEdit, "eBay");
+ QTest::mouseClick(editGroupWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
+ m_dbWidget->groupView()->setCurrentGroup(internetGroup);
+ m_dbWidget->createGroup();
+ QTest::keyClicks(nameEdit, "Amazon");
+ QTest::mouseClick(editGroupWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
+ m_dbWidget->groupView()->setCurrentGroup(internetGroup);
+ m_dbWidget->createGroup();
+ QTest::keyClicks(nameEdit, "Facebook");
+ QTest::mouseClick(editGroupWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
+ m_dbWidget->groupView()->setCurrentGroup(rootGroup);
+
+ triggerAction("actionGroupSortAsc");
+ QList<Group*> children = rootGroup->children();
+ QCOMPARE(children[0]->name(), QString("eMail"));
+ QCOMPARE(children[1]->name(), QString("General"));
+ QCOMPARE(children[2]->name(), QString("Homebanking"));
+ QCOMPARE(children[3]->name(), QString("Internet"));
+ QCOMPARE(children[4]->name(), QString("Network"));
+ QCOMPARE(children[5]->name(), QString("Windows"));
+ QList<Group*> subChildren = internetGroup->children();
+ QCOMPARE(subChildren[0]->name(), QString("Amazon"));
+ QCOMPARE(subChildren[1]->name(), QString("eBay"));
+ QCOMPARE(subChildren[2]->name(), QString("Facebook"));
+ QCOMPARE(subChildren[3]->name(), QString("Google"));
+
+ triggerAction("actionGroupSortDesc");
+ children = rootGroup->children();
+ QCOMPARE(children[0]->name(), QString("Windows"));
+ QCOMPARE(children[1]->name(), QString("Network"));
+ QCOMPARE(children[2]->name(), QString("Internet"));
+ QCOMPARE(children[3]->name(), QString("Homebanking"));
+ QCOMPARE(children[4]->name(), QString("General"));
+ QCOMPARE(children[5]->name(), QString("eMail"));
+ subChildren = internetGroup->children();
+ QCOMPARE(subChildren[0]->name(), QString("Google"));
+ QCOMPARE(subChildren[1]->name(), QString("Facebook"));
+ QCOMPARE(subChildren[2]->name(), QString("eBay"));
+ QCOMPARE(subChildren[3]->name(), QString("Amazon"));
+
+ m_dbWidget->groupView()->setCurrentGroup(internetGroup);
+ triggerAction("actionGroupSortAsc");
+ children = rootGroup->children();
+ QCOMPARE(children[0]->name(), QString("Windows"));
+ QCOMPARE(children[1]->name(), QString("Network"));
+ QCOMPARE(children[2]->name(), QString("Internet"));
+ QCOMPARE(children[3]->name(), QString("Homebanking"));
+ QCOMPARE(children[4]->name(), QString("General"));
+ QCOMPARE(children[5]->name(), QString("eMail"));
+ subChildren = internetGroup->children();
+ QCOMPARE(subChildren[0]->name(), QString("Amazon"));
+ QCOMPARE(subChildren[1]->name(), QString("eBay"));
+ QCOMPARE(subChildren[2]->name(), QString("Facebook"));
+ QCOMPARE(subChildren[3]->name(), QString("Google"));
+
+ m_dbWidget->groupView()->setCurrentGroup(rootGroup);
+ triggerAction("actionGroupSortAsc");
+ m_dbWidget->groupView()->setCurrentGroup(internetGroup);
+ triggerAction("actionGroupSortDesc");
+ children = rootGroup->children();
+ QCOMPARE(children[0]->name(), QString("eMail"));
+ QCOMPARE(children[1]->name(), QString("General"));
+ QCOMPARE(children[2]->name(), QString("Homebanking"));
+ QCOMPARE(children[3]->name(), QString("Internet"));
+ QCOMPARE(children[4]->name(), QString("Network"));
+ QCOMPARE(children[5]->name(), QString("Windows"));
+ subChildren = internetGroup->children();
+ QCOMPARE(subChildren[0]->name(), QString("Google"));
+ QCOMPARE(subChildren[1]->name(), QString("Facebook"));
+ QCOMPARE(subChildren[2]->name(), QString("eBay"));
+ QCOMPARE(subChildren[3]->name(), QString("Amazon"));
+}
+
void TestGui::testTrayRestoreHide()
{
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h
index 532600bdc..b7798d0b2 100644
--- a/tests/gui/TestGui.h
+++ b/tests/gui/TestGui.h
@@ -69,6 +69,7 @@ private slots:
void testKeePass1Import();
void testDatabaseLocking();
void testDragAndDropKdbxFiles();
+ void testSortGroups();
void testTrayRestoreHide();
private:
@@ -90,8 +91,7 @@ private:
QPointer<DatabaseTabWidget> m_tabWidget;
QPointer<DatabaseWidget> m_dbWidget;
QSharedPointer<Database> m_db;
- QByteArray m_dbData;
- QScopedPointer<TemporaryFile> m_dbFile;
+ TemporaryFile m_dbFile;
QString m_dbFileName;
QString m_dbFilePath;
};
diff --git a/tests/gui/TestGuiBrowser.cpp b/tests/gui/TestGuiBrowser.cpp
new file mode 100644
index 000000000..834aea581
--- /dev/null
+++ b/tests/gui/TestGuiBrowser.cpp
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 "TestGuiBrowser.h"
+#include "TestGlobal.h"
+#include "gui/Application.h"
+
+#include <QAction>
+#include <QApplication>
+#include <QDebug>
+#include <QDialogButtonBox>
+#include <QLineEdit>
+#include <QListView>
+#include <QPlainTextEdit>
+#include <QPushButton>
+#include <QTableView>
+#include <QToolBar>
+
+#include "config-keepassx-tests.h"
+#include "core/Bootstrap.h"
+#include "core/Config.h"
+#include "core/Database.h"
+#include "core/Entry.h"
+#include "core/Tools.h"
+#include "crypto/Crypto.h"
+#include "gui/DatabaseTabWidget.h"
+#include "gui/DatabaseWidget.h"
+#include "gui/FileDialog.h"
+#include "gui/MessageBox.h"
+#include "gui/PasswordEdit.h"
+#include "gui/dbsettings/DatabaseSettingsDialog.h"
+#include "gui/entry/EditEntryWidget.h"
+#include "gui/entry/EntryView.h"
+
+QTEST_MAIN(TestGuiBrowser)
+
+void TestGuiBrowser::initTestCase()
+{
+ QVERIFY(Crypto::init());
+ Config::createTempFileInstance();
+ // Disable autosave so we can test the modified file indicator
+ config()->set("AutoSaveAfterEveryChange", false);
+ config()->set("AutoSaveOnExit", false);
+ // Enable the tray icon so we can test hiding/restoring the windowQByteArray
+ config()->set("GUI/ShowTrayIcon", true);
+ // Disable advanced settings mode (activate within individual tests to test advanced settings)
+ config()->set("GUI/AdvancedSettings", false);
+ // Disable the update check first time alert
+ config()->set("UpdateCheckMessageShown", true);
+
+ m_mainWindow.reset(new MainWindow());
+ Bootstrap::restoreMainWindowState(*m_mainWindow);
+ m_tabWidget = m_mainWindow->findChild<DatabaseTabWidget*>("tabWidget");
+ m_mainWindow->show();
+
+ // Load the NewDatabase.kdbx file into temporary storage
+ QFile sourceDbFile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabaseBrowser.kdbx"));
+ QVERIFY(sourceDbFile.open(QIODevice::ReadOnly));
+ QVERIFY(Tools::readAllFromDevice(&sourceDbFile, m_dbData));
+ sourceDbFile.close();
+}
+
+// Every test starts with opening the temp database
+void TestGuiBrowser::init()
+{
+ m_dbFile.reset(new TemporaryFile());
+ // Write the temp storage to a temp database file for use in our tests
+ QVERIFY(m_dbFile->open());
+ QCOMPARE(m_dbFile->write(m_dbData), static_cast<qint64>((m_dbData.size())));
+ m_dbFileName = QFileInfo(m_dbFile->fileName()).fileName();
+ m_dbFilePath = m_dbFile->fileName();
+ m_dbFile->close();
+
+ // make sure window is activated or focus tests may fail
+ m_mainWindow->activateWindow();
+ QApplication::processEvents();
+
+ fileDialog()->setNextFileName(m_dbFilePath);
+ triggerAction("actionDatabaseOpen");
+
+ auto* databaseOpenWidget = m_tabWidget->currentDatabaseWidget()->findChild<QWidget*>("databaseOpenWidget");
+ QVERIFY(databaseOpenWidget);
+ auto* editPassword = databaseOpenWidget->findChild<QLineEdit*>("editPassword");
+ QVERIFY(editPassword);
+ editPassword->setFocus();
+
+ QTest::keyClicks(editPassword, "a");
+ QTest::keyClick(editPassword, Qt::Key_Enter);
+
+ m_dbWidget = m_tabWidget->currentDatabaseWidget();
+ m_db = m_dbWidget->database();
+}
+
+// Every test ends with closing the temp database without saving
+void TestGuiBrowser::cleanup()
+{
+ // DO NOT save the database
+ m_db->markAsClean();
+ MessageBox::setNextAnswer(MessageBox::No);
+ triggerAction("actionDatabaseClose");
+ QApplication::processEvents();
+ MessageBox::setNextAnswer(MessageBox::NoButton);
+
+ if (m_dbWidget) {
+ delete m_dbWidget;
+ }
+
+ m_dbFile->remove();
+}
+
+void TestGuiBrowser::cleanupTestCase()
+{
+ m_dbFile->remove();
+}
+
+void TestGuiBrowser::testEntrySettings()
+{
+ // Enable the Browser Integration
+ config()->set("Browser/Enabled", true);
+
+ auto* toolBar = m_mainWindow->findChild<QToolBar*>("toolBar");
+ auto* entryView = m_dbWidget->findChild<EntryView*>("entryView");
+
+ entryView->setFocus();
+ QVERIFY(entryView->hasFocus());
+
+ // Select the first entry in the database
+ QModelIndex entryItem = entryView->model()->index(0, 1);
+ Entry* entry = entryView->entryFromIndex(entryItem);
+ clickIndex(entryItem, entryView, Qt::LeftButton);
+
+ auto* entryEditAction = m_mainWindow->findChild<QAction*>("actionEntryEdit");
+ QWidget* entryEditWidget = toolBar->widgetForAction(entryEditAction);
+ QTest::mouseClick(entryEditWidget, Qt::LeftButton);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
+ auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
+
+ // Switch to Properties page and select all rows from the custom data table
+ editEntryWidget->setCurrentPage(5);
+ auto customDataTableView = editEntryWidget->findChild<QTableView*>("customDataTable");
+ QVERIFY(customDataTableView);
+ QTest::mouseClick(customDataTableView, Qt::LeftButton);
+ QTest::keyClick(customDataTableView, 'a', Qt::ControlModifier);
+
+ // Remove the data
+ QCOMPARE(entry->customData()->size(), 2);
+ auto* removeButton = editEntryWidget->findChild<QPushButton*>("removeCustomDataButton");
+ QVERIFY(removeButton);
+ MessageBox::setNextAnswer(MessageBox::Delete);
+ QTest::mouseClick(removeButton, Qt::LeftButton);
+
+ // Apply the removal
+ auto* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox");
+ QVERIFY(editEntryWidgetButtonBox);
+ auto* okButton = editEntryWidgetButtonBox->button(QDialogButtonBox::Ok);
+ QVERIFY(okButton);
+ QTRY_VERIFY(okButton->isEnabled());
+ QTest::mouseClick(okButton, Qt::LeftButton);
+ QApplication::processEvents();
+
+ QCOMPARE(entry->customData()->size(), 0);
+}
+
+void TestGuiBrowser::testAdditionalURLs()
+{
+ auto* toolBar = m_mainWindow->findChild<QToolBar*>("toolBar");
+ auto* entryView = m_dbWidget->findChild<EntryView*>("entryView");
+
+ entryView->setFocus();
+ QVERIFY(entryView->hasFocus());
+
+ // Select the first entry in the database
+ QModelIndex entryItem = entryView->model()->index(0, 1);
+ clickIndex(entryItem, entryView, Qt::LeftButton);
+
+ auto* entryEditAction = m_mainWindow->findChild<QAction*>("actionEntryEdit");
+ QWidget* entryEditWidget = toolBar->widgetForAction(entryEditAction);
+ QTest::mouseClick(entryEditWidget, Qt::LeftButton);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
+ auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
+
+ // Switch to Browser Integration page and add three URL's
+ editEntryWidget->setCurrentPage(4);
+ auto* addURLButton = editEntryWidget->findChild<QPushButton*>("addURLButton");
+ QVERIFY(addURLButton);
+
+ auto* urlList = editEntryWidget->findChild<QListView*>("additionalURLsView");
+ QVERIFY(urlList);
+
+ QStringList testURLs = {"https://example1.com", "https://example2.com", "https://example3.com"};
+
+ for (const auto& url : testURLs) {
+ QTest::mouseClick(addURLButton, Qt::LeftButton);
+ QApplication::processEvents();
+ QTest::keyClicks(urlList->focusWidget(), url);
+ QTest::keyClick(urlList->focusWidget(), Qt::Key_Enter);
+ }
+
+ // Check the values from attributesEdit
+ editEntryWidget->setCurrentPage(1);
+ auto* attributesView = editEntryWidget->findChild<QListView*>("attributesView");
+ auto* attrTextEdit = editEntryWidget->findChild<QPlainTextEdit*>("attributesEdit");
+
+ // Go top of the list
+ attributesView->setFocus();
+ QTest::keyClick(attributesView->focusWidget(), Qt::Key_PageUp);
+
+ for (const auto& url : testURLs) {
+ QCOMPARE(attrTextEdit->toPlainText(), url);
+ QTest::keyClick(attributesView->focusWidget(), Qt::Key_Down);
+ }
+}
+
+void TestGuiBrowser::triggerAction(const QString& name)
+{
+ auto* action = m_mainWindow->findChild<QAction*>(name);
+ QVERIFY(action);
+ QVERIFY(action->isEnabled());
+ action->trigger();
+ QApplication::processEvents();
+}
+
+void TestGuiBrowser::clickIndex(const QModelIndex& index,
+ QAbstractItemView* view,
+ Qt::MouseButton button,
+ Qt::KeyboardModifiers stateKey)
+{
+ QTest::mouseClick(view->viewport(), button, stateKey, view->visualRect(index).center());
+}
diff --git a/tests/gui/TestGuiBrowser.h b/tests/gui/TestGuiBrowser.h
new file mode 100644
index 000000000..53a9c73c4
--- /dev/null
+++ b/tests/gui/TestGuiBrowser.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2011 Felix Geyer <debfx@fobos.de>
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * 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 KEEPASSXC_TESTGUIBROWSER_H
+#define KEEPASSXC_TESTGUIBROWSER_H
+
+#include "gui/MainWindow.h"
+#include "util/TemporaryFile.h"
+
+#include <QAbstractItemModel>
+#include <QObject>
+#include <QPointer>
+#include <QScopedPointer>
+#include <QSharedPointer>
+
+class Database;
+class DatabaseTabWidget;
+class DatabaseWidget;
+class QAbstractItemView;
+
+class TestGuiBrowser : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void init();
+ void cleanup();
+ void cleanupTestCase();
+
+ void testEntrySettings();
+ void testAdditionalURLs();
+
+private:
+ void triggerAction(const QString& name);
+ void clickIndex(const QModelIndex& index,
+ QAbstractItemView* view,
+ Qt::MouseButton button,
+ Qt::KeyboardModifiers stateKey = 0);
+
+ QScopedPointer<MainWindow> m_mainWindow;
+ QPointer<DatabaseTabWidget> m_tabWidget;
+ QPointer<DatabaseWidget> m_dbWidget;
+ QSharedPointer<Database> m_db;
+ QByteArray m_dbData;
+ QScopedPointer<TemporaryFile> m_dbFile;
+ QString m_dbFileName;
+ QString m_dbFilePath;
+};
+
+#endif // KEEPASSXC_TESTGUIBROWSER_H
diff --git a/tests/util/TemporaryFile.cpp b/tests/util/TemporaryFile.cpp
index 476313b02..19622faed 100644
--- a/tests/util/TemporaryFile.cpp
+++ b/tests/util/TemporaryFile.cpp
@@ -17,7 +17,7 @@
#include "TemporaryFile.h"
-#ifdef Q_OS_WIN
+#include <QTextStream>
TemporaryFile::TemporaryFile()
: TemporaryFile(nullptr)
@@ -47,9 +47,35 @@ TemporaryFile::TemporaryFile(const QString& templateName, QObject* parent)
tmp.close();
}
+TemporaryFile::~TemporaryFile()
+{
+ remove();
+}
+
bool TemporaryFile::open()
{
return QFile::open(QIODevice::ReadWrite);
}
-#endif
+bool TemporaryFile::copyFromFile(const QString& otherFileName)
+{
+ close();
+ if (!open(QFile::WriteOnly | QFile::Truncate)) {
+ return false;
+ }
+
+ QFile otherFile(otherFileName);
+ if (!otherFile.open(QFile::ReadOnly)) {
+ close();
+ return false;
+ }
+
+ QByteArray data;
+ while(!(data = otherFile.read(1024)).isEmpty()) {
+ write(data);
+ }
+
+ otherFile.close();
+ close();
+ return true;
+}
diff --git a/tests/util/TemporaryFile.h b/tests/util/TemporaryFile.h
index 1fca110a5..3c1cc6aa0 100644
--- a/tests/util/TemporaryFile.h
+++ b/tests/util/TemporaryFile.h
@@ -20,31 +20,20 @@
#include <QTemporaryFile>
-#ifdef Q_OS_WIN
-/**
- * QTemporaryFile does not actually close a file when close() is
- * called, which causes the file to be locked on Windows.
- * This class extends a QFile with the extra functionality
- * of a QTemporaryFile to circumvent this problem.
- */
class TemporaryFile : public QFile
-#else
-class TemporaryFile : public QTemporaryFile
-#endif
{
Q_OBJECT
-#ifdef Q_OS_WIN
public:
TemporaryFile();
explicit TemporaryFile(const QString& templateName);
explicit TemporaryFile(QObject* parent);
TemporaryFile(const QString& templateName, QObject* parent);
- ~TemporaryFile() override = default;
+ ~TemporaryFile() override;
using QFile::open;
bool open();
-#endif
+ bool copyFromFile(const QString& otherFileName);
};
#endif // KEEPASSXC_TEMPORARYFILE_H
diff --git a/utils/keepassx-kwallet b/utils/keepassxc-kdewallet
index e0cdcda5e..90a3eb73d 100755
--- a/utils/keepassx-kwallet
+++ b/utils/keepassxc-kdewallet
@@ -1,9 +1,11 @@
-#!/bin/bash
+#!/usr/bin/env bash
+# fetch KeePass database passwords from kdewallet
### change the path to suit your installation or set KDBX_SEARCH before calling ###
: ${KDBX_SEARCH:=~/.KeePass/*.kdbx}
-PROG="$(basename $0)"
+PROG="${0##*/}"
+KEEPASSXC=$(which -a keepassxc | sed -e "\\,$0,d" -e 'q')
function daemon_main {
# open kdewallet
@@ -12,16 +14,14 @@ function daemon_main {
sleep 1
done
- # fetch KeePass database passwords from kdewallet
declare -A DBs
- for DBPATH in $KDBX_SEARCH; do
- [[ -L "$DBPATH" ]] && DBPATH=$(readlink --canonicalize "$DBPATH")
- DBs[$DBPATH]=$(qdbus org.kde.kwalletd5 /modules/kwalletd5 org.kde.KWallet.readPassword "$handle" "Passwords" "$DBPATH" "$PROG")
+ for DBPATH in $(ls -r $KDBX_SEARCH); do
+ DBs[$(realpath $DBPATH)]=$(qdbus org.kde.kwalletd5 /modules/kwalletd5 org.kde.KWallet.readPassword "$handle" "Passwords" "${DBPATH##*/}" "$PROG")
done
- # launch keepassx
+ # launch real keepassxc
IFS=$'\n\n\n'
- keepassx --pw-stdin "${!DBs[@]}" <<<"${DBs[*]}" &
+ "$KEEPASSXC" --pw-stdin "${!DBs[@]}" <<<"${DBs[*]}" &
# done with kdewallet
qdbus org.kde.kwalletd5 /modules/kwalletd5 org.kde.KWallet.close "$handle" "false" "$PROG"
diff --git a/utils/keepassxc-keychain b/utils/keepassxc-keychain
new file mode 100755
index 000000000..625380d37
--- /dev/null
+++ b/utils/keepassxc-keychain
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# fetch KeePass database passwords from keychain
+
+### change the path to suit your installation or set KDBX_SEARCH before calling ###
+: ${KDBX_SEARCH:=~/.KeePass/*.kdbx}
+
+PROG="$(basename $0)"
+KeePassXC=$(ls -f {/usr/local,/Applications}/KeePassXC.app/Contents/MacOS/KeePassXC 2>/dev/null | head -1)
+
+function daemon_main {
+ declare -A DBs
+ for DBPATH in $KDBX_SEARCH; do
+ DBs[$(python -c "import os; print os.path.realpath('$DBPATH')")]=$(security find-generic-password -a $USER -s "${DBPATH##*/}" -w)
+ done
+
+ # launch keepassxc
+ IFS=$'\n\n\n'
+ $KeePassXC --pw-stdin "${!DBs[@]}" <<<"${DBs[*]}" &
+}
+
+if [[ '-d' = "$1" ]]; then
+ exec >&~/tmp/$PROG.log
+ set -vx
+ daemon_main
+else
+ cd /
+ daemon_main </dev/null >&/dev/null &
+ disown
+fi
diff --git a/utils/transifex_translators.py b/utils/transifex_translators.py
new file mode 100644
index 000000000..6c79c13d2
--- /dev/null
+++ b/utils/transifex_translators.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+import json
+import os
+
+# Download Transifex languages dump at: https://www.transifex.com/api/2/project/keepassxc/languages
+# Language information from https://www.wikiwand.com/en/List_of_ISO_639-1_codes and http://www.lingoes.net/en/translator/langcode.htm
+
+LANGS = {
+ "ar" : "العربية (Arabic)",
+ "bn" : "বাংলা (Bengali)",
+ "ca" : "català (Catalan)",
+ "cs" : "čeština (Czech)",
+ "da" : "dansk (Danish)",
+ "de" : "Deutsch (German)",
+ "el" : "ελληνικά (Greek)",
+ "en_GB" : "English (UK)",
+ "en_US" : "English (USA)",
+ "eo" : "Esperanto (Esperanto)",
+ "es" : "Español (Spanish)",
+ "et" : "eesti (Estonian)",
+ "eu" : "euskara (Basque)",
+ "fa" : "فارسی (Farsi)",
+ "fa_IR" : "فارسی (Farsi (Iran))",
+ "fi" : "suomi (Finnish)",
+ "fr" : "français (French)",
+ "gl" : "Galego (Galician)",
+ "he" : "עברית (Hebrew)",
+ "hr_HR" : "hrvatski jezik (Croatian)",
+ "hu" : "magyar (Hungarian)",
+ "id" : "Bahasa (Indonesian)",
+ "is_IS" : "Íslenska (Icelandic)",
+ "it" : "Italiano (Italian)",
+ "ja" : "日本語 (Japanese)",
+ "kk" : "қазақ тілі (Kazakh)",
+ "ko" : "한국어 (Korean)",
+ "la" : "latine (Latin)",
+ "lt" : "lietuvių kalba (Lithuanian)",
+ "lv" : "latviešu valoda (Latvian)",
+ "nb" : "Norsk Bokmål (Norwegian Bokmål)",
+ "nl_NL" : "Nederlands (Dutch)",
+ "my" : "ဗမာစာ (Burmese)",
+ "pa" : "ਪੰਜਾਬੀ (Punjabi)",
+ "pa_IN" : "ਪੰਜਾਬੀ (Punjabi (India))",
+ "pl" : "język polski (Polish)",
+ "pt" : "Português (Portuguese)",
+ "pt_BR" : "Português (Portuguese (Brazil))",
+ "pt_PT" : "Português (Portuguese (Portugal))",
+ "ro" : "Română (Romanian)",
+ "ru" : "русский (Russian)",
+ "sk" : "Slovenčina (Slovak)",
+ "sl_SI" : "Slovenščina (Slovenian)",
+ "sr" : "српски језик (Serbian)",
+ "sv" : "Svenska (Swedish)",
+ "th" : "ไทย (Thai)",
+ "tr" : "Türkçe (Turkish)",
+ "uk" : "Українська (Ukrainian)",
+ "zh_CN" : "中文 (Chinese (Simplified))",
+ "zh_TW" : "中文 (台灣) (Chinese (Traditional))",
+}
+
+TEMPLATE = "<li><strong>{0}</strong>: {1}</li>\n"
+
+if not os.path.exists("languages.json"):
+ print("Could not find 'languages.json' in current directory!")
+ print("Save the output from https://www.transifex.com/api/2/project/keepassxc/languages")
+ exit(0)
+
+with open("languages.json") as json_file:
+ output = open("translators.html", "w", encoding="utf-8")
+ languages = json.load(json_file)
+ for lang in languages:
+ code = lang["language_code"]
+ if code not in LANGS:
+ print("WARNING: Could not find language code:", code)
+ continue
+ translators = ", ".join(sorted(lang["reviewers"] + lang["translators"], key=str.casefold))
+ output.write(TEMPLATE.format(LANGS[code], translators))
+ output.close()
+ print("Language translators written to 'translators.html'!") \ No newline at end of file